summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/companion_tools.in10
-rw-r--r--scripts/build/companion_tools.sh38
-rw-r--r--scripts/build/companion_tools/050-make.sh54
-rw-r--r--scripts/build/companion_tools/100-m4.sh57
-rw-r--r--scripts/build/companion_tools/200-autoconf.sh33
-rw-r--r--scripts/build/companion_tools/300-automake.sh35
-rw-r--r--scripts/build/companion_tools/400-libtool.sh35
-rw-r--r--scripts/crosstool-NG.sh.in11
-rw-r--r--steps.mk1
9 files changed, 227 insertions, 47 deletions
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 <spawn.h> 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 \