Opened 21 months ago

Last modified 15 months ago

#57990 reopened defect

libxml2 @2.9.7_2: ICU include directory not in pkg-config output

Reported by: dsedivec Owned by: ryandesign (Ryan Schmidt)
Priority: Normal Milestone:
Component: ports Version: 2.5.4
Keywords: Cc: raimue (Rainer Müller), MarcusCalhoun-Lopez (Marcus Calhoun-Lopez), ryandesign (Ryan Schmidt), elfprince13 (Thomas Dickerson)
Port: libxml2

Description (last modified by ryandesign (Ryan Schmidt))

Since libxml2 now builds against ICU, I cannot build software against MacPorts libxml2 without manually including -I$prefix/include when building. Quick example:

$ command -v pkg-config
/opt/local/bin/pkg-config

$ cat repro.c
/* Include inspired by PostGIS's configure script: */
#include <libxml/tree.h>

int main() { return 0; }

$ clang $(pkg-config --cflags libxml-2.0) repro.c $(pkg-config --libs libxml-2.0)
In file included from repro.c:2:
In file included from /opt/local/include/libxml2/libxml/tree.h:1307:
In file included from /opt/local/include/libxml2/libxml/xmlmemory.h:218:
In file included from /opt/local/include/libxml2/libxml/threads.h:35:
In file included from /opt/local/include/libxml2/libxml/globals.h:18:
In file included from /opt/local/include/libxml2/libxml/parser.h:810:
/opt/local/include/libxml2/libxml/encoding.h:31:10: fatal error: 'unicode/ucnv.h' file not found
#include <unicode/ucnv.h>
         ^~~~~~~~~~~~~~~~
1 error generated.

$ clang -I/opt/local/include $(pkg-config --cflags libxml-2.0) repro.c $(pkg-config --libs libxml-2.0)

$ ls a.out
a.out*

After a brief conversation on IRC it was requested that I open a ticket for this, since the ICU cflags/libs flags should probably be included in pkg-config output for libxml-2.0 now. (It was also suggested that maybe this is really an upstream issue, rather than MacPorts.)

Change History (14)

comment:1 Changed 21 months ago by mf2k (Frank Schima)

Cc: MarcusCalhoun-Lopez added

Cc'ing committer of that change for possible comment.

comment:2 Changed 21 months ago by kencu (Ken)

Hi -- it would be most helpful if you could include your main.log and your configure.log files as well (please attach them to this ticket.

I get this:

checking for ICU... yes
Enabled Schemas/Relax-NG support
checking for printf... yes
checking for sprintf... yes

and the port builds right through to the end with icu support enabled.

So it's likely to be something on your system somewhere that is messing you up. The usual culprits are homebrew and anything you have installed in /usr/local.

comment:3 Changed 21 months ago by raimue (Rainer Müller)

This is not about building in MacPorts (therefore no main.log required), because with MacPorts ${prefix}/include would always be in the include path and this bug will not occur. This is about using libxml2 to compile software outside of MacPorts. The CFLAGS provided by pkg-config are insufficient as the libxml/*.h headers will try to include unicode/*.h and therefore the path to these headers also needs to be added to the pkg-config file.

comment:4 Changed 21 months ago by ryandesign (Ryan Schmidt)

Cc: ryandesign added
Description: modified (diff)

And just blindly adding -I${prefix}/include to libxml2's pkgconfig file can have other consequences. See how I fixed this issue for glib2 by patching glib2's header to #include the absolute path of the non-glib2 header it was requiring. I suggest doing something similar for libxml2: patching encoding.h so that it #includes the absolute path of ucnv.h.

comment:6 in reply to:  3 Changed 21 months ago by kencu (Ken)

Replying to raimue:

This is not about building in MacPorts (therefore no main.log required), because with MacPorts ${prefix}/include would always be in the include path and this bug will not occur. This is about using libxml2 to compile software outside of MacPorts. The CFLAGS provided by pkg-config are insufficient as the libxml/*.h headers will try to include unicode/*.h and therefore the path to these headers also needs to be added to the pkg-config file.

Ah, you're right, I didn't notice that.

Seems this exact same issue could easily afflict dozens or hundreds of MacPorts' ports? Any port that calls another ports' headers would be similarly affected by this.

Is it so rare that one-off fixes are the way to go?

comment:7 Changed 21 months ago by ryandesign (Ryan Schmidt)

Only ports whose normal include files are not in /opt/local/include.

comment:8 Changed 21 months ago by dsedivec

Sorry to potentially move the goalposts, but I've now noticed a similar problem with libs and thought maybe I should bring it up here:

$ pkg-config --libs libxml-2.0
-L/opt/local/lib -lxml2

$ xml2-config --libs
-L/opt/local/lib -lxml2 -L/opt/local/lib -lz -L/opt/local/lib -llzma -lpthread -liconv -L/opt/local/lib -licui18n -licuuc -licudata -lm

Note that xml2-config knows about the ICU libraries, but pkg-config doesn't. (--cflags is same for both pkg-config and xml2-config.)

This is making me wonder if I'm even supposed to be using pkg-config with libxml2?

comment:9 Changed 21 months ago by raimue (Rainer Müller)

The output of pkg-config is correct. The other libraries are not required for dynamic linking; only direct dependencies have to be given to the linker. If you add the --static flag, you will also see all the other libraries. I would recommend to use pkg-config as the output from xml2-config will lead to so called overlinking.

comment:10 Changed 20 months ago by elfprince13 (Thomas Dickerson)

Cc: elfprince13 added

comment:11 Changed 19 months ago by ryandesign (Ryan Schmidt)

Owner: set to ryandesign
Resolution: fixed
Status: newclosed

In dcef2c394d854e1cade1dd1a706039dc4929d2c4/macports-ports (master):

libxml2: Include iconv and icu by absolute path

Closes: #57990

comment:12 Changed 17 months ago by raybellis (Ray Bellis)

Resolution: fixed
Status: closedreopened

This fix is insufficient.

unicode/ucnv.h in turn does #include "unicode/uvnc_err.h" and some further includes which then also fail when /opt/local/include is not in the search path.

(found with icu @58.2_2, when trying to build BIND 9 from the ISC sources outside of the MacPorts system but using libraries provided by MacPorts).

comment:13 Changed 17 months ago by elfprince13 (Thomas Dickerson)

Just wanted to bump this and say that the fix actually made things worse in terms of the number of files that have problems.

comment:14 Changed 15 months ago by kiwiroy (Roy Storey)

Please see report at https://github.com/Perl5-Alien/Alien-Libxml2/issues/13

Alien::Libxml2 detects system libxml2 (macports provided here), but the tests fail for the reason Ray mentions.

As a fix locally I’ve modified the last line of libxml-2.0.pc to read.

Cflags: -I${includedir}/libxml2 -I${includedir}

I assume ports that depend port:libxml2 aren’t affected as they have includedir (/opt/local/include) in CFLAGS anyway.

Note: See TracTickets for help on using tickets.