pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pkg/26143: Darwin bootstrap: interference from /usr/local/include



>Number:         26143
>Category:       pkg
>Synopsis:       Darwin bootstrap: interference from /usr/local/include
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri Jul 02 20:06:01 UTC 2004
>Closed-Date:
>Last-Modified:
>Originator:     Jim Bernard
>Release:        pkgsrc as of Fri Jul  2 09:21:20 UTC 2004
>Organization:
>Environment:
Mac OS X 10.3.4
System: Mac OS X 10.3.4
Architecture: ppc
Machine: ppc
>Description:
        Apple's cpp checks for include files in /usr/local/include before
        checking "real" system directories (curiously, there doesn't seem
        to be an analogous issue with the linker).  I ran into a situation
        where someone had installed a copy of db4 in /usr/local, so that
        /usr/local/include/db.h overrode /usr/include/db.h, causing the
        pkgsrc bootstrap to fail (some symbols were not defined in the db4
        version).

        I believe this will also bite us in package builds.

>How-To-Repeat:
        On a Mac OS X 10.3 system:

          mkdir -p /usr/local/include
          touch /usr/local/include/db.h
          try to bootstrap pkgsrc---it fails when compiling pkgdb.c.

        (Note: this isn't what I did, but I assume it will exhibit
        a similar failure.)

        One can discover the final include path used by the compiler
        with "-v" (in gcc 3.3).  So, repeating the failed compilation by
        hand like:

          env -i PATH=/usr/bin:/bin:/usr/sbin:/sbin \
            gcc -v -E -H -DHAVE_CONFIG_H -DDEF_LOG_DIR=\"/usr/pkg/pkgdb\" \
            -DTAR_CMD=\"/usr/pkg/bin/tar\" -DFTP_CMD=\"/usr/pkg/bin/ftp\" \
            -I../libnbcompat -I../../libnbcompat -I. -I. -g -O2 -c pkgdb.c

        we find the final include path (after elimination of nonexistent
        directories) to be:

          ../../libnbcompat
          .
          /usr/local/include
          /usr/include/gcc/darwin/3.3
          /usr/include

        the last 3 being the system default directories (these are what
        you find when executing "gcc -v -E" on an empty source file).

          Also the "-H" gives a list of header files used, which in my case
        included the interfering /usr/local/include/db.h, instead of
        /usr/include/db.h.

>Fix:
        We can reconfigure the system include path sans /usr/local/include
        via the compiler flags:
          -nostdinc -isystem /usr/include/gcc/darwin/default -isystem 
/usr/include

        In the bootstrap patch below, I did this by introducing
        BSTRAP_CPPFLAGS into CPPFLAGS wherever it is explicitly specified
        in the script, with the former defined as above for Darwin.  I
        also added CPPFLAGS (with BSTRAP_CPPFLAGS incorporated) to the
        configure command for bmake, so the flags show up in CFLAGS in
        work/bmake/makefile.boot.  I think this should work on OS X 10.2
        (because of the use of "default" in the path name, instead of
        "3.3"---default is a link to the default compiler version on the
        system), but I haven't tested it.

        Given that this is a fairly general problem, it's probably best
        to add these flags to CPPFLAGS generally, so I've also included
        a patch for mods/mk/Darwin.sys.mk that adds them.  This wasn't
        necessary to fix my specific problem, but I believe it will be
        necessary for package builds.

        Note that because of the change to Darwin.sys.mk, once bmake
        is built and the .mk files constructed, it should only be
        necessary to add BSTRAP_CPPFLAGS wherever CPPFLAGS is explicitly
        specified in the bootstrap script, since the necessary flags
        should be picked up from the conditional assignment in sys.mk,
        unless an explicit specification overrides that in the script
        (well, really in the makefiles generated by the configure
        runs executed by the script).  The bootstrap script patch is
        constructed with that in mind.

--- bootstrap-dist      Mon May 10 21:05:37 2004
+++ bootstrap   Fri Jul  2 13:20:54 2004
@@ -199,6 +199,7 @@
        set_opsys=no
        check_prog mtreeprog mtree
        machine_arch=`uname -p`
+       BSTRAP_CPPFLAGS="-nostdinc -isystem /usr/include/gcc/darwin/default 
-isystem /usr/include ${BSTRAP_CPPFLAGS}"
        ;;
 FreeBSD)
        root_group=wheel
@@ -538,7 +539,7 @@
 fi
 
 echo_msg "Installing bmake"
-run_cmd "(cd $wrkdir/bmake; $shprog ./configure --prefix=$prefix 
--with-default-sys-path=$prefix/share/mk $configargs && make -f makefile.boot 
bootstrap && env BINDIR=$prefix/bin MANDIR=$prefix/man $BSTRAP_ENV ./bmake -f 
Makefile install)"
+run_cmd "(cd $wrkdir/bmake; CPPFLAGS="\'${BSTRAP_CPPFLAGS}\'" $shprog 
./configure --prefix=$prefix --with-default-sys-path=$prefix/share/mk 
$configargs && make -f makefile.boot bootstrap && env BINDIR=$prefix/bin 
MANDIR=$prefix/man $BSTRAP_ENV ./bmake -f Makefile install)"
 
 # build libnbcompat
 echo_msg "Building libnbcompat"
@@ -577,7 +578,7 @@
 case "$need_pax" in
 yes)   echo_msg "Installing pax"
        copy_src ../archivers/pax/files pax
-       run_cmd "(cd $wrkdir/pax; env $BSTRAP_ENV CPPFLAGS='-I../libnbcompat' 
LDFLAGS='-L../libnbcompat' LIBS='-lnbcompat' $shprog ./configure -C 
--prefix=$prefix --sysconfdir=$sysconfdir && $prefix/bin/bmake && 
$prefix/bin/bmake install)"
+       run_cmd "(cd $wrkdir/pax; env $BSTRAP_ENV CPPFLAGS="\'-I../libnbcompat 
${BSTRAP_CPPFLAGS}\'" LDFLAGS='-L../libnbcompat' LIBS='-lnbcompat' $shprog 
./configure -C --prefix=$prefix --sysconfdir=$sysconfdir && $prefix/bin/bmake 
&& $prefix/bin/bmake install)"
        echo "PAX=$prefix/bin/pax" >> ${MKCONF_EXAMPLE}
        pkg_install_args="$pkg_install_args --with-pax=$prefix/bin/pax 
--with-tar=$prefix/bin/tar"
        ;;
@@ -590,7 +591,7 @@
 case "$need_mtree" in
 yes)   echo_msg "Installing mtree"
        copy_src ../pkgtools/mtree/files mtree
-       run_cmd "(cd $wrkdir/mtree; env $BSTRAP_ENV CPPFLAGS='-I../libnbcompat' 
LDFLAGS='-L../libnbcompat' LIBS='-lnbcompat' $shprog ./configure -C 
--prefix=$prefix --sysconfdir=$sysconfdir && $prefix/bin/bmake && 
$prefix/bin/bmake install)"
+       run_cmd "(cd $wrkdir/mtree; env $BSTRAP_ENV 
CPPFLAGS="\'-I../libnbcompat ${BSTRAP_CPPFLAGS}\'" LDFLAGS='-L../libnbcompat' 
LIBS='-lnbcompat' $shprog ./configure -C --prefix=$prefix 
--sysconfdir=$sysconfdir && $prefix/bin/bmake && $prefix/bin/bmake install)"
        pkg_install_args="$pkg_install_args --with-mtree=$prefix/sbin/mtree"
        ;;
 *)     pkg_install_args="$pkg_install_args --with-mtree=$mtreeprog"
@@ -613,7 +614,7 @@
 if [ "$prefix" = "/usr" ]; then
        pkg_install_mandir="$prefix/share/man"
 fi
-run_cmd "(cd $wrkdir/pkg_install; env $BSTRAP_ENV CPPFLAGS='-I../libnbcompat 
-I../../libnbcompat' LDFLAGS='-L../libnbcompat -L../../libnbcompat' 
LIBS='-lnbcompat' $shprog ./configure -C --prefix=$prefix 
--sysconfdir=$sysconfdir --with-pkgdbdir=$pkgdbdir --mandir=$pkg_install_mandir 
$pkg_install_args && $prefix/bin/bmake && $prefix/bin/bmake install)"
+run_cmd "(cd $wrkdir/pkg_install; env $BSTRAP_ENV CPPFLAGS="\'-I../libnbcompat 
-I../../libnbcompat ${BSTRAP_CPPFLAGS}\'" LDFLAGS='-L../libnbcompat 
-L../../libnbcompat' LIBS='-lnbcompat' $shprog ./configure -C --prefix=$prefix 
--sysconfdir=$sysconfdir --with-pkgdbdir=$pkgdbdir --mandir=$pkg_install_mandir 
$pkg_install_args && $prefix/bin/bmake && $prefix/bin/bmake install)"
 
 # all's ready, install the man page
 echo_msg "Installing packages(7) man page"


--- mods/mk/Darwin.sys.mk-dist  Thu Mar 11 06:03:59 2004
+++ mods/mk/Darwin.sys.mk       Fri Jul  2 12:59:13 2004
@@ -46,7 +46,7 @@
 
 CPP?=          cpp
 NOLINT=                1
-CPPFLAGS?=
+CPPFLAGS?=     -nostdinc -isystem /usr/include/gcc/darwin/default -isystem 
/usr/include
 
 MK_DEP?=       mkdeps.sh -N
 
>Release-Note:
>Audit-Trail:
>Unformatted:



Home | Main Index | Thread Index | Old Index