backport incpth
authorH.Merijn Brand <h.m.brand@xs4all.nl>
Wed, 22 Jan 2014 11:04:43 +0000 (12:04 +0100)
committerH.Merijn Brand <h.m.brand@xs4all.nl>
Wed, 22 Jan 2014 11:04:43 +0000 (12:04 +0100)
U/modified/Findhdr.U
U/modified/libpth.U

index 6c7d3d1..7ab56f9 100644 (file)
 ?X: and it returns the full path of the include file and a zero status or an
 ?X: empty string with an error status if the file could not be located.
 ?X:
-?MAKE:Findhdr: grep test tr rm +usrinc awk cat startsh \
+?MAKE:Findhdr: grep test tr rm incpth awk cat startsh \
        cppstdin cppminus +cppflags osname
 ?MAKE: -pick add $@ %<
+?LINT:extern cppfilter
 ?LINT:define fieldn
 ?S:fieldn:
 ?S:    This variable is used internally by Configure. It contains the position
@@ -40,7 +41,7 @@
 ?S:.
 ?V:fieldn
 ?F:./findhdr !fieldn
-?T:cline pos wanted name awkprg usrincdir status cppfilter testaccess
+?T:cline pos wanted name awkprg usrincdir status testaccess
 : determine filename position in cpp output
 echo " "
 echo "Computing filename position in cpp output for #include directives..." >&4
@@ -78,11 +79,6 @@ case $fieldn in
 esac
 echo "Your cpp writes the filename in the $pos field of the line."
 
-case "$osname" in
-vos) cppfilter="tr '\\\\>' '/' |" ;; # path component separator is >
-os2) cppfilter="sed -e 's|\\\\\\\\|/|g' |" ;; # path component separator is \
-*)   cppfilter='' ;;
-esac
 ?X: To locate a header file, we cannot simply check for $usrinc/file.h, since
 ?X: some machine have the headers in weird places and our only hope is that
 ?X: the C pre-processor will know how to find those headers. Thank you NexT!
@@ -91,7 +87,7 @@ $cat >findhdr <<EOF
 $startsh
 wanted=\$1
 name=''
-for usrincdir in $usrinc
+for usrincdir in $incpth
 do
        if test -f \$usrincdir/\$wanted; then
                echo "\$usrincdir/\$wanted"
index 26992be..5c09f6c 100644 (file)
@@ -34,8 +34,9 @@
 ?X:
 ?X:    This unit initializes the path for C library lookup.
 ?X:
-?MAKE:libpth glibpth xlibpth plibpth loclibpth: \
-       usrinc incpath test cat Myread Oldconfig sysroot
+?MAKE:libpth glibpth xlibpth plibpth loclibpth incpth: \
+       usrinc incpath test cat Myread Oldconfig sysroot osname \
+       ccname echo cppstdin awk grep sed rm usecrosscompile
 ?MAKE: -pick add $@ %<
 ?S:libpth:
 ?S:    This variable holds the general path (space-separated) used to find
 ?S:    Its value is prepend to libpth. This variable takes care of special
 ?S:    machines, like the mips.  Usually, it should be empty.
 ?S:.
-?T: xxx dlist
-?LINT:use usrinc
+?S:incpth:
+?S:    This variable must precede the normal include path to get the
+?S:    right one, as in "$incpath/usr/include" or "$incpath/usr/lib".
+?S:    Value can be "" or "/bsd43" on mips.
+?S:.
+?T: xxx dlist i j croak
+?LINT:extern incpth
+?LINT:change usrinc
 ?INIT:: change the next line if compiling for Xenix/286 on Xenix/386
 ?INIT:xlibpth='/usr/lib/386 /lib/386'
 ?INIT:: Possible local library directories to search.
 ?INIT:: machines, like the mips.  Usually, it should be empty.
 ?INIT:plibpth=''
 ?INIT:
+?X:cppfilter is later used in Findhdr.U, but we not want to expose it to config.h
+?T:cppfilter
+: Adjust cppfilter for path component separator
+case "$osname" in
+vos) cppfilter="tr '\\\\>' '/' |" ;; # path component separator is >
+os2) cppfilter="sed -e 's|\\\\\\\\|/|g' |" ;; # path component separator is \
+*)   cppfilter='' ;;
+esac
+
+: Use gcc to determine libpth and incpth
+# If using gcc or clang, we can get better values for libpth, incpth
+# and usrinc directly from the compiler.
+# Note that ccname for clang is also gcc.
+case "$ccname" in
+    gcc)
+       $echo 'extern int foo;' > try.c
+       set X `$cppstdin -v try.c 2>&1 | $awk '/^#include </,/^End of search /'|$cppfilter $grep '/include'`
+       shift
+       if $test $# -gt 0; then
+           incpth="$incpth $*"
+           incpth="`$echo $incpth|$sed 's/^ //'`"
+           for i in $*; do
+               j="`$echo $i|$sed 's,/include$,/lib,'`"
+               if $test -d $j; then
+                   libpth="$libpth $j"
+               fi
+           done
+           libpth="`$echo $libpth|$sed 's/^ //'`"
+           for xxx in $libpth $loclibpth $plibpth $glibpth; do
+               if $test -d $xxx; then
+                   case " $libpth " in
+                   *" $xxx "*) ;;
+                   *) libpth="$libpth $xxx";;
+                   esac
+               fi
+           done
+       fi
+       $rm -f try.c
+       case "$usrinc" in
+       '') for i in $incpth; do
+               if $test -f $i/errno.h -a -f $i/stdio.h -a -f $i/time.h; then
+                   usrinc="$i"
+                   break
+               fi
+           done
+           ;;
+       esac
+
+       case "$usecrosscompile" in
+       $define|true|[yY]*)
+           case "$incpth" in
+               '') echo "Incpth not defined." >&4; croak=y ;;
+               *)  echo "Using incpth '$incpth'." >&4 ;;
+           esac
+           case "$libpth" in
+               '') echo "Libpth not defined." >&4; croak=y ;;
+               *)  echo "Using libpth '$libpth'." >&4 ;;
+           esac
+           case "$usrinc" in
+               '') echo "Usrinc not defined." >&4; croak=y ;;
+               *)  echo "Using usrinc $usrinc." >&4 ;;
+           esac
+           case "$croak" in
+               y)
+               if test "X$sysroot" = X; then
+                   echo "Cannot continue, aborting." >&4; exit 1
+               else
+                   echo "Cross-compiling using sysroot $sysroot, failing to guess inc/lib paths is not fatal" >&4
+               fi
+               ;;
+           esac
+           ;;
+       esac
+    ;;
+esac
+
+: Default value for incpth is just usrinc
+case "$incpth" in
+'') incpth="$usrinc";;
+esac
+
 : Set private lib path
 case "$plibpth" in
 '') if ./mips; then