diff options
| author | Mohammad Akhlaghi <mohammad@akhlaghi.org> | 2020-01-19 15:08:08 +0000 | 
|---|---|---|
| committer | Mohammad Akhlaghi <mohammad@akhlaghi.org> | 2020-01-19 15:08:08 +0000 | 
| commit | 852d996f8f5f1e5e0114dc82aaf33d81c725fb20 (patch) | |
| tree | 090e35ceaef018d4ba287369db1e4a97e5077475 /reproduce | |
| parent | 6ec4881a1bd19052db633adec3bedbac0f4bc21a (diff) | |
Better search for static C library at start of configuration
Until now, to see if a working static C library and `sys/cdefs.h' exist, we
were checking absolute locations like `/usr/include/sys/cdefs.h' or
`/usr/lib/libc.a' and `/usr/lib64/libc.a'. But this is not robust because
on different systems, they can be in different locations.
With this commit, we actually use `find' to find the location of `libc.a'
and use that to add elements to CPPFLAGS and LDFLAGS. This should fix the
problem on systems that have them on non-standard locations.
Diffstat (limited to 'reproduce')
| -rwxr-xr-x | reproduce/software/bash/configure.sh | 183 | 
1 files changed, 75 insertions, 108 deletions
| diff --git a/reproduce/software/bash/configure.sh b/reproduce/software/bash/configure.sh index 08f2609..0bb0917 100755 --- a/reproduce/software/bash/configure.sh +++ b/reproduce/software/bash/configure.sh @@ -819,42 +819,6 @@ static_build=no -# inform the user that the build process is starting -# ------------------------------------------------- -if [ $printnotice = yes ]; then -    tsec=10 -    cat <<EOF - -------------------------- -Building dependencies ... -------------------------- - -Necessary dependency programs and libraries will be built in $tsec sec. - -NOTE: the built software will NOT BE INSTALLED on your system (no root -access is required). They are only for local usage by this project. They -will be installed in: - -  $sdir/installed - -**TIP**: you can see which software is being installed at every moment with -the following command. See "Inspecting status" section of -'README-hacking.md' for more. In short, run it while the project is being -configured (in another terminal, but on this same directory: '`pwd`'): - -  $ while true; do echo; date; ls .build/software/build-tmp; sleep 1; done - -------------------------- - - -EOF -    sleep $tsec -fi - - - - -  # If we are on a Mac OS system  # ----------------------------  # @@ -869,6 +833,7 @@ if type otool > /dev/null 2>/dev/null; then      host_cc=1      on_mac_os=yes  else +    host_cc=0      on_mac_os=no  fi @@ -876,74 +841,33 @@ fi -# See if GCC can be built -# ----------------------- -# -# On some GNU/Linux distros, the C compiler is broken into `multilib' (for -# 32-bit and 64-bit support, with their own headers). On these systems, -# `/usr/include/sys/cdefs.h' and `/usr/lib/libc.a' are not available by -# default. So GCC will crash with different ugly errors! The only solution -# is that user manually installs the `multilib' part as root, before -# running the configure script. +# Necessary C library element positions +# -------------------------------------  # -# Note that `sys/cdefs.h' may be available in other directories (for -# example `/usr/include/x86_64-linux-gnu/') that are automatically included -# in an installed GCC. HOWEVER during the build of GCC, all those other -# directories are ignored. So even if they exist, they are useless. -gccwarning=0 -if [ $host_cc = 0 ]; then -    if ! [ -f /usr/include/sys/cdefs.h ]; then -        host_cc=1 -        gccwarning=1 -        cat <<EOF - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!         Warning        !!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -This system doesn't have '/usr/include/sys/cdefs.h'. Because of this, the -project can't build its custom GCC to ensure better reproducibility. We -strongly recommend installing the proper package (for your operating -system) that installs this necessary file. For example on some Debian-based -GNU/Linux distros, you need these two packages: 'gcc-multilib' and -'g++-multilib'. -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -EOF -    fi +# On some systems (in particular Debian-based OSs), the static C library +# and necessary headers in a non-standard place, and we can't build GCC. So +# we need to find them first. The `sys/cdefs.h' header is also in a +# similarly different location. +if [ x"$$on_mac_os" = xyes ]; then +    sys_libc_ldflags=; +else +    sys_libc_ldflags=$(find /lib* /usr/lib*/* -name "libc.a" \ +                           | sed -e's|/libc\.a||g' \ +                           | tr ' ' '\n' \ +                           | awk '{printf "-L%s ", $1}' ); +    sys_libc_cppflags=$(echo $sys_libc_ldflags \ +                            | tr ' ' '\n' \ +                            | sed -e's|-L|-I|' -e's|/lib/|/include/|' \ +                            | awk '!/\/lib/{printf "%s ", $1}' ); +    #echo "sys_libc_ldflags: $sys_libc_ldflags" +    #echo "sys_libc_cppflags: $sys_libc_cppflags" +    export LDFLAGS="$LDFLAGS $sys_libc_ldflags" +    export CPPFLAGS="$CPPFLAGS $sys_libc_cppflags" +fi -    if [ -f /usr/lib/libc.a ] || [ -f /usr/lib64/libc.a ]; then -        # This is just a place holder -        host_cc=$host_cc -    else -        host_cc=1 -        gccwarning=1 -        cat <<EOF -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!         Warning        !!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -This system doesn't have '/usr/lib/libc.a' or '/usr/lib64/libc.a'. Because -of this, the project can't build its custom GCC to ensure better -reproducibility. We recommend installing the proper package (for your -operating system) that installs this necessary file. - -Some possible solutions: -  1. On some Debian-based GNU/Linux distros, these two packages may fix the -     problem: 'gcc-multilib' and 'g++-multilib'. -  2. (BE CAREFUL!) If you have '/usr/lib/x86_64-linux-gnu' but don't have -     '/usr/lib64', then running the following command might fix this -     particular problem by making a symbolic link. -         $ sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64 -     After the configure script is finished, delete the link with 'rm -     /usr/lib64' (you won't need it any more as far as this project is -     concerned). -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -EOF -    fi -fi  # See if a link-able static C library exists  # ------------------------------------------ @@ -957,18 +881,22 @@ fi  # static C library, which is not always available on some GNU/Linux  # systems. Therefore we need to check this here. If we can't build a static  # PatchELF, we won't build any GCC either. -if [ $host_cc = 0 ]; then +if [ x"$host_cc" = x0 ]; then      testprog=$tmpblddir/test-c      testsource=$tmpblddir/test.c      echo; echo; echo "Checking if static C library is available...";      echo "#include <stdio.h>"                       > $testsource      echo "#include <stdlib.h>"                     >> $testsource -    echo "int main(void){printf(\"...yes\");"      >> $testsource +    echo "#include <sys/cdefs.h>"                  >> $testsource +    echo "int main(void){printf(\"...yes\n\");"    >> $testsource      echo "               return EXIT_SUCCESS;}"    >> $testsource -    if gcc $testsource -o$testprog -static -lc && $testprog; then +    cc_call="gcc $testsource $CPPFLAGS $LDFLAGS -o$testprog -static -lc" +    if $cc_call && $testprog; then +        gccwarning=0          good_static_libc=1          rm $testsource $testprog      else +        echo; echo "Compilation command:"; echo "$cc_call"          good_static_libc=0          rm $testsource          gccwarning=1 @@ -979,15 +907,18 @@ if [ $host_cc = 0 ]; then  !!!!!!!!!!!!!!!!!!!!!!         Warning        !!!!!!!!!!!!!!!!!!!!!!  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -A usable static C library ('libc.a', in any directory) cannot be linked in -the current settings of this system. Because of this we can't build a -static PatchELF, hence we can't build GCC. +A usable static C library ('libc.a', in any directory) cannot be linked, +and 'sys/cdefs.h' cannot be included with the current settings of this +system. Because of this we can't build a static PatchELF, hence we can't +build GCC.  If you have 'libc.a', but in a non-standard location (for example in -'/PATH/TO/STATIC/LIBC/libc.a'), please run this command, then re-configure -the project to fix this problem. +'/PATH/TO/STATIC/LIBC/libc.a' and '/PATH/TO/SYS/CDEFS_H/sys/cdefs.h'), +please run the commands below, then re-configure the project to fix this +problem.  export LDFLAGS="-L/PATH/TO/STATIC/LIBC \$LDFLAGS" +export CPPFLAGS="-I/PATH/TO/SYS/CDEFS_H \$LDFLAGS"  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -996,7 +927,7 @@ EOF  fi  # Print a warning if GCC is not meant to be built. -if [ $gccwarning = 1 ]; then +if [ x"$gccwarning" = x1 ]; then          cat <<EOF  PLEASE SEE THE WARNINGS ABOVE. @@ -1090,6 +1021,42 @@ fi +# inform the user that the build process is starting +# ------------------------------------------------- +if [ $printnotice = yes ]; then +    tsec=10 +    cat <<EOF + +------------------------- +Building dependencies ... +------------------------- + +Necessary dependency programs and libraries will be built in $tsec sec. + +NOTE: the built software will NOT BE INSTALLED on your system (no root +access is required). They are only for local usage by this project. They +will be installed in: + +  $sdir/installed + +**TIP**: you can see which software is being installed at every moment with +the following command. See "Inspecting status" section of +'README-hacking.md' for more. In short, run it while the project is being +configured (in another terminal, but on this same directory: '`pwd`'): + +  $ while true; do echo; date; ls .build/software/build-tmp; sleep 1; done + +------------------------- + + +EOF +    sleep $tsec +fi + + + + +  # Number of threads for basic builds  # ----------------------------------  # | 
