From e2b9a81da34023db468b61caecf1b4799016f174 Mon Sep 17 00:00:00 2001 From: "Yann E. MORIN\"" Date: Fri, 14 Oct 2011 22:44:24 +0200 Subject: [PATCH] scripts: check host features with host compiler Currently, we check host feature in ./configure. This works only for cross toolchains, but not for canadian toolchains. ./configure has absolutely no way to know what the host for the toolchain will be; only the build scripts know. So, move the headers & libraries checks from ./configure to the build scripts, early enough in the build, but not before we know the host compiler and other tools. Signed-off-by: "Yann E. MORIN" --- config/cc/gcc.in.2 | 3 +- config/debug/gdb.in.cross | 12 +------ config/debug/gdb.in.native | 4 --- config/toolchain.in | 15 +++----- configure | 70 +------------------------------------- scripts/crosstool-NG.sh.in | 13 +++++++ 6 files changed, 21 insertions(+), 96 deletions(-) diff --git a/config/cc/gcc.in.2 b/config/cc/gcc.in.2 index 641478df..35a1070f 100644 --- a/config/cc/gcc.in.2 +++ b/config/cc/gcc.in.2 @@ -44,9 +44,8 @@ config CC_STATIC_LIBSTDCXX bool prompt "Link libstdc++ statically into the gcc binary" default y - depends on CONFIGURE_static_link_ok - depends on CONFIGURE_has_static_libstdcxx depends on CC_GCC_4_4_or_later + select WANTS_STATIC_LINK help Newer gcc versions use the PPL library which is C++ code. Statically linking libstdc++ increases the likeliness that the gcc binary will diff --git a/config/debug/gdb.in.cross b/config/debug/gdb.in.cross index 633def38..d9e80d4b 100644 --- a/config/debug/gdb.in.cross +++ b/config/debug/gdb.in.cross @@ -3,18 +3,10 @@ config STATIC_TOOLCHAIN select GDB_CROSS_STATIC if GDB_CROSS -comment "Cross-gdb - disabled (requires expat; re-run ./configure to enable)" - depends on !CONFIGURE_has_expat - -comment "Static cross-gdb - disabled (requires static expat; re-run ./configure to enable)" - depends on STATIC_TOOLCHAIN && !CONFIGURE_has_static_expat - config GDB_CROSS bool prompt "Cross-gdb" default y - depends on CONFIGURE_has_expat - depends on !STATIC_TOOLCHAIN || CONFIGURE_has_static_expat select GDB_GDBSERVER if ! BARE_METAL help Build and install a cross-gdb for the target, to run on host. @@ -24,8 +16,7 @@ if GDB_CROSS config GDB_CROSS_STATIC bool prompt "Build a static cross gdb" - depends on CONFIGURE_static_link_ok - depends on CONFIGURE_has_static_expat + select WANTS_STATIC_LINK help A static cross gdb can be usefull if you debug on a machine that is not the one that is used to compile the toolchain. @@ -36,7 +27,6 @@ config GDB_CROSS_STATIC config GDB_CROSS_PYTHON bool prompt "Enable python scripting" - depends on CONFIGURE_has_python depends on ! GDB_CROSS_STATIC default y help diff --git a/config/debug/gdb.in.native b/config/debug/gdb.in.native index a4144b43..8d2159af 100644 --- a/config/debug/gdb.in.native +++ b/config/debug/gdb.in.native @@ -10,13 +10,9 @@ config GDB_NATIVE if GDB_NATIVE -config GDB_NATIVE_NO_STATIC - bool - config GDB_NATIVE_STATIC bool prompt "Build a static native gdb" - depends on ! GDB_NATIVE_NO_STATIC help In case you have trouble with dynamic loading of shared libraries, you will find that a static gdb comes in handy. diff --git a/config/toolchain.in b/config/toolchain.in index 5e45fc73..d034315a 100644 --- a/config/toolchain.in +++ b/config/toolchain.in @@ -46,20 +46,14 @@ config SYSROOT_DIR_PREFIX In fact, the sysroot path is constructed as: ${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/${CT_SYSROOT_NAME} -# In case we need to add more conditions to enable static -# toolchain, we'll be adding them here -config STATIC_TOOLCHAIN_POSSIBLE +config WANTS_STATIC_LINK bool - default y - depends on CONFIGURE_static_link_ok - depends on CONFIGURE_has_static_libstdcxx - # Add new deps here! :-) config STATIC_TOOLCHAIN bool prompt "Build Static Toolchain (EXPERIMENTAL)" depends on EXPERIMENTAL - depends on STATIC_TOOLCHAIN_POSSIBLE + select WANTS_STATIC_LINK help Build static host binaries. @@ -68,8 +62,9 @@ config STATIC_TOOLCHAIN you can say 'Y' here, and all the host tools will be linked statically. The impacted tools are: - - the GNU binutils - - the cross-gdb + - the cross-binutils (GNU binutils, elf2flt) + - the cross-compiler (gcc) + - the cross-debugger (gdb) The default is 'N', to build dynamicaly-linked host binaries. diff --git a/configure b/configure index 75d2b221..e9776dd9 100755 --- a/configure +++ b/configure @@ -534,36 +534,8 @@ case "${host}" in ;; esac -printf "Checking if static linking is possible... " -static_link_ok="" -case "${host}" in - Darwin) ;; - *) tmp=.static.tmp - if gcc -xc - -static -o "${tmp}" >/dev/null 2>&1 <<-_EOF_ - int main() { return 0; } - _EOF_ - then - static_link_ok="y" - fi - rm -f "${tmp}" - ;; -esac -if [ "${static_link_ok}" = "y" ]; then - static_link_ko="" - printf "yes\n" -else - static_link_ko="y" - printf "no\n" - printf " * An optional host feature is missing, some features will be disabled:\n" - printf " * - It will not be possible to statically link toolchain's binaries\n" -fi -add_to_kconfig_list static_link_ok - # Library checks -libs_exts="so dylib" -if [ "${static_link_ok}" = "y" ]; then - libs_exts="${libs_exts} a" -fi +libs_exts="so dylib a" ncurses_hdrs="ncurses/ncurses.h ncurses/curses.h ncurses.h curses.h" ncurses_libs="libncursesw libncurses libcurses" @@ -572,46 +544,6 @@ has_or_abort lib="${ncurses_libs}" \ inc="${ncurses_hdrs}" \ err="The 'ncurses' library is needed fo the menuconfig frontend" -has_or_abort lib="libstdc++" \ - lib_exts="${libs_exts}" \ - err="The 'libstdc++' library is needed to build gcc" - -# Yes, we may be checking twice for libstdc++.a -# The first is because we need one instance of libstdc++ (shared or static) -# because it is needed for PPL; the second is because the static version is -# required for static-linking, and if missing, the option is removed. -has_or_warn lib="libstdc++" \ - lib_exts="a" \ - err="static 'libstdc++' is needed to statically link the toolchain's executables" \ - kconfig=has_static_libstdcxx \ - skip="${static_link_ko}" - -has_or_warn inc="expat.h" \ - lib="libexpat" \ - lib_exts="${libs_exts}" \ - err="The 'expat' header file and library are needed to link cross-gdb's executables" \ - kconfig=has_expat - -# Yes, we may be checking twice for libexpat.a -# The first is because we need one instance of libexpat (shared or static) -# because it is needed for cross-gdb; the second is because the static version -# is required for static-linking, and if missing, the option is removed. -has_or_warn lib="libexpat" \ - lib_exts="a" \ - err="static 'expat' is needed to statically link cross-gdb's executables" \ - kconfig=has_static_expat \ - skip="${static_link_ko}" - -for v in 7 6 5 4; do - python_incs="${python_incs} python2.${v}/Python.h" - python_libs="${python_libs} libpython2.${v}" -done -has_or_warn inc="${python_incs}" \ - lib="${python_libs}" \ - lib_exts="${libs_exts}" \ - kconfig=has_python \ - err="The 'python' header file and library are needed for some features of cross-gdb" - #--------------------------------------------------------------------- # Compute the version string diff --git a/scripts/crosstool-NG.sh.in b/scripts/crosstool-NG.sh.in index 2a54a862..e70ff2a9 100644 --- a/scripts/crosstool-NG.sh.in +++ b/scripts/crosstool-NG.sh.in @@ -464,6 +464,19 @@ if [ -z "${CT_RESTART}" ]; then *) ;; esac + # Now we know our host and where to find the host tools, we can check + # if static link was requested, but only if it was requested + if [ "${CT_WANTS_STATIC_LINK}" = "y" ]; then + tmp="${CT_BUILD_DIR}/.static-test" + if ! "${CT_HOST}-gcc" -xc - -static -o "${tmp}" >/dev/null 2>&1 <<-_EOF_ + int main() { return 0; } + _EOF_ + then + CT_Abort "Static linking impossible on the host system '${CT_HOST}'" + fi + rm -f "${tmp}" + fi + # Help gcc CT_CFLAGS_FOR_HOST= [ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST+=" -pipe"