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" <yann.morin.1998@anciens.enib.fr>
This commit is contained in:
Yann E. MORIN" 2011-10-14 22:44:24 +02:00
parent 6e00f49ab4
commit e2b9a81da3
6 changed files with 21 additions and 96 deletions

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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.

70
configure vendored
View File

@ -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

View File

@ -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"