From cf86df688a8e7aeba28767ae0f841022a2e8347b Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Mon, 28 Nov 2016 16:55:22 -0800 Subject: Add 'companion tools for host' step. Signed-off-by: Alexey Neyman diff --git a/config/companion_tools.in b/config/companion_tools.in index ece3552..1df9802 100644 --- a/config/companion_tools.in +++ b/config/companion_tools.in @@ -24,7 +24,15 @@ config COMP_TOOLS If your system has older versions, we can build them for you, but you are strongly encouraged to update your system instead! -if COMP_TOOLS +config COMP_TOOLS_FOR_HOST + bool + prompt "Install companion tools for host" + help + Enable this option if you want to include the selected companion + tools into the final toolchain (rather than just using them + to build it). + +if COMP_TOOLS || COMP_TOOLS_FOR_HOST source "config.gen/companion_tools.in" endif diff --git a/scripts/build/companion_tools.sh b/scripts/build/companion_tools.sh index 923c293..415f3a2 100644 --- a/scripts/build/companion_tools.sh +++ b/scripts/build/companion_tools.sh @@ -29,9 +29,45 @@ do_companion_tools_extract() { done } -# Build the companion tools facilities +# Build the companion tools facilities for build do_companion_tools_for_build() { + # Skip out if: + # - native/cross, and companion tools were neither selected + # to be built, nor included in the final toolchain + # - canadian/cross-native, and companion tools were not + # selected to be built + case "${CT_TOOLCHAIN_TYPE}" in + native|cross) + if [ -z "${CT_COMP_TOOLS}${CT_COMP_TOOLS_FOR_HOST}" ]; then + return + fi + ;; + canadian|cross-native) + if [ -z "${CT_COMP_TOOLS}" ]; then + return + fi + ;; + esac for f in ${CT_COMP_TOOLS_FACILITY_LIST}; do do_companion_tools_${f}_for_build done } + +# Build the companion tools facilities for host +do_companion_tools_for_host() { + # For native/cross, build==host, and the tools were built + # earlier by do_companion_tools_for_build. + case "${CT_TOOLCHAIN_TYPE}" in + native|cross) + return + ;; + canadian|cross-native) + if [ -z "${CT_COMP_TOOLS_FOR_HOST}" ]; then + return + fi + ;; + esac + for f in ${CT_COMP_TOOLS_FACILITY_LIST}; do + do_companion_tools_${f}_for_host + done +} diff --git a/scripts/build/companion_tools/050-make.sh b/scripts/build/companion_tools/050-make.sh index 65e42ef..d8f6b66 100644 --- a/scripts/build/companion_tools/050-make.sh +++ b/scripts/build/companion_tools/050-make.sh @@ -12,22 +12,56 @@ do_companion_tools_make_extract() { } do_companion_tools_make_for_build() { - CT_DoStep EXTRA "Installing make" - mkdir -p "${CT_BUILD_DIR}/build-make" - CT_Pushd "${CT_BUILD_DIR}/build-make" + CT_DoStep EXTRA "Installing make for build" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-make-build" + do_make_backend \ + host=${CT_BUILD} \ + prefix="${CT_BUILD_COMPTOOLS_DIR}" \ + cflags="${CT_CFLAGS_FOR_BUILD}" \ + ldflags="${CT_LDFLAGS_FOR_BUILD}" + CT_Popd + if [ "${CT_MAKE_GMAKE_SYMLINK}" = "y" ]; then + CT_DoExecLog ALL ln -sv make "${CT_BUILD_COMPTOOLS_DIR}/bin/gmake" + fi + CT_EndStep +} + +do_companion_tools_make_for_host() { + CT_DoStep EXTRA "Installing make for host" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-make-host" + do_make_backend \ + host=${CT_HOST} \ + prefix="${CT_PREFIX_DIR}" \ + cflags="${CT_CFLAGS_FOR_HOST}" \ + ldflags="${CT_LDFLAGS_FOR_HOST}" + CT_Popd + if [ "${CT_MAKE_GMAKE_SYMLINK}" = "y" ]; then + CT_DoExecLog ALL ln -sv make "${CT_PREFIX_DIR}/bin/gmake" + fi + CT_EndStep +} + +do_make_backend() { + local host + local prefix + local cflags + local ldflags + + for arg in "$@"; do + eval "${arg// /\\ }" + done CT_DoLog EXTRA "Configuring make" - CT_DoExecLog CFG "${CT_SRC_DIR}/make-${CT_MAKE_VERSION}/configure" \ - --prefix="${CT_BUILDTOOLS_PREFIX_DIR}" + CT_DoExecLog CFG \ + CFLAGS="${cflags}" \ + LDFLAGS="${ldflags}" \ + "${CT_SRC_DIR}/make-${CT_MAKE_VERSION}/configure" \ + --host="${host}" \ + --prefix="${prefix}" CT_DoLog EXTRA "Building make" CT_DoExecLog ALL make CT_DoLog EXTRA "Installing make" CT_DoExecLog ALL make install - if [ "${CT_MAKE_GMAKE_SYMLINK}" = "y" ]; then - CT_DoExecLog ALL ln -sv make "${CT_BUILDTOOLS_PREFIX_DIR}/bin/gmake" - fi - CT_Popd - CT_EndStep } diff --git a/scripts/build/companion_tools/100-m4.sh b/scripts/build/companion_tools/100-m4.sh index 6300dd1..96cde39 100644 --- a/scripts/build/companion_tools/100-m4.sh +++ b/scripts/build/companion_tools/100-m4.sh @@ -11,20 +11,59 @@ do_companion_tools_m4_extract() { } do_companion_tools_m4_for_build() { - CT_DoStep EXTRA "Installing m4" - mkdir -p "${CT_BUILD_DIR}/build-m4" - CT_Pushd "${CT_BUILD_DIR}/build-m4" - + CT_DoStep EXTRA "Installing m4 for build" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-m4-build" + do_m4_backend \ + host=${CT_BUILD} \ + prefix="${CT_BUILD_COMPTOOLS_DIR}" \ + cflags="${CT_CFLAGS_FOR_BUILD}" \ + ldflags="${CT_LDFLAGS_FOR_BUILD}" + CT_Popd + CT_EndStep +} + +do_companion_tools_m4_for_host() { + CT_DoStep EXTRA "Installing m4 for host" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-m4-host" + do_m4_backend \ + host=${CT_HOST} \ + prefix="${CT_PREFIX_DIR}" \ + cflags="${CT_CFLAGS_FOR_HOST}" \ + ldflags="${CT_LDFLAGS_FOR_HOST}" + CT_Popd + CT_EndStep +} + +do_m4_backend() { + local host + local prefix + local cflags + local ldflags + + for arg in "$@"; do + eval "${arg// /\\ }" + done + + case "${host}" in + *-uclibc) + # uClibc has posix_spawn in librt, but m4 configure only + # searches in libc. This leads to a later failure when + # it includes system but expects a locally-built + # posix_spawn(). + ldflags="${ldflags} -lrt" + esac + CT_DoLog EXTRA "Configuring m4" CT_DoExecLog CFG \ - "${CT_SRC_DIR}/m4-${CT_M4_VERSION}/configure" \ - --prefix="${CT_BUILDTOOLS_PREFIX_DIR}" + CFLAGS="${cflags}" \ + LDFLAGS="${ldflags}" \ + "${CT_SRC_DIR}/m4-${CT_M4_VERSION}/configure" \ + --host="${host}" \ + --prefix="${prefix}" CT_DoLog EXTRA "Building m4" CT_DoExecLog ALL make - CT_DoLog EXTRA "Building m4" + CT_DoLog EXTRA "Installing m4" CT_DoExecLog ALL make install - CT_Popd - CT_EndStep } diff --git a/scripts/build/companion_tools/200-autoconf.sh b/scripts/build/companion_tools/200-autoconf.sh index 243e5d8..95b7115 100644 --- a/scripts/build/companion_tools/200-autoconf.sh +++ b/scripts/build/companion_tools/200-autoconf.sh @@ -12,25 +12,42 @@ do_companion_tools_autoconf_extract() { } do_companion_tools_autoconf_for_build() { - CT_DoStep EXTRA "Installing autoconf" - mkdir -p "${CT_BUILD_DIR}/build-autoconf" - CT_Pushd "${CT_BUILD_DIR}/build-autoconf" - + CT_DoStep EXTRA "Installing autoconf for build" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-autoconf-build" + do_autoconf_backend host=${CT_BUILD} prefix="${CT_BUILD_COMPTOOLS_DIR}" + CT_Popd + CT_EndStep +} + +do_companion_tools_autoconf_for_host() { + CT_DoStep EXTRA "Installing autoconf for host" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-autoconf-host" + do_autoconf_backend host=${CT_HOST} prefix="${CT_PREFIX_DIR}" + CT_Popd + CT_EndStep +} + +do_autoconf_backend() { + local host + local prefix + + for arg in "$@"; do + eval "${arg// /\\ }" + done + # Ensure configure gets run using the CONFIG_SHELL as configure seems to # have trouble when CONFIG_SHELL is set and /bin/sh isn't bash # For reference see: # http://www.gnu.org/software/autoconf/manual/autoconf.html#CONFIG_005fSHELL - CT_DoLog EXTRA "Configuring autoconf" CT_DoExecLog CFG ${CONFIG_SHELL} \ "${CT_SRC_DIR}/autoconf-${CT_AUTOCONF_VERSION}/configure" \ - --prefix="${CT_BUILDTOOLS_PREFIX_DIR}" + --host="${host}" \ + --prefix="${prefix}" CT_DoLog EXTRA "Building autoconf" CT_DoExecLog ALL make CT_DoLog EXTRA "Installing autoconf" CT_DoExecLog ALL make install - CT_Popd - CT_EndStep } diff --git a/scripts/build/companion_tools/300-automake.sh b/scripts/build/companion_tools/300-automake.sh index 9d1b6e8..85afaea 100644 --- a/scripts/build/companion_tools/300-automake.sh +++ b/scripts/build/companion_tools/300-automake.sh @@ -12,20 +12,37 @@ do_companion_tools_automake_extract() { } do_companion_tools_automake_for_build() { - CT_DoStep EXTRA "Installing automake" - mkdir -p "${CT_BUILD_DIR}/build-automake" - CT_Pushd "${CT_BUILD_DIR}/build-automake" - + CT_DoStep EXTRA "Installing automake for build" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-automake-build" + do_automake_backend host=${CT_BUILD} prefix="${CT_BUILD_COMPTOOLS_DIR}" + CT_Popd + CT_EndStep +} + +do_companion_tools_automake_for_host() { + CT_DoStep EXTRA "Installing automake for host" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-automake-host" + do_automake_backend host=${CT_HOST} prefix="${CT_PREFIX_DIR}" + CT_Popd + CT_EndStep +} + +do_automake_backend() { + local host + local prefix + + for arg in "$@"; do + eval "${arg// /\\ }" + done + CT_DoLog EXTRA "Configuring automake" - CT_DoExecLog CFG \ - "${CT_SRC_DIR}/automake-${CT_AUTOMAKE_VERSION}/configure" \ - --prefix="${CT_BUILDTOOLS_PREFIX_DIR}" + CT_DoExecLog CFG "${CT_SRC_DIR}/automake-${CT_AUTOMAKE_VERSION}/configure" \ + --host="${host}" \ + --prefix="${prefix}" CT_DoLog EXTRA "Building automake" CT_DoExecLog ALL make CT_DoLog EXTRA "Installing automake" CT_DoExecLog ALL make install - CT_Popd - CT_EndStep } diff --git a/scripts/build/companion_tools/400-libtool.sh b/scripts/build/companion_tools/400-libtool.sh index a139369..39aa204 100644 --- a/scripts/build/companion_tools/400-libtool.sh +++ b/scripts/build/companion_tools/400-libtool.sh @@ -12,20 +12,37 @@ do_companion_tools_libtool_extract() { } do_companion_tools_libtool_for_build() { - CT_DoStep EXTRA "Installing libtool" - mkdir -p "${CT_BUILD_DIR}/build-libtool" - CT_Pushd "${CT_BUILD_DIR}/build-libtool" - + CT_DoStep EXTRA "Installing libtool for build" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-libtool-build" + do_libtool_backend host=${CT_BUILD} prefix="${CT_BUILD_COMPTOOLS_DIR}" + CT_Popd + CT_EndStep +} + +do_companion_tools_libtool_for_host() { + CT_DoStep EXTRA "Installing libtool for host" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-libtool-host" + do_libtool_backend host=${CT_HOST} prefix="${CT_PREFIX_DIR}" + CT_Popd + CT_EndStep +} + +do_libtool_backend() { + local host + local prefix + + for arg in "$@"; do + eval "${arg// /\\ }" + done + CT_DoLog EXTRA "Configuring libtool" - CT_DoExecLog CFG \ - "${CT_SRC_DIR}/libtool-${CT_LIBTOOL_VERSION}/configure" \ - --prefix="${CT_BUILDTOOLS_PREFIX_DIR}" + CT_DoExecLog CFG "${CT_SRC_DIR}/libtool-${CT_LIBTOOL_VERSION}/configure" \ + --host="${host}" \ + --prefix="${prefix}" CT_DoLog EXTRA "Building libtool" CT_DoExecLog ALL make CT_DoLog EXTRA "Installing libtool" CT_DoExecLog ALL make install - CT_Popd - CT_EndStep } diff --git a/scripts/crosstool-NG.sh.in b/scripts/crosstool-NG.sh.in index bb72069..063162d 100644 --- a/scripts/crosstool-NG.sh.in +++ b/scripts/crosstool-NG.sh.in @@ -185,12 +185,23 @@ CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state" # sub-dir. So we won't have to save/restore it, not even create it. # In case of cross or native, host-complibs are used for build-complibs; # in case of canadian or cross-native, host-complibs are specific +# Note about BUILD_COMPTOOLS_DIR: if installing companion tools for "host" in +# a native or simple cross, we can can use the same binaries we built for +# "build". However, we need companion tools for "build" early - as other +# components may depend on them - so we may skip building for "host" rather +# than for "build" in that case. case "${CT_TOOLCHAIN_TYPE}" in native|cross) CT_HOST_COMPLIBS_DIR="${CT_BUILDTOOLS_PREFIX_DIR}" + if [ -n "${CT_COMP_TOOLS_FOR_HOST}" ]; then + CT_BUILD_COMPTOOLS_DIR="${CT_PREFIX_DIR}" + else + CT_BUILD_COMPTOOLS_DIR="${CT_BUILDTOOLS_PREFIX_DIR}" + fi ;; canadian|cross-native) CT_HOST_COMPLIBS_DIR="${CT_BUILDTOOLS_PREFIX_DIR}/complibs-host" + CT_BUILD_COMPTOOLS_DIR="${CT_BUILDTOOLS_PREFIX_DIR}" ;; esac diff --git a/steps.mk b/steps.mk index 67024ab..e3c4874 100644 --- a/steps.mk +++ b/steps.mk @@ -22,6 +22,7 @@ CT_STEPS := \ companion_tools_for_build \ companion_libs_for_build \ binutils_for_build \ + companion_tools_for_host \ companion_libs_for_host \ binutils_for_host \ cc_core_pass_1 \ -- cgit v0.10.2-6-g49f6