mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-23 14:42:26 +00:00
commit
8a4870c2f8
@ -41,7 +41,7 @@ env:
|
||||
- CT_SAMPLE=armeb-unknown-linux-gnueabi
|
||||
- CT_SAMPLE=arm-unknown-linux-musleabi
|
||||
- CT_SAMPLE=aarch64-unknown-linux-gnueabi
|
||||
- CT_SAMPLE=mips64el-n64-linux-uclibc
|
||||
- CT_SAMPLE=mips64el-multilib-linux-uclibc
|
||||
- CT_SAMPLE=powerpc-e500v2-linux-gnuspe
|
||||
- CT_SAMPLE=x86_64-unknown-linux-uclibc
|
||||
- CT_SAMPLE=xtensa-unknown-linux-uclibc
|
||||
|
@ -7,7 +7,7 @@ choice
|
||||
config ARCH_mips_o32
|
||||
bool
|
||||
prompt "o32"
|
||||
depends on ARCH_32
|
||||
depends on (ARCH_32 || MULTILIB)
|
||||
help
|
||||
This is the -mabi=32 gcc option.
|
||||
|
||||
|
@ -226,7 +226,7 @@ config CC_GCC_HAS_LNK_HASH_STYLE
|
||||
bool
|
||||
|
||||
# Only enable gcc's support for plugins if binutils has it as well
|
||||
# They are usefull only when doing LTO, but it does no harm enabling
|
||||
# They are useful only when doing LTO, but it does no harm enabling
|
||||
# them even without LTO.
|
||||
config CC_GCC_ENABLE_PLUGINS
|
||||
bool
|
||||
|
@ -21,7 +21,7 @@ config GDB_CROSS_STATIC
|
||||
depends on CONFIGURE_has_static_link
|
||||
select WANTS_STATIC_LINK
|
||||
help
|
||||
A static cross gdb can be usefull if you debug on a machine that is
|
||||
A static cross gdb can be useful if you debug on a machine that is
|
||||
not the one that is used to compile the toolchain.
|
||||
|
||||
That way, you can share the cross-gdb without installing a toolchain
|
||||
|
@ -55,16 +55,6 @@ config LIBC_GLIBC_EXTRA_CFLAGS
|
||||
help
|
||||
Extra target CFLAGS to use when building.
|
||||
|
||||
config LIBC_EXTRA_CC_ARGS
|
||||
string
|
||||
prompt "gcc extra flags"
|
||||
default ""
|
||||
help
|
||||
Extra flags to pass gcc when building.
|
||||
|
||||
Seldom used, except for sparc64 which seems to need the flag -64
|
||||
to be passed onto gcc.
|
||||
|
||||
config LIBC_ENABLE_FORTIFIED_BUILD
|
||||
bool
|
||||
prompt "Enable fortified build (EXPERIMENTAL)"
|
||||
|
@ -4,10 +4,10 @@
|
||||
##
|
||||
## help Do not use a C library.
|
||||
## help
|
||||
## help This is usefull if your project is self-contained, does not rely on
|
||||
## help This is useful if your project is self-contained, does not rely on
|
||||
## help an external C library, and provides all the necessary bits.
|
||||
## help
|
||||
## help Most probably usefull to bootloaders, as they generally don't depend
|
||||
## help Most probably useful to bootloaders, as they generally don't depend
|
||||
## help on the C library.
|
||||
## help
|
||||
## help If unsure: do *not* choose that, and use another option in the choice.
|
||||
|
@ -129,13 +129,13 @@ config LIBC_UCLIBC_VERBOSITY_0
|
||||
|
||||
config LIBC_UCLIBC_VERBOSITY_1
|
||||
bool
|
||||
prompt "Brief build (show defines, ld flags)"
|
||||
prompt "Very verbose build"
|
||||
help
|
||||
Print simplified command lines.
|
||||
|
||||
config LIBC_UCLIBC_VERBOSITY_2
|
||||
bool
|
||||
prompt "Very verbose build"
|
||||
prompt "Brief build (show defines, ld flags)"
|
||||
help
|
||||
Print full command lines.
|
||||
|
||||
|
@ -65,9 +65,13 @@ config ARCH_REQUIRES_MULTILIB
|
||||
bool
|
||||
select MULTILIB
|
||||
|
||||
# Multilib requires 1st core pass (i.e., pass without building libgcc)
|
||||
# to determine which target cflags vary with multilib and which must be
|
||||
# passed from the arch configuration.
|
||||
config MULTILIB
|
||||
bool
|
||||
prompt "Build a multilib toolchain (READ HELP!!!)"
|
||||
select CC_CORE_PASS_1_NEEDED
|
||||
help
|
||||
If you say 'y' here, then the toolchain will also contain the C library
|
||||
optimised for some variants of the selected architecture, besides the
|
||||
|
28
patches/gcc/5.3.0/910-nios2-bad-multilib-default.patch
Normal file
28
patches/gcc/5.3.0/910-nios2-bad-multilib-default.patch
Normal file
@ -0,0 +1,28 @@
|
||||
diff -urpN gcc-5.3.0.orig/gcc/config/nios2/nios2.h gcc-5.3.0/gcc/config/nios2/nios2.h
|
||||
--- gcc-5.3.0.orig/gcc/config/nios2/nios2.h 2016-04-18 10:32:41.046254061 -0700
|
||||
+++ gcc-5.3.0/gcc/config/nios2/nios2.h 2016-04-18 10:37:25.998841674 -0700
|
||||
@@ -55,11 +55,11 @@
|
||||
#if TARGET_ENDIAN_DEFAULT == 0
|
||||
# define ASM_SPEC "%{!meb:-EL} %{meb:-EB}"
|
||||
# define LINK_SPEC_ENDIAN "%{!meb:-EL} %{meb:-EB}"
|
||||
-# define MULTILIB_DEFAULTS { "EL" }
|
||||
+# define MULTILIB_DEFAULTS { "mel" }
|
||||
#else
|
||||
# define ASM_SPEC "%{!mel:-EB} %{mel:-EL}"
|
||||
# define LINK_SPEC_ENDIAN "%{!mel:-EB} %{mel:-EL}"
|
||||
-# define MULTILIB_DEFAULTS { "EB" }
|
||||
+# define MULTILIB_DEFAULTS { "meb" }
|
||||
#endif
|
||||
|
||||
#define LINK_SPEC LINK_SPEC_ENDIAN \
|
||||
diff -urpN gcc-5.3.0.orig/gcc/config/nios2/t-nios2 gcc-5.3.0/gcc/config/nios2/t-nios2
|
||||
--- gcc-5.3.0.orig/gcc/config/nios2/t-nios2 2016-04-18 10:32:41.046254061 -0700
|
||||
+++ gcc-5.3.0/gcc/config/nios2/t-nios2 2016-04-18 10:36:41.091312157 -0700
|
||||
@@ -22,6 +22,5 @@
|
||||
# MULTILIB_DIRNAMES = nomul mulx fpu-60-1 fpu-60-2
|
||||
# MULTILIB_EXCEPTIONS =
|
||||
|
||||
-# MULTILIB_OPTIONS += EL/EB
|
||||
+# MULTILIB_OPTIONS += mel/meb
|
||||
# MULTILIB_DIRNAMES += le be
|
||||
-# MULTILIB_MATCHES += EL=mel EB=meb
|
18
samples/arm-multilib-linux-uclibcgnueabi/crosstool.config
Normal file
18
samples/arm-multilib-linux-uclibcgnueabi/crosstool.config
Normal file
@ -0,0 +1,18 @@
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_FLOAT_SW=y
|
||||
CT_ARCH_arm=y
|
||||
CT_MULTILIB=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
||||
CT_BINUTILS_LINKER_LD_GOLD=y
|
||||
CT_BINUTILS_GOLD_THREADS=y
|
||||
CT_BINUTILS_LD_WRAPPER=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_LIBC_uClibc=y
|
||||
CT_THREADS_NONE=y
|
||||
CT_CC_GCC_MULTILIB_LIST="aprofile"
|
||||
CT_DEBUG_dmalloc=y
|
||||
CT_DEBUG_ltrace=y
|
||||
CT_DEBUG_strace=y
|
3
samples/arm-multilib-linux-uclibcgnueabi/reported.by
Normal file
3
samples/arm-multilib-linux-uclibcgnueabi/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for ARM/uClibc-ng."
|
@ -5,7 +5,8 @@ CT_ARCH_LE=y
|
||||
CT_ARCH_64=y
|
||||
CT_ARCH_FLOAT_SW=y
|
||||
CT_ARCH_mips=y
|
||||
CT_TARGET_VENDOR="n32"
|
||||
CT_MULTILIB=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_LIBC_uClibc=y
|
3
samples/mips64el-multilib-linux-uclibc/reported.by
Normal file
3
samples/mips64el-multilib-linux-uclibc/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for MIPS/uClibc-ng."
|
@ -1,3 +0,0 @@
|
||||
reporter_name="Yann E. MORIN"
|
||||
reporter_url="http://ymorin.is-a-geek.org/projects/crosstool"
|
||||
reporter_comment="EXPERIMENTAL MIPS-64 n32 toolchain."
|
@ -1,15 +0,0 @@
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_LE=y
|
||||
CT_ARCH_64=y
|
||||
CT_ARCH_FLOAT_SW=y
|
||||
CT_ARCH_mips=y
|
||||
CT_ARCH_mips_n64=y
|
||||
CT_TARGET_VENDOR="n64"
|
||||
CT_KERNEL_linux=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_LIBC_uClibc=y
|
||||
CT_LIBC_UCLIBC_WCHAR=y
|
||||
CT_CC_GCC_mips_plt=y
|
||||
CT_CC_LANG_CXX=y
|
@ -1,3 +0,0 @@
|
||||
reporter_name="Yann E. MORIN"
|
||||
reporter_url="http://ymorin.is-a-geek.org/projects/crosstool"
|
||||
reporter_comment="EXPERIMENTAL MIPS-64 n64 toolchain."
|
20
samples/mipsel-multilib-linux-gnu/crosstool.config
Normal file
20
samples/mipsel-multilib-linux-gnu/crosstool.config
Normal file
@ -0,0 +1,20 @@
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_LE=y
|
||||
CT_ARCH_FLOAT_SW=y
|
||||
CT_ARCH_mips=y
|
||||
CT_MULTILIB=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_CC_GCC_CORE_EXTRA_CONFIG_ARRAY="--enable-targets=all"
|
||||
CT_CC_GCC_EXTRA_CONFIG_ARRAY="--enable-targets=all"
|
||||
CT_CC_GCC_mips_plt=y
|
||||
CT_CC_LANG_CXX=y
|
||||
CT_DEBUG_dmalloc=y
|
||||
CT_DEBUG_duma=y
|
||||
CT_DEBUG_gdb=y
|
||||
# CT_GDB_CROSS_PYTHON is not set
|
||||
CT_GDB_NATIVE=y
|
||||
CT_DEBUG_strace=y
|
3
samples/mipsel-multilib-linux-gnu/reported.by
Normal file
3
samples/mipsel-multilib-linux-gnu/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for MIPS/glibc."
|
13
samples/powerpc64-multilib-linux-gnu/crosstool.config
Normal file
13
samples/powerpc64-multilib-linux-gnu/crosstool.config
Normal file
@ -0,0 +1,13 @@
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_64=y
|
||||
CT_ARCH_powerpc=y
|
||||
CT_MULTILIB=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_CC_LANG_CXX=y
|
||||
CT_DEBUG_gdb=y
|
||||
# CT_GDB_CROSS_PYTHON is not set
|
||||
CT_GDB_NATIVE=y
|
3
samples/powerpc64-multilib-linux-gnu/reported.by
Normal file
3
samples/powerpc64-multilib-linux-gnu/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for PowerPC/glibc."
|
@ -186,6 +186,7 @@ $(CT_SAMPLES): config_files
|
||||
__comma = ,
|
||||
prefix_dir = $(CT_PREFIX)/$(subst $(__comma),=,$(1))
|
||||
host_triplet = $(if $(findstring $(__comma),$(1)),$(firstword $(subst $(__comma), ,$(1))))
|
||||
target_triplet = $(if $(findstring $(__comma),$(1)),$(word 2,$(subst $(__comma), ,$(1))),$(1))
|
||||
|
||||
# Create the rule to build a sample
|
||||
# $1: sample name (target tuple, or host/target tuples separated by a comma)
|
||||
@ -212,7 +213,8 @@ define build_sample
|
||||
fi; \
|
||||
printf '\r %-5s %s\n' $$status '$(1)'; \
|
||||
mkdir -p .build-all/$$status/$(1); \
|
||||
bzip2 < build.log > .build-all/$$status/$(1)/build.log.bz2
|
||||
bzip2 < build.log > .build-all/$$status/$(1)/build.log.bz2; \
|
||||
[ "$$status" = PASS -a -z "$(CT_PRESERVE_PASSED_BUILDS)" ] && rm -rf .build/$(call target_triplet,$(1)) || :
|
||||
endef
|
||||
|
||||
# ----------------------------------------------------------
|
||||
|
13
samples/sh4-multilib-linux-gnu/crosstool.config
Normal file
13
samples/sh4-multilib-linux-gnu/crosstool.config
Normal file
@ -0,0 +1,13 @@
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_sh=y
|
||||
CT_ARCH_SH_SH4=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_CC_GCC_V_4_9_3=y
|
||||
CT_CC_GCC_MULTILIB_LIST="m4,m4a"
|
||||
CT_CC_LANG_CXX=y
|
||||
CT_DEBUG_gdb=y
|
||||
# CT_GDB_CROSS_PYTHON is not set
|
3
samples/sh4-multilib-linux-gnu/reported.by
Normal file
3
samples/sh4-multilib-linux-gnu/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for SuperH/glibc."
|
14
samples/sh4-multilib-linux-uclibc/crosstool.config
Normal file
14
samples/sh4-multilib-linux-uclibc/crosstool.config
Normal file
@ -0,0 +1,14 @@
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_sh=y
|
||||
CT_ARCH_SH_SH4=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_LIBC_uClibc=y
|
||||
CT_CC_GCC_V_4_9_3=y
|
||||
CT_CC_GCC_MULTILIB_LIST="m4,m4a,m3"
|
||||
CT_CC_LANG_CXX=y
|
||||
CT_DEBUG_gdb=y
|
||||
# CT_GDB_CROSS_PYTHON is not set
|
3
samples/sh4-multilib-linux-uclibc/reported.by
Normal file
3
samples/sh4-multilib-linux-uclibc/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for SuperH/uClibc."
|
8
samples/sparc64-multilib-linux-gnu/crosstool.config
Normal file
8
samples/sparc64-multilib-linux-gnu/crosstool.config
Normal file
@ -0,0 +1,8 @@
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_64=y
|
||||
CT_ARCH_sparc=y
|
||||
CT_MULTILIB=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
3
samples/sparc64-multilib-linux-gnu/reported.by
Normal file
3
samples/sparc64-multilib-linux-gnu/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for SPARC/glibc."
|
17
samples/x86_64-multilib-linux-gnu/crosstool.config
Normal file
17
samples/x86_64-multilib-linux-gnu/crosstool.config
Normal file
@ -0,0 +1,17 @@
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_64=y
|
||||
CT_ARCH_x86=y
|
||||
CT_MULTILIB=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
||||
CT_BINUTILS_LINKER_LD_GOLD=y
|
||||
CT_BINUTILS_GOLD_THREADS=y
|
||||
CT_BINUTILS_LD_WRAPPER=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_LIBC_GLIBC_KERNEL_VERSION_NONE=y
|
||||
CT_CC_GCC_MULTILIB_LIST="m64,m32,mx32"
|
||||
CT_CC_GCC_LNK_HASH_STYLE_BOTH=y
|
||||
CT_CC_LANG_CXX=y
|
||||
CT_DEBUG_gdb=y
|
3
samples/x86_64-multilib-linux-gnu/reported.by
Normal file
3
samples/x86_64-multilib-linux-gnu/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for x86/glibc."
|
19
samples/x86_64-multilib-linux-musl/crosstool.config
Normal file
19
samples/x86_64-multilib-linux-musl/crosstool.config
Normal file
@ -0,0 +1,19 @@
|
||||
CT_EXPERIMENTAL=y
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_64=y
|
||||
CT_ARCH_x86=y
|
||||
CT_MULTILIB=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
||||
# CT_KERNEL_LINUX_INSTALL_CHECK is not set
|
||||
CT_BINUTILS_LINKER_LD_GOLD=y
|
||||
CT_BINUTILS_GOLD_THREADS=y
|
||||
CT_BINUTILS_LD_WRAPPER=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_LIBC_musl=y
|
||||
CT_CC_LANG_CXX=y
|
||||
CT_DEBUG_dmalloc=y
|
||||
CT_DEBUG_duma=y
|
||||
CT_DEBUG_gdb=y
|
3
samples/x86_64-multilib-linux-musl/reported.by
Normal file
3
samples/x86_64-multilib-linux-musl/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for x86/musl."
|
20
samples/x86_64-multilib-linux-uclibc/crosstool.config
Normal file
20
samples/x86_64-multilib-linux-uclibc/crosstool.config
Normal file
@ -0,0 +1,20 @@
|
||||
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
|
||||
CT_SAVE_TARBALLS=y
|
||||
CT_LOG_EXTRA=y
|
||||
CT_ARCH_64=y
|
||||
CT_ARCH_x86=y
|
||||
CT_MULTILIB=y
|
||||
CT_TARGET_VENDOR="multilib"
|
||||
CT_KERNEL_linux=y
|
||||
# CT_KERNEL_LINUX_INSTALL_CHECK is not set
|
||||
CT_BINUTILS_LINKER_LD_GOLD=y
|
||||
CT_BINUTILS_GOLD_THREADS=y
|
||||
CT_BINUTILS_LD_WRAPPER=y
|
||||
CT_BINUTILS_PLUGINS=y
|
||||
CT_LIBC_uClibc=y
|
||||
CT_LIBC_UCLIBC_WCHAR=y
|
||||
CT_CC_LANG_CXX=y
|
||||
CT_DEBUG_dmalloc=y
|
||||
CT_DEBUG_duma=y
|
||||
CT_DEBUG_gdb=y
|
||||
CT_GDB_NATIVE=y
|
3
samples/x86_64-multilib-linux-uclibc/reported.by
Normal file
3
samples/x86_64-multilib-linux-uclibc/reported.by
Normal file
@ -0,0 +1,3 @@
|
||||
reporter_name="Alexey Neyman"
|
||||
reporter_url=""
|
||||
reporter_comment="Multilib configuration for x86/uClibc-ng."
|
68
scripts/build/arch.sh
Normal file
68
scripts/build/arch.sh
Normal file
@ -0,0 +1,68 @@
|
||||
# This file provides the default implementations of arch-specific functions.
|
||||
|
||||
# Set up the target tuple
|
||||
CT_DoArchTupleValues() {
|
||||
:;
|
||||
}
|
||||
|
||||
# Multilib: change the target triplet according to CFLAGS
|
||||
# Usage: CT_DoArchGlibcAdjustTuple <variable-name> <CFLAGS>
|
||||
CT_DoArchMultilibTarget() {
|
||||
:;
|
||||
}
|
||||
|
||||
# Multilib: Adjust target tuple for GLIBC
|
||||
# Usage: CT_DoArchGlibcAdjustTuple <variable-name>
|
||||
CT_DoArchGlibcAdjustTuple() {
|
||||
:;
|
||||
}
|
||||
|
||||
# Helper for uClibc configurators: select the architecture
|
||||
# Usage: CT_DoArchUClibcSelectArch <config-file> <architecture>
|
||||
CT_DoArchUClibcSelectArch() {
|
||||
local cfg="${1}"
|
||||
local arch="${2}"
|
||||
|
||||
${sed} -i -r -e '/^TARGET_.*/d' "${cfg}"
|
||||
CT_KconfigEnableOption "TARGET_${arch}" "${cfg}"
|
||||
CT_KconfigSetOption "TARGET_ARCH" "${arch}" "${cfg}"
|
||||
}
|
||||
|
||||
# uClibc: Adjust configuration file according to the CT-NG configuration
|
||||
# Usage: CT_DoArchUClibcConfig <config-file>
|
||||
CT_DoArchUClibcConfig() {
|
||||
CT_DoLog WARN "Support for '${CT_ARCH}' is not implemented in uClibc config tweaker."
|
||||
CT_DoLog WARN "Exact configuration file must be provided."
|
||||
}
|
||||
|
||||
# Multilib/uClibc: Adjust configuration file for given CFLAGS
|
||||
# Usage: CT_DoArchUClibcCflags <config-file> <cflags>
|
||||
CT_DoArchUClibcCflags() {
|
||||
local cfg="${1}"
|
||||
local cflags="${2}"
|
||||
|
||||
# Likely, any non-default cflags need to be reflected into the config.
|
||||
# It may work if we just pass them into EXTRA_CFLAGS, but we have no
|
||||
# idea as they might interact with the CFLAGS inferred by uClibc from
|
||||
# the configuration file.
|
||||
if [ "${cflags}" != "" ]; then
|
||||
CT_DoLog WARN "Multilib configuration not supported for uClibc/${CT_ARCH}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Multilib/uClibc: Adjust header installation path for given CFLAGS
|
||||
# Usage: CT_DoArchUClibcHeaderDir <path-variable> <cflags>
|
||||
CT_DoArchUClibcHeaderDir() {
|
||||
# Only needed if a given architecture may select different uClibc architectures.
|
||||
:;
|
||||
}
|
||||
|
||||
# Multilib/MUSL: Adjust header installation path for given CFLAGS
|
||||
# Usage: CT_DoArchMUSLHeaderDir <path-variable> <cflags>
|
||||
CT_DoArchMUSLHeaderDir() {
|
||||
# Only needed if a given architecture may select different MUSL architectures.
|
||||
:;
|
||||
}
|
||||
|
||||
# Override from the actual arch implementation as needed.
|
||||
. "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
|
@ -4,14 +4,3 @@ CT_DoArchTupleValues () {
|
||||
# The architecture part of the tuple:
|
||||
CT_TARGET_ARCH="${CT_ARCH}${CT_ARCH_SUFFIX:-${CT_ARCH_ALPHA_VARIANT}}"
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
|
||||
echo "${target}"
|
||||
}
|
||||
|
@ -27,7 +27,6 @@ CT_DoArchTupleValues() {
|
||||
thumb)
|
||||
CT_ARCH_CC_CORE_EXTRA_CONFIG="--with-mode=thumb"
|
||||
CT_ARCH_CC_EXTRA_CONFIG="--with-mode=thumb"
|
||||
# CT_ARCH_TARGET_CFLAGS="-mthumb"
|
||||
;;
|
||||
esac
|
||||
|
||||
@ -38,15 +37,84 @@ CT_DoArchTupleValues() {
|
||||
if [ "${CT_ARCH_ARM_TUPLE_USE_EABIHF}" = "y" ]; then
|
||||
CT_TARGET_SYS="${CT_TARGET_SYS}hf"
|
||||
fi
|
||||
|
||||
# If building multilib, zero out any WITH_*/*_CFLAG - GCC on ARM does not allow
|
||||
# any of them with multilib.
|
||||
if [ "${CT_MULTILIB}" = "y" ]; then
|
||||
CT_ARCH_WITH_ARCH=
|
||||
CT_ARCH_WITH_ABI=
|
||||
CT_ARCH_WITH_CPU=
|
||||
CT_ARCH_WITH_TUNE=
|
||||
CT_ARCH_WITH_FPU=
|
||||
CT_ARCH_WITH_FLOAT=
|
||||
CT_ARCH_ARCH_CFLAG=
|
||||
CT_ARCH_ABI_CFLAG=
|
||||
CT_ARCH_CPU_CFLAG=
|
||||
CT_ARCH_TUNE_CFLAG=
|
||||
CT_ARCH_FPU_CFLAG=
|
||||
CT_ARCH_FLOAT_CFLAG=
|
||||
fi
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
CT_DoArchUClibcConfig() {
|
||||
local cfg="${1}"
|
||||
|
||||
echo "${target}"
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "arm"
|
||||
|
||||
case "${CT_ARCH_ARM_MODE}" in
|
||||
arm)
|
||||
CT_KconfigDisableOption "COMPILE_IN_THUMB_MODE" "${cfg}"
|
||||
;;
|
||||
thumb)
|
||||
CT_KconfigEnableOption "COMPILE_IN_THUMB_MODE" "${cfg}"
|
||||
;;
|
||||
esac
|
||||
|
||||
# FIXME: CONFIG_ARM_OABI does not exist in neither uClibc/uClibc-ng
|
||||
# FIXME: CONFIG_ARM_EABI does not seem to affect anything in either of them, too
|
||||
# (both check the compiler's built-in define, __ARM_EABI__ instead) except for
|
||||
# a check for match between toolchain configuration and uClibc-ng in
|
||||
# uClibc_arch_features.h
|
||||
if [ "${CT_ARCH_ARM_EABI}" = "y" ]; then
|
||||
CT_KconfigDisableOption "CONFIG_ARM_OABI" "${cfg}"
|
||||
CT_KconfigEnableOption "CONFIG_ARM_EABI" "${cfg}"
|
||||
else
|
||||
CT_KconfigDisableOption "CONFIG_ARM_EABI" "${cfg}"
|
||||
CT_KconfigEnableOption "CONFIG_ARM_OABI" "${cfg}"
|
||||
fi
|
||||
}
|
||||
|
||||
CT_DoArchUClibcCflags() {
|
||||
local cfg="${1}"
|
||||
local cflags="${2}"
|
||||
local f
|
||||
|
||||
for f in ${cflags}; do
|
||||
case "${f}" in
|
||||
-mthumb)
|
||||
CT_KconfigEnableOption "COMPILE_IN_THUMB_MODE" "${cfg}"
|
||||
;;
|
||||
-marm)
|
||||
CT_KconfigDisableOption "COMPILE_IN_THUMB_MODE" "${cfg}"
|
||||
;;
|
||||
-mlittle-endian)
|
||||
CT_KconfigDisableOption "ARCH_BIG_ENDIAN" "${cfg}"
|
||||
CT_KconfigDisableOption "ARCH_WANTS_BIG_ENDIAN" "${cfg}"
|
||||
CT_KconfigEnableOption "ARCH_LITTLE_ENDIAN" "${cfg}"
|
||||
CT_KconfigEnableOption "ARCH_WANTS_LITTLE_ENDIAN" "${cfg}"
|
||||
;;
|
||||
-mbig-endian)
|
||||
CT_KconfigEnableOption "ARCH_BIG_ENDIAN" "${cfg}"
|
||||
CT_KconfigEnableOption "ARCH_WANTS_BIG_ENDIAN" "${cfg}"
|
||||
CT_KconfigDisableOption "ARCH_LITTLE_ENDIAN" "${cfg}"
|
||||
CT_KconfigDisableOption "ARCH_WANTS_LITTLE_ENDIAN" "${cfg}"
|
||||
;;
|
||||
-mhard-float|-mfloat-abi=hard|-mfloat-abi=softfp)
|
||||
CT_KconfigEnableOption "UCLIBC_HAS_FPU" "${cfg}"
|
||||
;;
|
||||
-msoft-float|-mfloat-abi=soft)
|
||||
CT_KconfigDisableOption "UCLIBC_HAS_FPU" "${cfg}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
@ -1,16 +1,7 @@
|
||||
# Compute M68k-specific values
|
||||
|
||||
CT_DoArchTupleValues() {
|
||||
:
|
||||
}
|
||||
CT_DoArchUClibcConfig() {
|
||||
local cfg="${1}"
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
|
||||
echo "${target}"
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "m68k"
|
||||
}
|
||||
|
@ -20,13 +20,8 @@ CT_DoArchTupleValues () {
|
||||
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
CT_DoArchUClibcConfig() {
|
||||
local cfg="${1}"
|
||||
|
||||
echo "${target}"
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "microblaze"
|
||||
}
|
||||
|
@ -15,13 +15,57 @@ CT_DoArchTupleValues() {
|
||||
CT_ARCH_WITH_ABI="--with-abi=${CT_ARCH_mips_ABI}"
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
CT_DoArchUClibcConfig() {
|
||||
local cfg="${1}"
|
||||
|
||||
echo "${target}"
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "${CT_ARCH}"
|
||||
|
||||
CT_KconfigDisableOption "CONFIG_MIPS_O32_ABI" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_MIPS_N32_ABI" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_MIPS_N64_ABI" "${cfg}"
|
||||
case "${CT_ARCH_mips_ABI}" in
|
||||
32)
|
||||
CT_KconfigEnableOption "CONFIG_MIPS_O32_ABI" "${cfg}"
|
||||
;;
|
||||
n32)
|
||||
CT_KconfigEnableOption "CONFIG_MIPS_N32_ABI" "${cfg}"
|
||||
;;
|
||||
64)
|
||||
CT_KconfigEnableOption "CONFIG_MIPS_N64_ABI" "${cfg}"
|
||||
;;
|
||||
esac
|
||||
|
||||
# FIXME: uClibc (!ng) allows to select ISA in the config; should
|
||||
# match from the selected ARCH_ARCH level... For now, delete and
|
||||
# fall back to default.
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_1" "${cfg}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_2" "${cfg}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_3" "${cfg}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_4" "${cfg}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_MIPS32" "${cfg}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_MIPS32R2" "${cfg}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_MIPS64" "${cfg}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_MIPS64R2" "${cfg}"
|
||||
}
|
||||
|
||||
CT_DoArchUClibcCflags() {
|
||||
local cfg="${1}"
|
||||
local cflags="${2}"
|
||||
local f
|
||||
|
||||
for f in ${cflags}; do
|
||||
case "${f}" in
|
||||
-mabi=*)
|
||||
CT_KconfigDisableOption "CONFIG_MIPS_O32_ABI" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_MIPS_N32_ABI" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_MIPS_N64_ABI" "${cfg}"
|
||||
case "${f#-mabi=}" in
|
||||
32) CT_KconfigEnableOption "CONFIG_MIPS_O32_ABI" "${cfg}";;
|
||||
n32) CT_KconfigEnableOption "CONFIG_MIPS_N32_ABI" "${cfg}";;
|
||||
64) CT_KconfigEnableOption "CONFIG_MIPS_N64_ABI" "${cfg}";;
|
||||
*) CT_Abort "Unsupported ABI: ${f#-mabi=}";;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
@ -9,5 +9,4 @@ CT_DoArchTupleValues() {
|
||||
CT_ARCH_WITH_FPU=
|
||||
CT_ARCH_WITH_FLOAT=
|
||||
CT_TARGET_SYS=elf
|
||||
|
||||
}
|
||||
|
@ -26,13 +26,15 @@ CT_DoArchTupleValues () {
|
||||
CT_ARCH_CC_EXTRA_CONFIG="--enable-e500_double"
|
||||
fi
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
# Usage: CT_DoArchMultilibTarget "target variable" "multilib flags"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local target_var="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
local target_
|
||||
|
||||
local m32=false
|
||||
local m64=false
|
||||
@ -48,22 +50,41 @@ CT_DoArchMultilibTarget ()
|
||||
esac
|
||||
done
|
||||
|
||||
eval target_=\"\${${target_var}}\"
|
||||
|
||||
# Fix up bitness
|
||||
case "${target}" in
|
||||
powerpc-*) $m64 && target=${target/#powerpc-/powerpc64-} ;;
|
||||
powerpcle-*) $m64 && target=${target/#powerpcle-/powerpc64le-} ;;
|
||||
powerpc64-*) $m32 && target=${target/#powerpc64-/powerpc-} ;;
|
||||
powerpc64le-*) $m32 && target=${target/#powerpc64le-/powerpcle-} ;;
|
||||
case "${target_}" in
|
||||
powerpc-*) $m64 && target_=${target_/#powerpc-/powerpc64-} ;;
|
||||
powerpcle-*) $m64 && target_=${target_/#powerpcle-/powerpc64le-} ;;
|
||||
powerpc64-*) $m32 && target_=${target_/#powerpc64-/powerpc-} ;;
|
||||
powerpc64le-*) $m32 && target_=${target_/#powerpc64le-/powerpcle-} ;;
|
||||
esac
|
||||
|
||||
# Fix up endianness
|
||||
case "${target}" in
|
||||
powerpc-*) $mlittle && target=${target/#powerpc-/powerpcle-} ;;
|
||||
powerpcle-*) $mbig && target=${target/#powerpcle-/powerpc-} ;;
|
||||
powerpc64-*) $mlittle && target=${target/#powerpc64-/powerpc64le-} ;;
|
||||
powerpc64le-*) $mbig && target=${target/#powerpc64le-/powerpc64-} ;;
|
||||
case "${target_}" in
|
||||
powerpc-*) $mlittle && target_=${target_/#powerpc-/powerpcle-} ;;
|
||||
powerpcle-*) $mbig && target_=${target_/#powerpcle-/powerpc-} ;;
|
||||
powerpc64-*) $mlittle && target_=${target_/#powerpc64-/powerpc64le-} ;;
|
||||
powerpc64le-*) $mbig && target_=${target_/#powerpc64le-/powerpc64-} ;;
|
||||
esac
|
||||
|
||||
# return the target
|
||||
echo "${target}"
|
||||
# Set the target variable
|
||||
eval ${target_var}=\"${target_}\"
|
||||
}
|
||||
|
||||
CT_DoArchUClibcConfig() {
|
||||
local cfg="${1}"
|
||||
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "powerpc"
|
||||
|
||||
CT_KconfigDisableOption "CONFIG_E500" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_CLASSIC" "${cfg}"
|
||||
CT_KconfigDeleteOption "TARGET_SUBARCH" "${cfg}"
|
||||
if [ "${CT_ARCH_powerpc_ABI}" = "spe" ]; then
|
||||
CT_KconfigEnableOption "CONFIG_E500" "${cfg}"
|
||||
CT_KconfigSetOption "TARGET_SUBARCH" "e500" "${cfg}"
|
||||
else
|
||||
CT_KconfigEnableOption "CONFIG_CLASSIC" "${cfg}"
|
||||
CT_KconfigSetOption "TARGET_SUBARCH" "classic" "${cfg}"
|
||||
fi
|
||||
}
|
||||
|
@ -9,11 +9,12 @@ CT_DoArchTupleValues() {
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
# Usage: CT_DoArchMultilibTarget "target variable" "multilib flags"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local target_var="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
local target_
|
||||
|
||||
local m31=false
|
||||
local m64=false
|
||||
@ -25,11 +26,14 @@ CT_DoArchMultilibTarget ()
|
||||
esac
|
||||
done
|
||||
|
||||
eval target_=\"\${${target_var}}\"
|
||||
|
||||
# Fix bitness
|
||||
case "${target}" in
|
||||
s390-*) $m64 && target=${target/#s390-/s390x-} ;;
|
||||
s390x-*) $m31 && target=${target/#s390x-/s390-} ;;
|
||||
case "${target_}" in
|
||||
s390-*) $m64 && target_=${target_/#s390-/s390x-} ;;
|
||||
s390x-*) $m31 && target_=${target_/#s390x-/s390-} ;;
|
||||
esac
|
||||
|
||||
echo "${target}"
|
||||
# Set the target variable
|
||||
eval ${target_var}=\"${target_}\"
|
||||
}
|
||||
|
@ -36,13 +36,47 @@ CT_DoArchTupleValues () {
|
||||
CT_ARCH_FLOAT_CFLAG=
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
CT_DoArchUClibcConfig() {
|
||||
local cfg="${1}"
|
||||
|
||||
echo "${target}"
|
||||
# FIXME: uclibc (!ng) seems to support sh64 (sh5), too
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "sh"
|
||||
CT_KconfigDisableOption "CONFIG_SH3" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_SH4" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_SH4A" "${cfg}"
|
||||
case "${CT_ARCH_SH_VARIANT}" in
|
||||
sh3) CT_KconfigEnableOption "CONFIG_SH3" "${cfg}";;
|
||||
sh4) CT_KconfigEnableOption "CONFIG_SH4" "${cfg}";;
|
||||
sh4a) CT_KconfigEnableOption "CONFIG_SH4A" "${cfg}";;
|
||||
esac
|
||||
}
|
||||
|
||||
CT_DoArchUClibcCflags() {
|
||||
local cfg="${1}"
|
||||
local cflags="${2}"
|
||||
local f
|
||||
|
||||
for f in ${cflags}; do
|
||||
case "${f}" in
|
||||
-m3)
|
||||
CT_KconfigEnableOption "CONFIG_SH3" "${cfg}"
|
||||
;;
|
||||
-m4)
|
||||
CT_KconfigEnableOption "CONFIG_SH4" "${cfg}"
|
||||
CT_KconfigEnableOption "UCLIBC_HAS_FPU" "${cfg}"
|
||||
;;
|
||||
-m4-nofpu)
|
||||
CT_KconfigEnableOption "CONFIG_SH4" "${cfg}"
|
||||
CT_KconfigDisableOption "UCLIBC_HAS_FPU" "${cfg}"
|
||||
;;
|
||||
-m4a)
|
||||
CT_KconfigEnableOption "CONFIG_SH4A" "${cfg}"
|
||||
CT_KconfigEnableOption "UCLIBC_HAS_FPU" "${cfg}"
|
||||
;;
|
||||
-m4a-nofpu)
|
||||
CT_KconfigEnableOption "CONFIG_SH4A" "${cfg}"
|
||||
CT_KconfigDisableOption "UCLIBC_HAS_FPU" "${cfg}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
@ -19,11 +19,61 @@ CT_DoArchTupleValues() {
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
# Usage: CT_DoArchMultilibTarget "target variable" "multilib flags"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local target_var="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
local target_
|
||||
|
||||
echo "${target}"
|
||||
local m32=false
|
||||
local m64=false
|
||||
|
||||
for m in "${multi_flags[@]}"; do
|
||||
case "$m" in
|
||||
-m32) m32=true ;;
|
||||
-m64) m64=true ;;
|
||||
esac
|
||||
done
|
||||
|
||||
eval target_=\"\${${target_var}}\"
|
||||
|
||||
# Fix up bitness
|
||||
case "${target_}" in
|
||||
sparc-*) $m64 && target_=${target_/#sparc-/sparc64-} ;;
|
||||
sparc64-*) $m32 && target_=${target_/#sparc64-/sparc-} ;;
|
||||
esac
|
||||
|
||||
# Set the target variable
|
||||
eval ${target_var}=\"${target_}\"
|
||||
}
|
||||
|
||||
# Special tuple adjustment for glibc.
|
||||
CT_DoArchGlibcAdjustTuple() {
|
||||
local target_var="${1}"
|
||||
local target_
|
||||
|
||||
eval target_=\"\${${target_var}}\"
|
||||
|
||||
case "${target_}" in
|
||||
# SPARC quirk: glibc 2.23 and newer dropped support for SPARCv8 and
|
||||
# earlier (corresponding pthread barrier code is missing). Until this
|
||||
# support is reintroduced, configure as sparcv9.
|
||||
sparc-*)
|
||||
if [ "${CT_LIBC_GLIBC_2_23_or_later}" = y ]; then
|
||||
CT_DoLog WARN "GLIBC 2.23 only supports SPARCv9"
|
||||
target_=${target_/#sparc-/sparcv9-}
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# Set the target variable
|
||||
eval ${target_var}=\"${target_}\"
|
||||
}
|
||||
|
||||
CT_DoArchUClibcConfig() {
|
||||
local cfg="${1}"
|
||||
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "${CT_ARCH}"
|
||||
# FIXME: select CONFIG_SPARC_V7/V8/V9/V9B according to the CPU selector
|
||||
}
|
||||
|
@ -35,11 +35,12 @@ CT_DoArchTupleValues() {
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
# Usage: CT_DoArchMultilibTarget "target variable" "multilib flags"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local target_var="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
local target_
|
||||
|
||||
local bit32=false
|
||||
local bit64=false
|
||||
@ -54,17 +55,126 @@ CT_DoArchMultilibTarget ()
|
||||
esac
|
||||
done
|
||||
|
||||
eval target_=\"\${${target_var}}\"
|
||||
|
||||
# Fix up architecture.
|
||||
case "${target}" in
|
||||
x86_64-*) $bit32 && target=${target/#x86_64-/i386-} ;;
|
||||
i[34567]86-*) $bit64 && target=${target/#i[34567]86-/x86_64-} ;;
|
||||
case "${target_}" in
|
||||
x86_64-*) $bit32 && target_=${target_/#x86_64-/i386-} ;;
|
||||
i[34567]86-*) $bit64 && target_=${target_/#i[34567]86-/x86_64-} ;;
|
||||
esac
|
||||
|
||||
# Fix up the ABI part.
|
||||
case "${target}" in
|
||||
*x32) $abi_dflt && target=${target/%x32} ;;
|
||||
*) $abi_x32 && target=${target}x32 ;;
|
||||
case "${target_}" in
|
||||
*x32) $abi_dflt && target_=${target_/%x32} ;;
|
||||
*) $abi_x32 && target_=${target_}x32 ;;
|
||||
esac
|
||||
|
||||
echo "${target}"
|
||||
# Set the target variable
|
||||
eval ${target_var}=\"${target_}\"
|
||||
}
|
||||
|
||||
# Adjust target tuple for GLIBC
|
||||
CT_DoArchGlibcAdjustTuple() {
|
||||
local target_var="${1}"
|
||||
local target_
|
||||
|
||||
eval target_=\"\${${target_var}}\"
|
||||
|
||||
case "${target_}" in
|
||||
# x86 quirk: architecture name is i386, but glibc expects i[4567]86 - to
|
||||
# indicate the desired optimization. If it was a multilib variant of x86_64,
|
||||
# then it targets at least NetBurst a.k.a. i786, but we'll follow the model
|
||||
# above # and set the optimization to i686. Otherwise, replace with the most
|
||||
# conservative choice, i486.
|
||||
i386-*)
|
||||
if [ "${CT_TARGET_ARCH}" = "x86_64" ]; then
|
||||
target_=${target_/#i386-/i686-}
|
||||
elif [ "${CT_TARGET_ARCH}" != "i386" ]; then
|
||||
target_=${target_/#i386-/${CT_TARGET_ARCH}-}
|
||||
else
|
||||
target_=${target_/#i386-/i486-}
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# Set the target variable
|
||||
eval ${target_var}=\"${target_}\"
|
||||
}
|
||||
|
||||
CT_DoArchUClibcConfig() {
|
||||
local cfg="${1}"
|
||||
|
||||
if [ "${CT_ARCH_BITNESS}" = 64 ]; then
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "x86_64"
|
||||
else
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "i386"
|
||||
fi
|
||||
|
||||
# FIXME This doesn't cover all cases of x86_32 on uClibc (!ng)
|
||||
CT_KconfigDisableOption "CONFIG_386" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_486" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_586" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_686" "${cfg}"
|
||||
case ${CT_TARGET_ARCH} in
|
||||
i386)
|
||||
CT_KconfigEnableOption "CONFIG_386" "${cfg}"
|
||||
;;
|
||||
i486)
|
||||
CT_KconfigEnableOption "CONFIG_486" "${cfg}"
|
||||
;;
|
||||
i586)
|
||||
CT_KconfigEnableOption "CONFIG_586" "${cfg}"
|
||||
;;
|
||||
i686)
|
||||
CT_KconfigEnableOption "CONFIG_686" "${cfg}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
CT_DoArchUClibcCflags() {
|
||||
local cfg="${1}"
|
||||
local cflags="${2}"
|
||||
local f
|
||||
|
||||
for f in ${cflags}; do
|
||||
case "${f}" in
|
||||
-m64)
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "x86_64"
|
||||
;;
|
||||
-m32)
|
||||
# Since it's a part of multilib with 64-bit flavor, default
|
||||
# to new architecture (i686).
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "i386"
|
||||
CT_KconfigDisableOption "CONFIG_386" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_486" "${cfg}"
|
||||
CT_KconfigDisableOption "CONFIG_586" "${cfg}"
|
||||
CT_KconfigEnableOption "CONFIG_686" "${cfg}"
|
||||
;;
|
||||
-mx32)
|
||||
CT_Abort "uClibc does not support x32 ABI"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
CT_DoArchUClibcHeaderDir() {
|
||||
local dir_var="${1}"
|
||||
local cflags="${2}"
|
||||
|
||||
# If it is non-default multilib, add a suffix with architecture (reported by gcc)
|
||||
# to the headers installation path.
|
||||
if [ -n "${cflags}" ]; then
|
||||
eval "${dir_var}="$( ${CT_TARGET}-gcc -print-multiarch ${cflags} )
|
||||
fi
|
||||
}
|
||||
|
||||
CT_DoArchMUSLHeaderDir() {
|
||||
local dir_var="${1}"
|
||||
local cflags="${2}"
|
||||
|
||||
# If it is non-default multilib, add a suffix with architecture (reported by gcc)
|
||||
# to the headers installation path.
|
||||
if [ -n "${cflags}" ]; then
|
||||
eval "${dir_var}="$( ${CT_TARGET}-gcc -print-multiarch ${cflags} )
|
||||
fi
|
||||
}
|
||||
|
@ -70,3 +70,9 @@ CT_ConfigureXtensa() {
|
||||
|
||||
CT_Popd
|
||||
}
|
||||
|
||||
CT_DoArchUClibcConfig() {
|
||||
local cfg="${1}"
|
||||
|
||||
CT_DoArchUClibcSelectArch "${cfg}" "xtensa"
|
||||
}
|
||||
|
@ -84,6 +84,169 @@ cc_gcc_lang_list() {
|
||||
printf "%s" "${lang_list}"
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Return a value of a requested GCC spec
|
||||
cc_gcc_get_spec() {
|
||||
local spec=$1
|
||||
local cc_and_cflags=$2
|
||||
|
||||
# GCC does not provide a facility to request a value of a spec string.
|
||||
# The only way to do that I found was to augment the spec file with
|
||||
# some dummy suffix handler that does nothing except printing it.
|
||||
touch temp-input.spec_eval
|
||||
{
|
||||
echo ".spec_eval:"
|
||||
echo "echo %(${spec})"
|
||||
} > "tmp-specs-${spec}"
|
||||
${cc_and_cflags} -specs="tmp-specs-${spec}" -E temp-input.spec_eval
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Report the type of a GCC option
|
||||
cc_gcc_classify_opt() {
|
||||
# Options present in multiple architectures
|
||||
case "${1}" in
|
||||
-march=*) echo "arch"; return;;
|
||||
-mabi=*) echo "abi"; return;;
|
||||
-mcpu=*|-mmcu=*) echo "cpu"; return;;
|
||||
-mtune=*) echo "tune"; return;;
|
||||
-mfpu=*) echo "fpu"; return;;
|
||||
-mhard-float|-msoft-float|-mno-soft-float|-mno-float|-mfloat-abi=*|\
|
||||
-mfpu|-mno-fpu) echo "float"; return;;
|
||||
-EB|-EL|-mbig-endian|-mlittle-endian|-mbig|-mlittle|-meb|-mel|-mb|-ml) echo "endian"; return;;
|
||||
-mthumb|-marm) echo "mode"; return;;
|
||||
esac
|
||||
|
||||
# Arch-specific options and aliases
|
||||
case "${CT_ARCH}" in
|
||||
m68k)
|
||||
case "${1}" in
|
||||
-m68881) echo "float"; return;;
|
||||
-m5[234]*|-mcfv4e) echo "cpu"; return;;
|
||||
-m68*|-mc68*) echo "arch"; return;;
|
||||
esac
|
||||
;;
|
||||
mips)
|
||||
case "${1}" in
|
||||
-mips[1234]|-mips32|-mips32r*|-mips64|-mips64r*) echo "cpu"; return;;
|
||||
esac
|
||||
;;
|
||||
sh)
|
||||
case "${1}" in
|
||||
-m[12345]*) echo "cpu"; return;;
|
||||
esac
|
||||
esac
|
||||
|
||||
# All tried and failed
|
||||
echo "unknown"
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# This function lists the multilibs configured in the compiler (even if multilib
|
||||
# is disabled - so that it lists the default GCC/OS directory, which may differ
|
||||
# from the default 'lib'). It then performs a few multilib checks/quirks:
|
||||
#
|
||||
# 1. On SuperH target, configuring with default CPU (e.g. by supplying the target
|
||||
# name as 'sh4', which is what CT-NG does) results in the compiler being unable to
|
||||
# run if that same switch is passed to the resulting gcc (e.g. 'gcc -m4'). The reason
|
||||
# for this behavior is that the script that determines the sysroot suffix is not
|
||||
# aware of the default multilib selection, so it generates <sysroot>/m4 as the
|
||||
# suffixed sysroot. But the main driver, knowing that -m4 is the default, does not
|
||||
# even attempt to fall back to the non-suffixed sysroot (as it does with non-default
|
||||
# multilibs) - as a result, gcc fails to find any library if invoked with -m4.
|
||||
# The right solution would be to drop the default CPU from the multilib list
|
||||
# completely, or make the print-sysroot-suffix.sh script aware of the defaults
|
||||
# (which is not easy, as the defaults are not in tmake_file, but rather in tm_file...)
|
||||
#
|
||||
# 2. On MIPS target, gcc (or rather, ld, which it invokes under the hood) chokes
|
||||
# if supplied with two -mabi=* options. I.e., 'gcc -mabi=n32' and 'gcc -mabi=32' both
|
||||
# work, but 'gcc -mabi=32 -mabi=n32' produces an internal error in ld. Thus we do
|
||||
# not supply target's CFLAGS in multilib builds - and after compiling pass-1 gcc,
|
||||
# attempt to determine which CFLAGS need to be filtered out.
|
||||
cc_gcc_multilib_housekeeping() {
|
||||
local cc host
|
||||
local flags osdir dir multilibs i f
|
||||
local multilib_defaults
|
||||
local suffix sysroot base lnk
|
||||
local ml_arch ml_abi ml_cpu ml_tune ml_fpu ml_float ml_endian ml_mode ml_unknown ml
|
||||
local new_cflags
|
||||
|
||||
for arg in "$@"; do
|
||||
eval "${arg// /\\ }"
|
||||
done
|
||||
|
||||
if [ \( "${CT_CANADIAN}" = "y" -o "${CT_CROSS_NATIVE}" = "y" \) -a "${host}" = "${CT_HOST}" ]; then
|
||||
CT_DoLog EXTRA "Canadian Cross/Cross-native unable to confirm multilibs configuration "\
|
||||
"directly; will use build-compiler for housekeeping."
|
||||
# Since we cannot run the desired compiler, substitute build-CC with the assumption
|
||||
# that the host-CC is configured in the same way.
|
||||
cc="${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-gcc"
|
||||
fi
|
||||
|
||||
# sed: prepend dashes or do nothing if default is empty string
|
||||
multilib_defaults=( $( cc_gcc_get_spec multilib_defaults "${cc}" | \
|
||||
${sed} 's/\(^\|[[:space:]]\+\)\([^[:space:]]\)/ -\2/g' ) )
|
||||
CT_DoLog EXTRA "gcc default flags: '${multilib_defaults}'"
|
||||
|
||||
multilibs=( $( "${cc}" -print-multi-lib ) )
|
||||
if [ ${#multilibs[@]} -ne 0 ]; then
|
||||
CT_DoLog EXTRA "gcc configured with these multilibs (including the default):"
|
||||
for i in "${multilibs[@]}"; do
|
||||
dir="lib/${i%%;*}"
|
||||
flags="${i#*;}"
|
||||
flags=${flags//@/ -}
|
||||
flags=$( echo ${flags} )
|
||||
osdir="lib/"$( "${cc}" -print-multi-os-directory ${flags} )
|
||||
CT_SanitizeVarDir dir osdir
|
||||
CT_DoLog EXTRA " '${flags}' --> ${dir} (gcc) ${osdir} (os)"
|
||||
for f in ${flags}; do
|
||||
eval ml_`cc_gcc_classify_opt ${f}`=seen
|
||||
done
|
||||
done
|
||||
else
|
||||
CT_DoLog WARN "no multilib configuration: GCC unusable?"
|
||||
fi
|
||||
|
||||
# Filtering out some of the options provided in CT-NG config. Then *prepend*
|
||||
# them to CT_TARGET_CFLAGS, like scripts/crosstool-NG.sh does. Zero out
|
||||
# the stashed MULTILIB flags so that we don't process them again in the passes
|
||||
# that follow.
|
||||
CT_DoLog DEBUG "Configured target CFLAGS: '${CT_ARCH_TARGET_CFLAGS_MULTILIB}'"
|
||||
ml_unknown= # Pass through anything we don't know about
|
||||
for f in ${CT_ARCH_TARGET_CFLAGS_MULTILIB}; do
|
||||
eval ml=\$ml_`cc_gcc_classify_opt ${f}`
|
||||
if [ "${ml}" != "seen" ]; then
|
||||
new_cflags="${new_cflags} ${f}"
|
||||
fi
|
||||
done
|
||||
CT_DoLog DEBUG "Filtered target CFLAGS: '${new_cflags}'"
|
||||
CT_EnvModify CT_TARGET_CFLAGS "${new_cflags} ${CT_TARGET_CFLAGS}"
|
||||
CT_EnvModify CT_ARCH_TARGET_CFLAGS_MULTILIB ""
|
||||
|
||||
# Currently, the only LDFLAGS are endianness-related
|
||||
CT_DoLog DEBUG "Configured target LDFLAGS: '${CT_ARCH_TARGET_LDFLAGS_MULTILIB}'"
|
||||
if [ "${ml_endian}" != "seen" ]; then
|
||||
CT_EnvModify CT_TARGET_LDFLAGS "${CT_ARCH_TARGET_LDFLAGS_MULTILIB} ${CT_TARGET_LDFLAGS}"
|
||||
CT_EnvModify CT_ARCH_TARGET_LDFLAGS_MULTILIB ""
|
||||
fi
|
||||
CT_DoLog DEBUG "Filtered target LDFLAGS: '${CT_ARCH_TARGET_LDFLAGS_MULTILIB}'"
|
||||
|
||||
# Sysroot suffix fixup for the multilib default.
|
||||
suffix=$( cc_gcc_get_spec sysroot_suffix_spec "${cc} ${multilib_defaults}" )
|
||||
if [ -n "${suffix}" ]; then
|
||||
base=${suffix%/*}
|
||||
sysroot=$( "${cc}" -print-sysroot )
|
||||
if [ -n "${base}" ]; then
|
||||
CT_DoExecLog ALL mkdir -p "${sysroot}${base}"
|
||||
lnk=$( echo "${base#/}" | ${sed} -e 's,[^/]*,..,g' )
|
||||
else
|
||||
lnk=.
|
||||
fi
|
||||
CT_DoExecLog ALL rm -f "${sysroot}${suffix}"
|
||||
CT_DoExecLog ALL ln -sfv "${lnk}" "${sysroot}${suffix}"
|
||||
fi
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Core gcc pass 1
|
||||
do_gcc_core_pass_1() {
|
||||
@ -539,7 +702,7 @@ do_gcc_core_backend() {
|
||||
# tree makes the libtoolized utilities that are built next assume
|
||||
# that, for example, libsupc++ is an "accessory library", and not include
|
||||
# -lsupc++ to the link flags. That breaks ltrace, for example.
|
||||
CT_DoLog EXTRA "Housekeeping for final gcc compiler"
|
||||
CT_DoLog EXTRA "Housekeeping for core gcc compiler"
|
||||
CT_Pushd "${prefix}"
|
||||
find . -type f -name "*.la" -exec rm {} \; |CT_DoLog ALL
|
||||
CT_Popd
|
||||
@ -560,25 +723,8 @@ do_gcc_core_backend() {
|
||||
CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${prefix}/bin/${CT_TARGET}-cc${ext}"
|
||||
fi
|
||||
|
||||
if [ "${CT_MULTILIB}" = "y" ]; then
|
||||
if [ "${CT_CANADIAN}" = "y" -a "${mode}" = "baremetal" \
|
||||
-a "${host}" = "${CT_HOST}" ]; then
|
||||
CT_DoLog WARN "Canadian Cross unable to confirm multilibs configured correctly"
|
||||
else
|
||||
multilibs=( $( "${prefix}/bin/${CT_TARGET}-gcc" -print-multi-lib \
|
||||
|tail -n +2 ) )
|
||||
if [ ${#multilibs[@]} -ne 0 ]; then
|
||||
CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
|
||||
for i in "${multilibs[@]}"; do
|
||||
dir="${i%%;*}"
|
||||
flags="${i#*;}"
|
||||
CT_DoLog EXTRA " ${flags//@/ -} --> ${dir}/"
|
||||
done
|
||||
else
|
||||
CT_DoLog WARN "gcc configured for multilib, but none available"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
cc_gcc_multilib_housekeeping cc="${prefix}/bin/${CT_TARGET}-gcc" \
|
||||
host="${host}"
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
@ -965,25 +1111,9 @@ do_gcc_backend() {
|
||||
file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
|
||||
[ -z "${file}" ] || ext=".${file##*.}"
|
||||
if [ -f "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc${ext}" ]; then
|
||||
CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
|
||||
CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${prefix}/bin/${CT_TARGET}-cc${ext}"
|
||||
fi
|
||||
|
||||
if [ "${CT_MULTILIB}" = "y" ]; then
|
||||
if [ "${CT_CANADIAN}" = "y" ]; then
|
||||
CT_DoLog WARN "Canadian Cross unable to confirm multilibs configured correctly"
|
||||
else
|
||||
multilibs=( $( "${prefix}/bin/${CT_TARGET}-gcc" -print-multi-lib \
|
||||
|tail -n +2 ) )
|
||||
if [ ${#multilibs[@]} -ne 0 ]; then
|
||||
CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
|
||||
for i in "${multilibs[@]}"; do
|
||||
dir="${i%%;*}"
|
||||
flags="${i#*;}"
|
||||
CT_DoLog EXTRA " ${flags//@/ -} --> ${dir}/"
|
||||
done
|
||||
else
|
||||
CT_DoLog WARN "gcc configured for multilib, but none available"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
cc_gcc_multilib_housekeeping cc="${prefix}/bin/${CT_TARGET}-gcc" \
|
||||
host="${host}"
|
||||
}
|
||||
|
@ -118,12 +118,5 @@ do_finish() {
|
||||
CT_DoForceRmdir "${CT_DEBUGROOT_DIR}/"{,usr/}{,share/}{man,info}
|
||||
fi
|
||||
|
||||
# Remove the lib* symlinks, now:
|
||||
# The symlinks are needed only during the build process.
|
||||
# The final gcc will still search those dirs, but will also search
|
||||
# the standard lib/ dirs, so we can get rid of the symlinks
|
||||
CT_DoExecLog ALL rm -f "${CT_PREFIX_DIR}/lib32"
|
||||
CT_DoExecLog ALL rm -f "${CT_PREFIX_DIR}/lib64"
|
||||
|
||||
CT_EndStep
|
||||
}
|
||||
|
@ -18,10 +18,6 @@ do_libc_extract() {
|
||||
CT_Patch "avr-libc" "${CT_LIBC_VERSION}"
|
||||
}
|
||||
|
||||
do_libc_check_config() {
|
||||
:
|
||||
}
|
||||
|
||||
do_libc_configure() {
|
||||
CT_DoLog EXTRA "Configuring C library"
|
||||
|
||||
|
@ -41,10 +41,6 @@ do_libc_extract() {
|
||||
CT_Popd
|
||||
}
|
||||
|
||||
do_libc_check_config() {
|
||||
:
|
||||
}
|
||||
|
||||
# Build and install headers and start files
|
||||
do_libc_start_files() {
|
||||
# Start files and Headers should be configured the same way as the
|
||||
@ -68,14 +64,6 @@ do_libc_post_cc() {
|
||||
# libc_mode : 'startfiles' or 'final' : string : (none)
|
||||
do_libc_backend() {
|
||||
local libc_mode
|
||||
local -a multilibs
|
||||
local multilib
|
||||
local multi_dir
|
||||
local multi_flags
|
||||
local extra_dir
|
||||
local target
|
||||
local libc_headers libc_startfiles libc_full
|
||||
local hdr
|
||||
local arg
|
||||
|
||||
for arg in "$@"; do
|
||||
@ -85,167 +73,77 @@ do_libc_backend() {
|
||||
case "${libc_mode}" in
|
||||
startfiles)
|
||||
CT_DoStep INFO "Installing C library headers & start files"
|
||||
hdr=y
|
||||
libc_startfiles=y
|
||||
libc_full=
|
||||
;;
|
||||
final)
|
||||
CT_DoStep INFO "Installing C library"
|
||||
hdr=
|
||||
libc_startfiles=
|
||||
libc_full=y
|
||||
;;
|
||||
*) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
|
||||
*)
|
||||
CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'"
|
||||
;;
|
||||
esac
|
||||
|
||||
# If gcc is not configured for multilib, it still prints
|
||||
# a single line for the default settings
|
||||
multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null) )
|
||||
for multilib in "${multilibs[@]}"; do
|
||||
multi_dir="${multilib%%;*}"
|
||||
if [ "${multi_dir}" != "." ]; then
|
||||
CT_DoStep INFO "Building for multilib subdir='${multi_dir}'"
|
||||
|
||||
extra_flags="$( echo "${multilib#*;}" \
|
||||
|${sed} -r -e 's/@/ -/g;' \
|
||||
)"
|
||||
extra_dir="/${multi_dir}"
|
||||
|
||||
# glibc install its files in ${extra_dir}/{usr/,}lib
|
||||
# while gcc expects them in {,usr/}lib/${extra_dir}.
|
||||
# Prepare some symlinks so glibc installs in fact in
|
||||
# the proper place
|
||||
# We do it in the start-files step, so it is not needed
|
||||
# to do it in the final step, as the symlinks will
|
||||
# already exist
|
||||
if [ "${libc_mode}" = "startfiles" ]; then
|
||||
CT_Pushd "${CT_SYSROOT_DIR}"
|
||||
CT_DoExecLog ALL mkdir -p "lib/${multi_dir}" \
|
||||
"usr/lib/${multi_dir}" \
|
||||
"${multi_dir}" \
|
||||
"${multi_dir}/usr"
|
||||
CT_DoExecLog ALL ln -sf "../lib/${multi_dir}" "${multi_dir}/lib"
|
||||
CT_DoExecLog ALL ln -sf "../../usr/lib/${multi_dir}" "${multi_dir}/usr/lib"
|
||||
CT_Popd
|
||||
fi
|
||||
libc_headers=
|
||||
else
|
||||
extra_dir=
|
||||
extra_flags=
|
||||
libc_headers="${hdr}"
|
||||
fi
|
||||
|
||||
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
|
||||
|
||||
target=$( CT_DoMultilibTarget "${CT_TARGET}" ${extra_flags} )
|
||||
case "${target}" in
|
||||
# SPARC quirk: glibc 2.23 and newer dropped support for SPARCv8 and
|
||||
# earlier (corresponding pthread barrier code is missing). Until this
|
||||
# support is reintroduced, configure as sparcv9.
|
||||
sparc-*)
|
||||
if [ "${CT_LIBC_GLIBC_2_23_or_later}" = y ]; then
|
||||
target=${target/#sparc-/sparcv9-}
|
||||
fi
|
||||
;;
|
||||
# x86 quirk: architecture name is i386, but glibc expects i[4567]86 - to
|
||||
# indicate the desired optimization. If it was a multilib variant of x86_64,
|
||||
# then it targets at least NetBurst a.k.a. i786, but we'll follow arch/x86.sh
|
||||
# and set the optimization to i686. Otherwise, replace with the most
|
||||
# conservative choice, i486.
|
||||
i386-*)
|
||||
if [ "${CT_TARGET_ARCH}" = "x86_64" ]; then
|
||||
target=${target/#i386-/i686-}
|
||||
else
|
||||
target=${target/#i386-/i486-}
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
do_libc_backend_once extra_dir="${extra_dir}" \
|
||||
extra_flags="${extra_flags}" \
|
||||
libc_headers="${libc_headers}" \
|
||||
libc_startfiles="${libc_startfiles}" \
|
||||
libc_full="${libc_full}" \
|
||||
target="${target}"
|
||||
|
||||
CT_Popd
|
||||
|
||||
if [ "${multi_dir}" != "." ]; then
|
||||
if [ "${libc_mode}" = "final" ]; then
|
||||
CT_DoLog EXTRA "Fixing up multilib location"
|
||||
|
||||
# rewrite the library multiplexers
|
||||
for d in "lib/${multi_dir}" "usr/lib/${multi_dir}"; do
|
||||
for l in libc libpthread libgcc_s; do
|
||||
if [ -f "${CT_SYSROOT_DIR}/${d}/${l}.so" \
|
||||
-a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so ]
|
||||
then
|
||||
CT_DoExecLog DEBUG ${sed} -r -i \
|
||||
-e "s:/lib/:/lib/${multi_dir}/:g;" \
|
||||
"${CT_SYSROOT_DIR}/${d}/${l}.so"
|
||||
fi
|
||||
done
|
||||
done
|
||||
# Remove the multi_dir now it is no longer useful
|
||||
CT_DoExecLog DEBUG rm -rf "${CT_SYSROOT_DIR}/${multi_dir}"
|
||||
fi # libc_mode == final
|
||||
|
||||
CT_EndStep
|
||||
fi
|
||||
done
|
||||
|
||||
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}"
|
||||
CT_IterateMultilibs do_libc_backend_once multilib libc_mode="${libc_mode}"
|
||||
CT_Popd
|
||||
CT_EndStep
|
||||
}
|
||||
|
||||
# This backend builds the C library once
|
||||
# Usage: do_libc_backend_once param=value [...]
|
||||
# Parameter : Definition : Type : Default
|
||||
# libc_headers : Build libc headers : bool : n
|
||||
# libc_startfiles : Build libc start-files : bool : n
|
||||
# libc_full : Build full libc : bool : n
|
||||
# extra_flags : Extra CFLAGS to use (for multilib) : string : (empty)
|
||||
# extra_dir : Extra subdir for multilib : string : (empty)
|
||||
# target : Build libc using this target (for multilib) : string : ${CT_TARGET}
|
||||
# Parameter : Definition : Type
|
||||
# libc_mode : 'startfiles' or 'final' : string : (empty)
|
||||
# multi_* : as defined in CT_IterateMultilibs : (varies) :
|
||||
do_libc_backend_once() {
|
||||
local libc_headers
|
||||
local libc_startfiles
|
||||
local libc_full
|
||||
local extra_flags
|
||||
local extra_dir
|
||||
local multi_flags multi_dir multi_os_dir multi_root multi_index multi_count
|
||||
local startfiles_dir
|
||||
local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
|
||||
local extra_cc_args
|
||||
local -a extra_config
|
||||
local -a extra_make_args
|
||||
local glibc_cflags
|
||||
local float_extra
|
||||
local endian_extra
|
||||
local target
|
||||
local arg
|
||||
local arg opt
|
||||
|
||||
for arg in "$@"; do
|
||||
eval "${arg// /\\ }"
|
||||
done
|
||||
|
||||
if [ "${target}" = "" ]; then
|
||||
target="${CT_TARGET}"
|
||||
CT_DoStep INFO "Building for multilib ${multi_index}/${multi_count}: '${multi_flags}'"
|
||||
|
||||
# Ensure sysroot (with suffix, if applicable) exists
|
||||
CT_DoExecLog ALL mkdir -p "${multi_root}"
|
||||
|
||||
# Adjust target tuple according GLIBC quirks
|
||||
CT_DoArchGlibcAdjustTuple multi_target
|
||||
|
||||
# Glibc seems to be smart enough to know about the cases that can coexist
|
||||
# in the same root and installs them into proper multilib-os directory; all
|
||||
# we need is to point to the right root. We do need to handle multilib-os
|
||||
# here, though, for the first pass where we install crt*.o and a dummy
|
||||
# libc.so; we therefore install it to the most specific location of
|
||||
# <sysroot>/<suffix>/usr/lib/<multilib-os> where it is least likely to clash
|
||||
# with other multilib variants. We then remove these temporary files at
|
||||
# the beginning of the libc-final step and allow glibc to install them
|
||||
# where it thinks is proper.
|
||||
startfiles_dir="${multi_root}/usr/lib/${multi_os_dir}"
|
||||
CT_SanitizeVarDir startfiles_dir
|
||||
|
||||
if [ "${libc_mode}" = "final" ]; then
|
||||
CT_DoLog EXTRA "Cleaning up start files"
|
||||
CT_DoExecLog ALL rm -f "${startfiles_dir}/crt1.o" \
|
||||
"${startfiles_dir}/crti.o" \
|
||||
"${startfiles_dir}/crtn.o" \
|
||||
"${startfiles_dir}/libc.so"
|
||||
fi
|
||||
|
||||
CT_DoLog EXTRA "Configuring C library"
|
||||
|
||||
case "${CT_LIBC}" in
|
||||
glibc)
|
||||
# glibc can't be built without -O2 (reference needed!)
|
||||
OPTIMIZE=-O2
|
||||
# Also, if those two are missing, iconv build breaks
|
||||
extra_config+=( --disable-debug --disable-sanity-checks )
|
||||
;;
|
||||
esac
|
||||
# Also, if those two are missing, iconv build breaks
|
||||
extra_config+=( --disable-debug --disable-sanity-checks )
|
||||
|
||||
# always include rpc, the user can still override it with TI-RPC
|
||||
extra_config+=( --enable-obsolete-rpc )
|
||||
|
||||
# Add some default glibc config options if not given by user.
|
||||
# We don't need to be conditional on wether the user did set different
|
||||
# We don't need to be conditional on whether the user did set different
|
||||
# values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after
|
||||
# extra_config
|
||||
|
||||
@ -267,21 +165,6 @@ do_libc_backend_once() {
|
||||
*) extra_config+=("--disable-shared");;
|
||||
esac
|
||||
|
||||
float_extra="$( echo "${extra_flags}" \
|
||||
|${sed} -r -e '/^(.*[[:space:]])?-m(hard|soft)-float([[:space:]].*)?$/!d;' \
|
||||
-e 's//\2/;' \
|
||||
)"
|
||||
case "${float_extra}" in
|
||||
hard) extra_config+=("--with-fp");;
|
||||
soft) extra_config+=("--without-fp");;
|
||||
"")
|
||||
case "${CT_ARCH_FLOAT}" in
|
||||
hard|softfp) extra_config+=("--with-fp");;
|
||||
soft) extra_config+=("--without-fp");;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
|
||||
extra_config+=("--disable-versioning")
|
||||
fi
|
||||
@ -298,24 +181,6 @@ do_libc_backend_once() {
|
||||
extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
|
||||
[ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
|
||||
|
||||
# Extract the endianness options if any
|
||||
# This should cover all possible endianness options
|
||||
# in gcc, but it is prone to bit-rot... :-(
|
||||
endian_extra="$( echo "${extra_flags}" \
|
||||
|${sed} -r -e '/^(.*[[:space:]])?-(E[BL]|m((big|little)(-endian)?|e?[bl]))([[:space:]].*)?$/!d;' \
|
||||
-e 's//\2/;' \
|
||||
)"
|
||||
# If extra_flags contained an endianness option, no need to add it again. Otherwise,
|
||||
# add the option from the configuration.
|
||||
case "${endian_extra}" in
|
||||
EB|mbig-endian|mbig|meb|mb)
|
||||
;;
|
||||
EL|mlittle-endian|mlittle|mel|ml)
|
||||
;;
|
||||
"") extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
|
||||
;;
|
||||
esac
|
||||
|
||||
touch config.cache
|
||||
if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
|
||||
echo "libc_cv_forced_unwind=yes" >>config.cache
|
||||
@ -325,14 +190,30 @@ do_libc_backend_once() {
|
||||
# Pre-seed the configparms file with values from the config option
|
||||
printf "%s\n" "${CT_LIBC_GLIBC_CONFIGPARMS}" > configparms
|
||||
|
||||
cross_cc=$(CT_Which "${CT_TARGET}-gcc")
|
||||
extra_cc_args+=" ${extra_flags}"
|
||||
# glibc can't be built without -O2 (reference needed!)
|
||||
glibc_cflags+=" -O2"
|
||||
|
||||
case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
|
||||
y) ;;
|
||||
*) glibc_cflags+=" -U_FORTIFY_SOURCE";;
|
||||
esac
|
||||
glibc_cflags+=" ${CT_TARGET_CFLAGS} ${OPTIMIZE} ${CT_LIBC_GLIBC_EXTRA_CFLAGS}"
|
||||
|
||||
# In the order of increasing precedence. Flags common to compiler and linker.
|
||||
glibc_cflags+=" ${CT_TARGET_CFLAGS}"
|
||||
glibc_cflags+=" ${CT_LIBC_GLIBC_EXTRA_CFLAGS}"
|
||||
glibc_cflags+=" ${multi_flags}"
|
||||
|
||||
# Analyze the resulting options for any extra configure switches to throw in.
|
||||
for opt in ${glibc_cflags}; do
|
||||
case ${opt} in
|
||||
-mhard-float|-mfloat-abi=hard|-mfloat-abi=softfp|-mno-soft-float|-mfpu)
|
||||
extra_config+=("--with-fp")
|
||||
;;
|
||||
-msoft-float|-mfloat-abi=soft|-mno-float|-mno-fpu)
|
||||
extra_config+=("--without-fp")
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# ./configure is mislead by our tools override wrapper for bash
|
||||
# so just tell it where the real bash is _on_the_target_!
|
||||
@ -349,31 +230,35 @@ do_libc_backend_once() {
|
||||
|
||||
# Configure with --prefix the way we want it on the target...
|
||||
# There are a whole lot of settings here. You'll probably want
|
||||
# to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY
|
||||
# Compare these options with the ones used when installing the glibc headers above - they're different.
|
||||
# Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
|
||||
# to read up on what they all mean, and customize a bit, possibly
|
||||
# by setting GLIBC_EXTRA_CONFIG_ARRAY.
|
||||
# Compare these options with the ones used when installing
|
||||
# the glibc headers above - they're different.
|
||||
# Adding "--without-gd" option to avoid error "memusagestat.c:36:16:
|
||||
# gd.h: No such file or directory"
|
||||
# See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
|
||||
# Set BUILD_CC, or we won't be able to build datafiles
|
||||
# Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death)
|
||||
# when the shell is not bash... Sigh... :-(
|
||||
|
||||
CT_DoLog DEBUG "Using gcc for target : '${cross_cc}'"
|
||||
CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
|
||||
CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
|
||||
CT_DoLog DEBUG "Extra CC args passed : '${glibc_cflags}'"
|
||||
CT_DoLog DEBUG "Extra flags (multilib) : '${extra_flags}'"
|
||||
CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
|
||||
CT_DoLog DEBUG "Extra config args passed : '${extra_config[*]}'"
|
||||
CT_DoLog DEBUG "Extra CFLAGS passed : '${glibc_cflags}'"
|
||||
CT_DoLog DEBUG "Placing startfiles into : '${startfiles_dir}'"
|
||||
CT_DoLog DEBUG "Configuring with --host : '${multi_target}'"
|
||||
|
||||
# CFLAGS are only applied when compiling .c files. .S files are compiled with ASFLAGS,
|
||||
# but they are not passed by configure. Thus, pass everything in CC instead.
|
||||
CT_DoExecLog CFG \
|
||||
BUILD_CC="${CT_BUILD}-gcc" \
|
||||
CFLAGS="${glibc_cflags}" \
|
||||
CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
|
||||
BUILD_CC=${CT_BUILD}-gcc \
|
||||
CC="${CT_TARGET}-gcc ${glibc_cflags}" \
|
||||
AR=${CT_TARGET}-ar \
|
||||
RANLIB=${CT_TARGET}-ranlib \
|
||||
"${CONFIG_SHELL}" \
|
||||
"${src_dir}/configure" \
|
||||
--prefix=/usr \
|
||||
--build=${CT_BUILD} \
|
||||
--host=${target} \
|
||||
--host=${multi_target} \
|
||||
--cache-file="$(pwd)/config.cache" \
|
||||
--without-cvs \
|
||||
--disable-profile \
|
||||
@ -409,13 +294,14 @@ do_libc_backend_once() {
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "${libc_headers}" = "y" ]; then
|
||||
if [ "${libc_mode}" = "startfiles" -a ! -r "${multi_root}/.libc_headers_installed" ]; then
|
||||
CT_DoLog EXTRA "Installing C library headers"
|
||||
CT_DoExecLog ALL touch "${multi_root}/.libc_headers_installed"
|
||||
|
||||
# use the 'install-headers' makefile target to install the
|
||||
# headers
|
||||
CT_DoExecLog ALL ${make} ${JOBSFLAGS} \
|
||||
install_root=${CT_SYSROOT_DIR}${extra_dir} \
|
||||
install_root=${multi_root} \
|
||||
install-bootstrap-headers=yes \
|
||||
"${extra_make_args[@]}" \
|
||||
install-headers
|
||||
@ -456,47 +342,52 @@ do_libc_backend_once() {
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
fi # libc_headers == y
|
||||
elif [ "${libc_mode}" = "final" -a -r "${multi_root}/.libc_headers_installed" ]; then
|
||||
CT_DoExecLog ALL rm -f "${multi_root}/.libc_headers_installed"
|
||||
fi # installing headers
|
||||
|
||||
if [ "${libc_startfiles}" = "y" ]; then
|
||||
if [ "${libc_mode}" = "startfiles" ]; then
|
||||
if [ "${CT_THREADS}" = "nptl" ]; then
|
||||
CT_DoLog EXTRA "Installing C library start files"
|
||||
|
||||
# there are a few object files needed to link shared libraries,
|
||||
# which we build and install by hand
|
||||
CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
|
||||
CT_DoExecLog ALL mkdir -p "${startfiles_dir}"
|
||||
CT_DoExecLog ALL ${make} ${JOBSFLAGS} \
|
||||
"${extra_make_args[@]}" \
|
||||
"${extra_make_args[@]}" \
|
||||
csu/subdir_lib
|
||||
CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
|
||||
"${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
|
||||
"${startfiles_dir}"
|
||||
|
||||
# Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
|
||||
# However, since we will never actually execute its code,
|
||||
# it doesn't matter what it contains. So, treating '/dev/null'
|
||||
# as a C source file, we produce a dummy 'libc.so' in one step
|
||||
CT_DoExecLog ALL "${cross_cc}" ${extra_flags} \
|
||||
-nostdlib \
|
||||
-nostartfiles \
|
||||
-shared \
|
||||
-x c /dev/null \
|
||||
-o "${CT_SYSROOT_DIR}${extra_dir}/usr/lib/libc.so"
|
||||
CT_DoExecLog ALL "${CT_TARGET}-gcc" ${multi_flags} \
|
||||
-nostdlib \
|
||||
-nostartfiles \
|
||||
-shared \
|
||||
-x c /dev/null \
|
||||
-o "${startfiles_dir}/libc.so"
|
||||
fi # threads == nptl
|
||||
fi # libc_headers == y
|
||||
fi # libc_mode = startfiles
|
||||
|
||||
if [ "${libc_full}" = "y" ]; then
|
||||
if [ "${libc_mode}" = "final" ]; then
|
||||
CT_DoLog EXTRA "Building C library"
|
||||
CT_DoExecLog ALL ${make} ${JOBSFLAGS} \
|
||||
"${extra_make_args[@]}" \
|
||||
all
|
||||
|
||||
CT_DoLog EXTRA "Installing C library"
|
||||
CT_DoExecLog ALL ${make} ${JOBSFLAGS} \
|
||||
"${extra_make_args[@]}" \
|
||||
install_root="${CT_SYSROOT_DIR}${extra_dir}" \
|
||||
CT_DoExecLog ALL ${make} ${JOBSFLAGS} \
|
||||
"${extra_make_args[@]}" \
|
||||
install_root="${multi_root}" \
|
||||
install
|
||||
|
||||
if [ "${CT_BUILD_MANUALS}" = "y" ]; then
|
||||
if [ "${CT_BUILD_MANUALS}" = "y" -a "${multi_index}" = "${multi_count}" ]; then
|
||||
# We only need to build the manuals once. Only build them on the
|
||||
# last multilib target. If it's not multilib, it will happen on the
|
||||
# only target.
|
||||
CT_DoLog EXTRA "Building and installing the C library manual"
|
||||
# Omit JOBSFLAGS as GLIBC has problems building the
|
||||
# manuals in parallel
|
||||
@ -507,10 +398,12 @@ do_libc_backend_once() {
|
||||
${CT_PREFIX_DIR}/share/doc
|
||||
fi
|
||||
|
||||
if [ "${CT_LIBC_LOCALES}" = "y" ]; then
|
||||
if [ "${CT_LIBC_LOCALES}" = "y" -a "${multi_index}" = "${multi_count}" ]; then
|
||||
do_libc_locales
|
||||
fi
|
||||
fi # libc_full == y
|
||||
fi # libc_mode = final
|
||||
|
||||
CT_EndStep
|
||||
}
|
||||
|
||||
# Build up the addons list, separated with $1
|
||||
|
@ -23,10 +23,6 @@ do_libc_extract() {
|
||||
CT_Popd
|
||||
}
|
||||
|
||||
do_libc_check_config() {
|
||||
:
|
||||
}
|
||||
|
||||
do_set_mingw_install_prefix(){
|
||||
MINGW_INSTALL_PREFIX=/usr/${CT_TARGET}
|
||||
if [[ ${CT_WINAPI_VERSION} == 2* ]]; then
|
||||
|
@ -16,10 +16,6 @@ do_libc_extract() {
|
||||
CT_Patch "musl" "${CT_LIBC_VERSION}"
|
||||
}
|
||||
|
||||
do_libc_check_config() {
|
||||
:
|
||||
}
|
||||
|
||||
# Build and install headers and start files
|
||||
do_libc_start_files() {
|
||||
# Start files and Headers should be configured the same way as the
|
||||
@ -36,37 +32,52 @@ do_libc_post_cc() {
|
||||
:
|
||||
}
|
||||
|
||||
# This backend builds the C library
|
||||
# Usage: do_libc_backend param=value [...]
|
||||
# Parameter : Definition : Type : Default
|
||||
# libc_mode : 'startfiles' or 'final' : string : (none)
|
||||
do_libc_backend() {
|
||||
local libc_mode
|
||||
local -a extra_cflags
|
||||
local -a extra_config
|
||||
local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
|
||||
local libc_headers libc_startfiles libc_full
|
||||
local arg
|
||||
|
||||
for arg in "$@"; do
|
||||
eval "${arg// /\\ }"
|
||||
done
|
||||
|
||||
case "${libc_mode}" in
|
||||
startfiles)
|
||||
CT_DoStep INFO "Installing C library headers & start files"
|
||||
libc_headers=y
|
||||
libc_startfiles=y
|
||||
libc_full=
|
||||
;;
|
||||
final)
|
||||
CT_DoStep INFO "Installing C library"
|
||||
libc_headers=
|
||||
libc_startfiles=
|
||||
libc_full=y
|
||||
;;
|
||||
*) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
|
||||
startfiles) CT_DoStep INFO "Installing C library headers & start files";;
|
||||
final) CT_DoStep INFO "Installing C library";;
|
||||
*) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
|
||||
esac
|
||||
|
||||
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}"
|
||||
CT_IterateMultilibs do_libc_backend_once multilib libc_mode="${libc_mode}"
|
||||
CT_Popd
|
||||
CT_EndStep
|
||||
}
|
||||
|
||||
# This backend builds the C library
|
||||
# Usage: do_libc_backend param=value [...]
|
||||
# Parameter : Definition : Type : Default
|
||||
# libc_mode : 'startfiles' or 'final' : string : (none)
|
||||
do_libc_backend_once() {
|
||||
local libc_mode
|
||||
local -a extra_cflags
|
||||
local -a extra_config
|
||||
local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
|
||||
local multi_dir multi_os_dir multi_root multi_flags multi_index multi_count
|
||||
local multilib_dir
|
||||
local hdr_install_subdir
|
||||
local arg f l
|
||||
|
||||
for arg in "$@"; do
|
||||
eval "${arg// /\\ }"
|
||||
done
|
||||
|
||||
CT_DoStep INFO "Building for multilib ${multi_index}/${multi_count}: '${multi_flags}'"
|
||||
|
||||
multilib_dir="/usr/lib/${multi_os_dir}"
|
||||
CT_SanitizeVarDir multilib_dir
|
||||
CT_DoExecLog ALL mkdir -p "${multi_root}${multilib_dir}"
|
||||
|
||||
extra_cflags=( ${multi_flags} )
|
||||
|
||||
# From buildroot:
|
||||
# gcc constant folding bug with weak aliases workaround
|
||||
# See http://www.openwall.com/lists/musl/2014/05/15/1
|
||||
@ -84,42 +95,64 @@ do_libc_backend() {
|
||||
|
||||
extra_config+=( "--enable-optimize=${CT_LIBC_MUSL_OPTIMIZE}" )
|
||||
|
||||
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}"
|
||||
# Same problem as with uClibc: different variants sometimes have
|
||||
# incompatible headers.
|
||||
CT_DoArchMUSLHeaderDir hdr_install_subdir "${multi_flags}"
|
||||
if [ -n "${hdr_install_subdir}" ]; then
|
||||
extra_config+=( "--includedir=/usr/include/${hdr_install_subdir}" )
|
||||
fi
|
||||
|
||||
# NOTE: musl handles the build/host/target a little bit differently
|
||||
# then one would expect:
|
||||
# build : not used
|
||||
# host : the machine building musl
|
||||
# host : same as --target
|
||||
# target : the machine musl runs on
|
||||
CT_DoExecLog CFG \
|
||||
CFLAGS="${extra_cflags[@]}" \
|
||||
CROSS_COMPILE="${CT_TARGET}-" \
|
||||
${src_dir}/configure \
|
||||
--host="${CT_TARGET}" \
|
||||
--target="${CT_TARGET}" \
|
||||
--prefix="/usr" \
|
||||
--disable-gcc-wrapper \
|
||||
CT_DoExecLog CFG \
|
||||
CFLAGS="${extra_cflags[*]}" \
|
||||
CROSS_COMPILE="${CT_TARGET}-" \
|
||||
${src_dir}/configure \
|
||||
--host="${multi_target}" \
|
||||
--target="${multi_target}" \
|
||||
--prefix="/usr" \
|
||||
--libdir="${multilib_dir}" \
|
||||
--disable-gcc-wrapper \
|
||||
"${extra_config[@]}"
|
||||
|
||||
if [ "${libc_headers}" = "y" ]; then
|
||||
if [ "${libc_mode}" = "startfiles" ]; then
|
||||
CT_DoLog EXTRA "Installing C library headers"
|
||||
CT_DoExecLog ALL ${make} DESTDIR="${CT_SYSROOT_DIR}" install-headers
|
||||
fi
|
||||
if [ "${libc_startfiles}" = "y" ]; then
|
||||
CT_DoExecLog ALL ${make} DESTDIR="${multi_root}" install-headers
|
||||
CT_DoLog EXTRA "Building C library start files"
|
||||
CT_DoExecLog ALL ${make} DESTDIR="${CT_SYSROOT_DIR}" \
|
||||
CT_DoExecLog ALL ${make} DESTDIR="${multi_root}" \
|
||||
obj/crt/crt1.o obj/crt/crti.o obj/crt/crtn.o
|
||||
CT_DoLog EXTRA "Installing C library start files"
|
||||
CT_DoExecLog ALL cp -av obj/crt/crt*.o "${CT_SYSROOT_DIR}/usr/lib"
|
||||
CT_DoExecLog ALL cp -av obj/crt/crt*.o "${multi_root}${multilib_dir}"
|
||||
CT_DoExecLog ALL ${CT_TARGET}-gcc -nostdlib \
|
||||
-nostartfiles -shared -x c /dev/null -o "${CT_SYSROOT_DIR}/usr/lib/libc.so"
|
||||
-nostartfiles -shared -x c /dev/null -o "${multi_root}${multilib_dir}/libc.so"
|
||||
fi
|
||||
if [ "${libc_full}" = "y" ]; then
|
||||
if [ "${libc_mode}" = "final" ]; then
|
||||
CT_DoLog EXTRA "Cleaning up start files"
|
||||
CT_DoExecLog ALL rm -f "${multi_root}${multilib_dir}/crt1.o" \
|
||||
"${multi_root}${multilib_dir}/crti.o" \
|
||||
"${multi_root}${multilib_dir}/crtn.o" \
|
||||
"${multi_root}${multilib_dir}/libc.so"
|
||||
|
||||
CT_DoLog EXTRA "Building C library"
|
||||
CT_DoExecLog ALL ${make} ${JOBSFLAGS}
|
||||
|
||||
CT_DoLog EXTRA "Installing C library"
|
||||
CT_DoExecLog ALL ${make} DESTDIR="${CT_SYSROOT_DIR}" install
|
||||
CT_DoExecLog ALL ${make} DESTDIR="${multi_root}" install
|
||||
|
||||
# Convert /lib/ld-* symlinks to relative paths so that they are valid
|
||||
# both on the host and on the target.
|
||||
for f in ${multi_root}/ld-musl-*; do
|
||||
[ -L "${f}" ] || continue
|
||||
l=$( readlink ${f} )
|
||||
case "${l}" in
|
||||
${multilib_dir}/*)
|
||||
CT_DoExecLog ALL ln -sf "../${l}" "${f}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
CT_EndStep
|
||||
|
@ -38,10 +38,6 @@ do_libc_extract() {
|
||||
fi
|
||||
}
|
||||
|
||||
do_libc_check_config() {
|
||||
:
|
||||
}
|
||||
|
||||
do_libc_start_files() {
|
||||
CT_DoStep INFO "Installing C library headers & start files"
|
||||
CT_DoExecLog ALL cp -a "${CT_SRC_DIR}/newlib-${CT_LIBC_VERSION}/newlib/libc/include/." \
|
||||
|
@ -10,10 +10,6 @@ do_libc_extract() {
|
||||
:
|
||||
}
|
||||
|
||||
do_libc_check_config() {
|
||||
:
|
||||
}
|
||||
|
||||
do_libc_start_files() {
|
||||
:
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
# This is a constant because it does not change very often.
|
||||
# We're in 2010, and are still using data from 7 years ago.
|
||||
uclibc_locales_version=030818
|
||||
uclibc_local_tarball="uClibc-locale-${uclibc_locales_version}"
|
||||
uclibc_locale_tarball="uClibc-locale-${uclibc_locales_version}"
|
||||
|
||||
if [ "${CT_LIBC_UCLIBC_NG}" = "y" ]; then
|
||||
uclibc_name="uClibc-ng"
|
||||
@ -26,7 +26,7 @@ do_libc_get() {
|
||||
fi
|
||||
# uClibc locales
|
||||
if [ "${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" = "y" ]; then
|
||||
CT_GetFile "${uclibc_local_tarball}" ${libc_src}
|
||||
CT_GetFile "${uclibc_locale_tarball}" ${libc_src}
|
||||
fi
|
||||
|
||||
return 0
|
||||
@ -41,197 +41,208 @@ do_libc_extract() {
|
||||
# Extracting pregen locales ourselves is kinda
|
||||
# broken, so just link it in place...
|
||||
if [ "${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" = "y" \
|
||||
-a ! -f "${CT_SRC_DIR}/.${uclibc_local_tarball}.extracted" ]; then
|
||||
-a ! -f "${CT_SRC_DIR}/.${uclibc_locale_tarball}.extracted" ]; then
|
||||
CT_Pushd "${CT_SRC_DIR}/${uclibc_name}-${CT_LIBC_VERSION}/extra/locale"
|
||||
CT_DoExecLog ALL ln -s "${CT_TARBALLS_DIR}/${uclibc_local_tarball}.tgz" .
|
||||
CT_DoExecLog ALL ln -s "${CT_TARBALLS_DIR}/${uclibc_locale_tarball}.tgz" .
|
||||
CT_Popd
|
||||
touch "${CT_SRC_DIR}/.${uclibc_local_tarball}.extracted"
|
||||
touch "${CT_SRC_DIR}/.${uclibc_locale_tarball}.extracted"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Check that uClibc has been previously configured
|
||||
do_libc_check_config() {
|
||||
CT_DoStep INFO "Checking C library configuration"
|
||||
# Build and install headers and start files
|
||||
do_libc_start_files() {
|
||||
# Start files and Headers should be configured the same way as the
|
||||
# final libc, but built and installed differently.
|
||||
do_libc_backend libc_mode=startfiles
|
||||
}
|
||||
|
||||
# This function builds and install the full C library
|
||||
do_libc() {
|
||||
do_libc_backend libc_mode=final
|
||||
}
|
||||
|
||||
# Common backend for 1st and 2nd passes.
|
||||
do_libc_backend() {
|
||||
local libc_mode
|
||||
local arg
|
||||
|
||||
for arg in "$@"; do
|
||||
eval "${arg// /\\ }"
|
||||
done
|
||||
|
||||
case "${libc_mode}" in
|
||||
startfiles) CT_DoStep INFO "Installing C library headers & start files";;
|
||||
final) CT_DoStep INFO "Installing C library";;
|
||||
*) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
|
||||
esac
|
||||
|
||||
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}"
|
||||
CT_IterateMultilibs do_libc_backend_once multilib libc_mode="${libc_mode}"
|
||||
|
||||
|
||||
CT_Popd
|
||||
CT_EndStep
|
||||
}
|
||||
|
||||
# Common backend for 1st and 2nd passes, once per multilib.
|
||||
do_libc_backend_once() {
|
||||
local libc_mode
|
||||
local multi_dir multi_os_dir multi_root multi_flags multi_index multi_count
|
||||
local multilib_dir startfiles_dir
|
||||
local jflag=${CT_LIBC_UCLIBC_PARALLEL:+${JOBSFLAGS}}
|
||||
local -a make_args
|
||||
local extra_cflags f cfg_cflags cf
|
||||
local hdr_install_subdir
|
||||
|
||||
for arg in "$@"; do
|
||||
eval "${arg// /\\ }"
|
||||
done
|
||||
|
||||
CT_DoStep INFO "Building for multilib ${multi_index}/${multi_count}: '${multi_flags}'"
|
||||
|
||||
# Simply copy files until uClibc has the ability to build out-of-tree
|
||||
CT_DoLog EXTRA "Copying sources to build dir"
|
||||
CT_DoExecLog ALL cp -aT "${CT_SRC_DIR}/${uclibc_name}-${CT_LIBC_VERSION}" .
|
||||
|
||||
multilib_dir="lib/${multi_os_dir}"
|
||||
startfiles_dir="${multi_root}/usr/${multilib_dir}"
|
||||
CT_SanitizeVarDir multilib_dir startfiles_dir
|
||||
|
||||
# Construct make arguments:
|
||||
# - uClibc uses the CROSS environment variable as a prefix to the compiler
|
||||
# tools to use. Since it requires core pass-1, thusly named compiler is
|
||||
# already available.
|
||||
# - Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak,
|
||||
# depending on the configuration of the library. That is, they are tailored
|
||||
# to best fit the target. So it is useless and seems to be a bad thing to
|
||||
# use LIBC_EXTRA_CFLAGS here.
|
||||
# - We do _not_ want to strip anything for now, in case we specifically
|
||||
# asked for a debug toolchain, thus the STRIPTOOL= assignment.
|
||||
make_args=( CROSS_COMPILE="${CT_TARGET}-" \
|
||||
PREFIX="${multi_root}/" \
|
||||
MULTILIB_DIR="${multilib_dir}" \
|
||||
LOCALE_DATA_FILENAME="${uclibc_locale_tarball}.tgz" \
|
||||
STRIPTOOL=true \
|
||||
${CT_LIBC_UCLIBC_VERBOSITY} \
|
||||
)
|
||||
|
||||
# Force the date of the pregen locale data, as the
|
||||
# newer ones that are referenced are not available
|
||||
CT_DoLog EXTRA "Applying configuration"
|
||||
|
||||
# Use the default config if the user did not provide one.
|
||||
if [ -z "${CT_LIBC_UCLIBC_CONFIG_FILE}" ]; then
|
||||
CT_LIBC_UCLIBC_CONFIG_FILE="${CT_LIB_DIR}/contrib/uClibc-defconfigs/${uclibc_name}.config"
|
||||
fi
|
||||
|
||||
if ${grep} -E '^KERNEL_SOURCE=' "${CT_LIBC_UCLIBC_CONFIG_FILE}" >/dev/null 2>&1; then
|
||||
CT_DoLog WARN "Your uClibc version refers to the kernel _sources_, which is bad."
|
||||
CT_DoLog WARN "I can't guarantee that our little hack will work. Please try to upgrade."
|
||||
manage_uClibc_config "${CT_LIBC_UCLIBC_CONFIG_FILE}" .config "${multi_flags}"
|
||||
CT_DoYes | CT_DoExecLog ALL ${make} "${make_args[@]}" oldconfig
|
||||
|
||||
# Now filter the multilib flags. manage_uClibc_config did the opposite of
|
||||
# what Rules.mak in uClibc would do: by the multilib's CFLAGS, it determined
|
||||
# the applicable configuration options. We don't want to pass the same options
|
||||
# in the UCLIBC_EXTRA_CFLAGS again (on some targets, the options do not correctly
|
||||
# override each other). On the other hand, we do not want to lose the options
|
||||
# that are not reflected in the .config.
|
||||
extra_cflags="-pipe"
|
||||
{ echo "include Rules.mak"; echo "show-cpu-flags:"; printf '\t@echo $(CPU_CFLAGS)\n'; } \
|
||||
> .show-cpu-cflags.mk
|
||||
cfg_cflags=$( ${make} "${make_args[@]}" \
|
||||
--no-print-directory -f .show-cpu-cflags.mk show-cpu-flags )
|
||||
CT_DoExecLog ALL rm -f .show-cpu-cflags.mk
|
||||
CT_DoLog DEBUG "CPU_CFLAGS detected by uClibc: ${cfg_cflags[@]}"
|
||||
for f in ${multi_flags}; do
|
||||
for cf in ${cfg_cflags}; do
|
||||
if [ "${f}" = "${cf}" ]; then
|
||||
f=
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ -n "${f}" ]; then
|
||||
extra_cflags+=" ${f}"
|
||||
fi
|
||||
done
|
||||
CT_DoLog DEBUG "Filtered multilib CFLAGS: ${extra_cflags}"
|
||||
make_args+=( UCLIBC_EXTRA_CFLAGS="${extra_cflags}" )
|
||||
|
||||
# uClibc does not have a way to select the installation subdirectory for headers,
|
||||
# it is always $(DEVEL_PREFIX)/include. Also, we're reinstalling the headers
|
||||
# at the final stage (see the note below), we may already have the subdirectory
|
||||
# in /usr/include.
|
||||
CT_DoArchUClibcHeaderDir hdr_install_subdir "${multi_flags}"
|
||||
if [ -n "${hdr_install_subdir}" ]; then
|
||||
CT_DoExecLog ALL cp -a "${multi_root}/usr/include" "${multi_root}/usr/include.saved"
|
||||
fi
|
||||
|
||||
CT_DoLog EXTRA "Manage uClibc configuration"
|
||||
manage_uClibc_config "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${CT_CONFIG_DIR}/uClibc.config"
|
||||
if [ "${libc_mode}" = "startfiles" ]; then
|
||||
CT_DoLog EXTRA "Building headers"
|
||||
CT_DoExecLog ALL ${make} "${make_args[@]}" headers
|
||||
|
||||
CT_EndStep
|
||||
}
|
||||
# Ensure the directory for installing multilib-specific binaries exists.
|
||||
CT_DoExecLog ALL mkdir -p "${startfiles_dir}"
|
||||
|
||||
# Build and install headers and start files
|
||||
do_libc_start_files() {
|
||||
local cross
|
||||
CT_DoLog EXTRA "Installing headers"
|
||||
CT_DoExecLog ALL ${make} "${make_args[@]}" install_headers
|
||||
|
||||
CT_DoStep INFO "Installing C library headers"
|
||||
# The check might look bogus, but it is the same condition as is used
|
||||
# by GCC build script to enable/disable shared library support.
|
||||
if [ "${CT_THREADS}" = "nptl" ]; then
|
||||
CT_DoLog EXTRA "Building start files"
|
||||
CT_DoExecLog ALL ${make} ${jflag} "${make_args[@]}" \
|
||||
lib/crt1.o lib/crti.o lib/crtn.o
|
||||
|
||||
# Simply copy files until uClibc has the ability to build out-of-tree
|
||||
CT_DoLog EXTRA "Copying sources to build dir"
|
||||
CT_DoExecLog ALL cp -av "${CT_SRC_DIR}/${uclibc_name}-${CT_LIBC_VERSION}" \
|
||||
"${CT_BUILD_DIR}/build-libc-headers"
|
||||
cd "${CT_BUILD_DIR}/build-libc-headers"
|
||||
# From: http://git.openembedded.org/cgit.cgi/openembedded/commit/?id=ad5668a7ac7e0436db92e55caaf3fdf782b6ba3b
|
||||
# libm.so is needed for ppc, as libgcc is linked against libm.so
|
||||
# No problem to create it for other archs.
|
||||
CT_DoLog EXTRA "Building dummy shared libs"
|
||||
CT_DoExecLog ALL "${CT_TARGET}-gcc" -nostdlib -nostartfiles \
|
||||
-shared ${multi_flags} -x c /dev/null -o libdummy.so
|
||||
|
||||
# Retrieve the config file
|
||||
CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/uClibc.config" .config
|
||||
CT_DoLog EXTRA "Installing start files"
|
||||
CT_DoExecLog ALL ${install} -m 0644 lib/crt1.o lib/crti.o lib/crtn.o \
|
||||
"${startfiles_dir}"
|
||||
|
||||
# uClibc uses the CROSS environment variable as a prefix to the
|
||||
# compiler tools to use. Setting it to the empty string forces
|
||||
# use of the native build host tools, which we need at this
|
||||
# stage, as we don't have target tools yet.
|
||||
# BUT! With NPTL, we need a cross-compiler (and we have it)
|
||||
if [ "${CT_THREADS}" = "nptl" ]; then
|
||||
cross="${CT_TARGET}-"
|
||||
CT_DoLog EXTRA "Installing dummy shared libs"
|
||||
CT_DoExecLog ALL ${install} -m 0755 libdummy.so "${startfiles_dir}/libc.so"
|
||||
CT_DoExecLog ALL ${install} -m 0755 libdummy.so "${startfiles_dir}/libm.so"
|
||||
fi # CT_THREADS == nptl
|
||||
fi # libc_mode == startfiles
|
||||
|
||||
if [ "${libc_mode}" = "final" ]; then
|
||||
CT_DoLog EXTRA "Cleaning up startfiles"
|
||||
CT_DoExecLog ALL rm -f "${startfiles_dir}/crt1.o" \
|
||||
"${startfiles_dir}/crti.o" \
|
||||
"${startfiles_dir}/crtn.o" \
|
||||
"${startfiles_dir}/libc.so" \
|
||||
"${startfiles_dir}/libm.so"
|
||||
|
||||
CT_DoLog EXTRA "Building C library"
|
||||
CT_DoExecLog ALL ${make} "${make_args[@]}" pregen
|
||||
CT_DoExecLog ALL ${make} ${jflag} "${make_args[@]}" all
|
||||
|
||||
# YEM-FIXME:
|
||||
# - we want to install 'runtime' files, eg. lib*.{a,so*}, crti.o and
|
||||
# such files, except the headers as they already are installed
|
||||
# - "make install_dev" installs the headers, the crti.o... and the
|
||||
# static libs, but not the dynamic libs
|
||||
# - "make install_runtime" installs the dynamic libs only
|
||||
# - "make install" calls install_runtime and install_dev
|
||||
# - so we're left with re-installing the headers... Sigh...
|
||||
CT_DoLog EXTRA "Installing C library"
|
||||
CT_DoExecLog ALL ${make} "${make_args[@]}" install
|
||||
fi # libc_mode == final
|
||||
|
||||
# Now, if installing headers into a subdirectory, put everything in its place.
|
||||
# Remove the header subdirectory if it existed already.
|
||||
if [ -n "${hdr_install_subdir}" ]; then
|
||||
CT_DoExecLog ALL mv "${multi_root}/usr/include" "${multi_root}/usr/include.new"
|
||||
CT_DoExecLog ALL mv "${multi_root}/usr/include.saved" "${multi_root}/usr/include"
|
||||
CT_DoExecLog ALL rm -rf "${multi_root}/usr/include/${hdr_install_subdir}"
|
||||
CT_DoExecLog ALL mv "${multi_root}/usr/include.new" "${multi_root}/usr/include/${hdr_install_subdir}"
|
||||
fi
|
||||
|
||||
# Force the date of the pregen locale data, as the
|
||||
# newer ones that are referenced are not available
|
||||
CT_DoLog EXTRA "Applying configuration"
|
||||
CT_DoYes "" |CT_DoExecLog ALL \
|
||||
${make} CROSS_COMPILE="${cross}" \
|
||||
UCLIBC_EXTRA_CFLAGS="-pipe" \
|
||||
PREFIX="${CT_SYSROOT_DIR}/" \
|
||||
LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
|
||||
oldconfig
|
||||
|
||||
CT_DoLog EXTRA "Building headers"
|
||||
CT_DoExecLog ALL \
|
||||
${make} ${CT_LIBC_UCLIBC_VERBOSITY} \
|
||||
CROSS_COMPILE="${cross}" \
|
||||
UCLIBC_EXTRA_CFLAGS="-pipe" \
|
||||
PREFIX="${CT_SYSROOT_DIR}/" \
|
||||
LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
|
||||
headers
|
||||
|
||||
CT_DoLog EXTRA "Installing headers"
|
||||
CT_DoExecLog ALL \
|
||||
${make} ${CT_LIBC_UCLIBC_VERBOSITY} \
|
||||
CROSS_COMPILE="${cross}" \
|
||||
UCLIBC_EXTRA_CFLAGS="-pipe" \
|
||||
PREFIX="${CT_SYSROOT_DIR}/" \
|
||||
LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
|
||||
install_headers
|
||||
|
||||
if [ "${CT_THREADS}" = "nptl" ]; then
|
||||
CT_DoLog EXTRA "Building start files"
|
||||
CT_DoExecLog ALL \
|
||||
${make} ${CT_LIBC_UCLIBC_PARALLEL:+${JOBSFLAGS}} \
|
||||
CROSS_COMPILE="${cross}" \
|
||||
UCLIBC_EXTRA_CFLAGS="-pipe" \
|
||||
PREFIX="${CT_SYSROOT_DIR}/" \
|
||||
STRIPTOOL=true \
|
||||
${CT_LIBC_UCLIBC_VERBOSITY} \
|
||||
LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
|
||||
lib/crt1.o lib/crti.o lib/crtn.o
|
||||
|
||||
# From: http://git.openembedded.org/cgit.cgi/openembedded/commit/?id=ad5668a7ac7e0436db92e55caaf3fdf782b6ba3b
|
||||
# libm.so is needed for ppc, as libgcc is linked against libm.so
|
||||
# No problem to create it for other archs.
|
||||
CT_DoLog EXTRA "Building dummy shared libs"
|
||||
CT_DoExecLog ALL "${cross}gcc" -nostdlib \
|
||||
-nostartfiles \
|
||||
-shared \
|
||||
-x c /dev/null \
|
||||
-o libdummy.so
|
||||
|
||||
CT_DoLog EXTRA "Installing start files"
|
||||
CT_DoExecLog ALL ${install} -m 0644 lib/crt1.o lib/crti.o lib/crtn.o \
|
||||
"${CT_SYSROOT_DIR}/usr/lib"
|
||||
|
||||
CT_DoLog EXTRA "Installing dummy shared libs"
|
||||
CT_DoExecLog ALL ${install} -m 0755 libdummy.so "${CT_SYSROOT_DIR}/usr/lib/libc.so"
|
||||
CT_DoExecLog ALL ${install} -m 0755 libdummy.so "${CT_SYSROOT_DIR}/usr/lib/libm.so"
|
||||
fi # CT_THREADS == nptl
|
||||
|
||||
CT_EndStep
|
||||
}
|
||||
|
||||
# This function build and install the full uClibc
|
||||
do_libc() {
|
||||
CT_DoStep INFO "Installing C library"
|
||||
|
||||
# Simply copy files until uClibc has the ability to build out-of-tree
|
||||
CT_DoLog EXTRA "Copying sources to build dir"
|
||||
CT_DoExecLog ALL cp -av "${CT_SRC_DIR}/${uclibc_name}-${CT_LIBC_VERSION}" \
|
||||
"${CT_BUILD_DIR}/build-libc"
|
||||
cd "${CT_BUILD_DIR}/build-libc"
|
||||
|
||||
# Retrieve the config file
|
||||
CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/uClibc.config" .config
|
||||
|
||||
# uClibc uses the CROSS environment variable as a prefix to the compiler
|
||||
# tools to use. The newly built tools should be in our path, so we need
|
||||
# only give the correct name for them.
|
||||
# Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak,
|
||||
# depending on the configuration of the library. That is, they are tailored
|
||||
# to best fit the target. So it is useless and seems to be a bad thing to
|
||||
# use LIBC_EXTRA_CFLAGS here.
|
||||
CT_DoLog EXTRA "Applying configuration"
|
||||
CT_DoYes "" |CT_DoExecLog CFG \
|
||||
${make} CROSS_COMPILE=${CT_TARGET}- \
|
||||
UCLIBC_EXTRA_CFLAGS="-pipe" \
|
||||
PREFIX="${CT_SYSROOT_DIR}/" \
|
||||
LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
|
||||
oldconfig
|
||||
|
||||
# We do _not_ want to strip anything for now, in case we specifically
|
||||
# asked for a debug toolchain, thus the STRIPTOOL= assignment
|
||||
# /Old/ versions can not build in //
|
||||
CT_DoLog EXTRA "Building C library"
|
||||
CT_DoExecLog ALL \
|
||||
${make} -j1 \
|
||||
CROSS_COMPILE=${CT_TARGET}- \
|
||||
UCLIBC_EXTRA_CFLAGS="-pipe" \
|
||||
PREFIX="${CT_SYSROOT_DIR}/" \
|
||||
STRIPTOOL=true \
|
||||
${CT_LIBC_UCLIBC_VERBOSITY} \
|
||||
LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
|
||||
pregen
|
||||
CT_DoExecLog ALL \
|
||||
${make} ${CT_LIBC_UCLIBC_PARALLEL:+${JOBSFLAGS}} \
|
||||
CROSS_COMPILE=${CT_TARGET}- \
|
||||
UCLIBC_EXTRA_CFLAGS="-pipe" \
|
||||
PREFIX="${CT_SYSROOT_DIR}/" \
|
||||
STRIPTOOL=true \
|
||||
${CT_LIBC_UCLIBC_VERBOSITY} \
|
||||
LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
|
||||
all
|
||||
|
||||
# YEM-FIXME:
|
||||
# - we want to install 'runtime' files, eg. lib*.{a,so*}, crti.o and
|
||||
# such files, except the headers as they already are installed
|
||||
# - "make install_dev" installs the headers, the crti.o... and the
|
||||
# static libs, but not the dynamic libs
|
||||
# - "make install_runtime" installs the dynamic libs only
|
||||
# - "make install" calls install_runtime and install_dev
|
||||
# - so we're left with re-installing the headers... Sigh...
|
||||
#
|
||||
# We do _not_ want to strip anything for now, in case we specifically
|
||||
# asked for a debug toolchain, hence the STRIPTOOL= assignment
|
||||
#
|
||||
# Note: JOBSFLAGS is not usefull for installation.
|
||||
#
|
||||
CT_DoLog EXTRA "Installing C library"
|
||||
CT_DoExecLog ALL \
|
||||
${make} CROSS_COMPILE=${CT_TARGET}- \
|
||||
UCLIBC_EXTRA_CFLAGS="-pipe" \
|
||||
PREFIX="${CT_SYSROOT_DIR}/" \
|
||||
STRIPTOOL=true \
|
||||
${CT_LIBC_UCLIBC_VERBOSITY} \
|
||||
LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
|
||||
install
|
||||
|
||||
CT_EndStep
|
||||
}
|
||||
|
||||
@ -241,98 +252,11 @@ do_libc() {
|
||||
manage_uClibc_config() {
|
||||
src="$1"
|
||||
dst="$2"
|
||||
flags="$3"
|
||||
|
||||
# Start with fresh files
|
||||
CT_DoExecLog ALL rm -f "${dst}"
|
||||
CT_DoExecLog ALL mkdir -p "$(dirname ${dst})"
|
||||
CT_DoExecLog ALL cp "${src}" "${dst}"
|
||||
|
||||
# Hack our target in the config file.
|
||||
case "${CT_ARCH}:${CT_ARCH_BITNESS}" in
|
||||
x86:32) arch=i386;;
|
||||
x86:64) arch=x86_64;;
|
||||
sh:32) arch="sh";;
|
||||
*) arch="${CT_ARCH}";;
|
||||
esac
|
||||
# Also remove stripping: its the responsibility of the
|
||||
# firmware builder to strip or not.
|
||||
${sed} -i -r -e '/^TARGET_.*/d' "${dst}"
|
||||
CT_KconfigEnableOption "TARGET_${arch}" "${dst}"
|
||||
CT_KconfigSetOption "TARGET_ARCH" "${arch}" "${dst}"
|
||||
CT_KconfigDisableOption "DOSTRIP" "${dst}"
|
||||
|
||||
# Ah. We may one day need architecture-specific handler here...
|
||||
case "${arch}" in
|
||||
arm*)
|
||||
if [ "${CT_ARCH_ARM_EABI}" = "y" ]; then
|
||||
CT_KconfigDisableOption "CONFIG_ARM_OABI" "${dst}"
|
||||
CT_KconfigEnableOption "CONFIG_ARM_EABI" "${dst}"
|
||||
else
|
||||
CT_KconfigDisableOption "CONFIG_ARM_EABI" "${dst}"
|
||||
CT_KconfigEnableOption "CONFIG_ARM_OABI" "${dst}"
|
||||
fi
|
||||
;;
|
||||
i386)
|
||||
# FIXME This doesn't cover all cases of x86_32...
|
||||
case ${CT_TARGET_ARCH} in
|
||||
i386)
|
||||
CT_KconfigEnableOption "CONFIG_386" "${dst}"
|
||||
;;
|
||||
i486)
|
||||
CT_KconfigEnableOption "CONFIG_486" "${dst}"
|
||||
;;
|
||||
i586)
|
||||
CT_KconfigEnableOption "CONFIG_586" "${dst}"
|
||||
;;
|
||||
i686)
|
||||
CT_KconfigEnableOption "CONFIG_686" "${dst}"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
mips*)
|
||||
CT_KconfigDisableOption "CONFIG_MIPS_O32_ABI" "${dst}"
|
||||
CT_KconfigDisableOption "CONFIG_MIPS_N32_ABI" "${dst}"
|
||||
CT_KconfigDisableOption "CONFIG_MIPS_N64_ABI" "${dst}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_1" "${dst}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_2" "${dst}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_3" "${dst}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_4" "${dst}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_MIPS32" "${dst}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_MIPS32R2" "${dst}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_MIPS64" "${dst}"
|
||||
CT_KconfigDeleteOption "CONFIG_MIPS_ISA_MIPS64R2" "${dst}"
|
||||
case "${CT_ARCH_mips_ABI}" in
|
||||
32)
|
||||
CT_KconfigEnableOption "CONFIG_MIPS_O32_ABI" "${dst}"
|
||||
;;
|
||||
n32)
|
||||
CT_KconfigEnableOption "CONFIG_MIPS_N32_ABI" "${dst}"
|
||||
;;
|
||||
64)
|
||||
CT_KconfigEnableOption "CONFIG_MIPS_N64_ABI" "${dst}"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
powerpc*)
|
||||
CT_KconfigDisableOption "CONFIG_E500" "${dst}"
|
||||
CT_KconfigDisableOption "CONFIG_CLASSIC" "${dst}"
|
||||
CT_KconfigDeleteOption "TARGET_SUBARCH" "${dst}"
|
||||
if [ "${CT_ARCH_powerpc_ABI}" = "spe" ]; then
|
||||
CT_KconfigEnableOption "CONFIG_E500" "${dst}"
|
||||
CT_KconfigSetOption "TARGET_SUBARCH" "e500" "${dst}"
|
||||
else
|
||||
CT_KconfigEnableOption "CONFIG_CLASSIC" "${dst}"
|
||||
CT_KconfigSetOption "TARGET_SUBARCH" "classic" "${dst}"
|
||||
fi
|
||||
;;
|
||||
sh)
|
||||
# all we really support right now is sh4:32
|
||||
CT_KconfigEnableOption "CONFIG_SH4" "${dst}"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Accomodate for old and new uClibc versions, where the
|
||||
# way to select between big/little endian has changed
|
||||
case "${CT_ARCH_ENDIAN}" in
|
||||
big)
|
||||
CT_KconfigDisableOption "ARCH_LITTLE_ENDIAN" "${dst}"
|
||||
@ -348,8 +272,6 @@ manage_uClibc_config() {
|
||||
;;
|
||||
esac
|
||||
|
||||
# Accomodate for old and new uClibc versions, where the
|
||||
# MMU settings has different config knobs
|
||||
if [ "${CT_ARCH_USE_MMU}" = "y" ]; then
|
||||
CT_KconfigEnableOption "ARCH_USE_MMU" "${dst}"
|
||||
else
|
||||
@ -382,7 +304,6 @@ manage_uClibc_config() {
|
||||
# which is the correct value of ${PREFIX}/${TARGET}.
|
||||
CT_KconfigSetOption "DEVEL_PREFIX" "\"/usr/\"" "${dst}"
|
||||
CT_KconfigSetOption "RUNTIME_PREFIX" "\"/\"" "${dst}"
|
||||
CT_KconfigSetOption "SHARED_LIB_LOADER_PREFIX" "\"/lib/\"" "${dst}"
|
||||
CT_KconfigSetOption "KERNEL_HEADERS" "\"${CT_HEADERS_DIR}\"" "${dst}"
|
||||
|
||||
# Locales support
|
||||
@ -443,29 +364,23 @@ manage_uClibc_config() {
|
||||
fi
|
||||
|
||||
# Push the threading model
|
||||
CT_KconfigDisableOption "UCLIBC_HAS_THREADS" "${dst}"
|
||||
CT_KconfigDisableOption "LINUXTHREADS_OLD" "${dst}"
|
||||
CT_KconfigDisableOption "LINUXTHREADS_NEW" "${dst}"
|
||||
CT_KconfigDisableOption "UCLIBC_HAS_THREADS_NATIVE" "${dst}"
|
||||
case "${CT_THREADS}:${CT_LIBC_UCLIBC_LNXTHRD}" in
|
||||
none:)
|
||||
CT_KconfigDisableOption "UCLIBC_HAS_THREADS" "${dst}"
|
||||
CT_KconfigDisableOption "LINUXTHREADS_OLD" "${dst}"
|
||||
CT_KconfigDisableOption "LINUXTHREADS_NEW" "${dst}"
|
||||
CT_KconfigDisableOption "UCLIBC_HAS_THREADS_NATIVE" "${dst}"
|
||||
;;
|
||||
linuxthreads:old)
|
||||
CT_KconfigEnableOption "UCLIBC_HAS_THREADS" "${dst}"
|
||||
CT_KconfigEnableOption "LINUXTHREADS_OLD" "${dst}"
|
||||
CT_KconfigDisableOption "LINUXTHREADS_NEW" "${dst}"
|
||||
CT_KconfigDisableOption "UCLIBC_HAS_THREADS_NATIVE" "${dst}"
|
||||
;;
|
||||
linuxthreads:new)
|
||||
CT_KconfigEnableOption "UCLIBC_HAS_THREADS" "${dst}"
|
||||
CT_KconfigDisableOption "LINUXTHREADS_OLD" "${dst}"
|
||||
CT_KconfigEnableOption "LINUXTHREADS_NEW" "${dst}"
|
||||
CT_KconfigDisableOption "UCLIBC_HAS_THREADS_NATIVE" "${dst}"
|
||||
;;
|
||||
nptl:)
|
||||
CT_KconfigEnableOption "UCLIBC_HAS_THREADS" "${dst}"
|
||||
CT_KconfigDisableOption "LINUXTHREADS_OLD" "${dst}"
|
||||
CT_KconfigDisableOption "LINUXTHREADS_NEW" "${dst}"
|
||||
CT_KconfigEnableOption "UCLIBC_HAS_THREADS_NATIVE" "${dst}"
|
||||
;;
|
||||
*)
|
||||
@ -477,29 +392,22 @@ manage_uClibc_config() {
|
||||
CT_KconfigEnableOption "PTHREADS_DEBUG_SUPPORT" "${dst}"
|
||||
|
||||
# Force on debug options if asked for
|
||||
CT_KconfigDisableOption "DODEBUG" "${dst}"
|
||||
CT_KconfigDisableOption "DODEBUG_PT" "${dst}"
|
||||
CT_KconfigDisableOption "DOASSERTS" "${dst}"
|
||||
CT_KconfigDisableOption "SUPPORT_LD_DEBUG" "${dst}"
|
||||
CT_KconfigDisableOption "SUPPORT_LD_DEBUG_EARLY" "${dst}"
|
||||
CT_KconfigDisableOption "UCLIBC_MALLOC_DEBUGGING" "${dst}"
|
||||
case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
|
||||
0)
|
||||
CT_KconfigDisableOption "DODEBUG" "${dst}"
|
||||
CT_KconfigDisableOption "DODEBUG_PT" "${dst}"
|
||||
CT_KconfigDisableOption "DOASSERTS" "${dst}"
|
||||
CT_KconfigDisableOption "SUPPORT_LD_DEBUG" "${dst}"
|
||||
CT_KconfigDisableOption "SUPPORT_LD_DEBUG_EARLY" "${dst}"
|
||||
CT_KconfigDisableOption "UCLIBC_MALLOC_DEBUGGING" "${dst}"
|
||||
;;
|
||||
1)
|
||||
CT_KconfigEnableOption "DODEBUG" "${dst}"
|
||||
CT_KconfigDisableOption "DODEBUG_PT" "${dst}"
|
||||
CT_KconfigDisableOption "DOASSERTS" "${dst}"
|
||||
CT_KconfigDisableOption "SUPPORT_LD_DEBUG" "${dst}"
|
||||
CT_KconfigDisableOption "SUPPORT_LD_DEBUG_EARLY" "${dst}"
|
||||
CT_KconfigDisableOption "UCLIBC_MALLOC_DEBUGGING" "${dst}"
|
||||
;;
|
||||
2)
|
||||
CT_KconfigEnableOption "DODEBUG" "${dst}"
|
||||
CT_KconfigDisableOption "DODEBUG_PT" "${dst}"
|
||||
CT_KconfigEnableOption "DOASSERTS" "${dst}"
|
||||
CT_KconfigEnableOption "SUPPORT_LD_DEBUG" "${dst}"
|
||||
CT_KconfigDisableOption "SUPPORT_LD_DEBUG_EARLY" "${dst}"
|
||||
CT_KconfigEnableOption "UCLIBC_MALLOC_DEBUGGING" "${dst}"
|
||||
;;
|
||||
3)
|
||||
@ -511,8 +419,69 @@ manage_uClibc_config() {
|
||||
CT_KconfigEnableOption "UCLIBC_MALLOC_DEBUGGING" "${dst}"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Remove stripping: its the responsibility of the
|
||||
# firmware builder to strip or not.
|
||||
CT_KconfigDisableOption "DOSTRIP" "${dst}"
|
||||
|
||||
# Now allow architecture to tweak as it wants
|
||||
CT_DoArchUClibcConfig "${dst}"
|
||||
CT_DoArchUClibcCflags "${dst}" "${flags}"
|
||||
}
|
||||
|
||||
do_libc_post_cc() {
|
||||
:
|
||||
# uClibc and GCC disagree where the dynamic linker lives. uClibc always
|
||||
# places it in the MULTILIB_DIR, while gcc does that for *some* variants
|
||||
# and expects it in /lib for the other. So, create a symlink from lib
|
||||
# to the actual location, but only if that will not override the actual
|
||||
# file in /lib. Thus, need to do this after all the variants are built.
|
||||
# Moreover, need to do this after the final compiler is built: on targets
|
||||
# that use elf2flt, the core compilers cannot find ld when running elf2flt.
|
||||
CT_DoStep INFO "Checking dynamic linker symlinks"
|
||||
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-post_cc"
|
||||
echo "int main(void) { return 0; }" > test-ldso.c
|
||||
CT_IterateMultilibs do_libc_ldso_fixup ldso_fixup
|
||||
CT_Popd
|
||||
CT_EndStep
|
||||
}
|
||||
|
||||
do_libc_ldso_fixup() {
|
||||
local multi_dir multi_os_dir multi_root multi_flags multi_index multi_count
|
||||
local binary
|
||||
local ldso ldso_f ldso_d multilib_dir
|
||||
|
||||
for arg in "$@"; do
|
||||
eval "${arg// /\\ }"
|
||||
done
|
||||
|
||||
CT_DoLog EXTRA "Checking dynamic linker for multilib '${multi_flags}'"
|
||||
|
||||
multilib_dir="/lib/${multi_os_dir}"
|
||||
CT_SanitizeVarDir multilib_dir
|
||||
|
||||
CT_DoExecLog ALL "${CT_TARGET}-gcc" -o test-ldso ../test-ldso.c ${multi_flags}
|
||||
if [ -r "test-ldso.gdb" ]; then
|
||||
binary="test-ldso.gdb"
|
||||
else
|
||||
binary="test-ldso"
|
||||
fi
|
||||
if ${CT_TARGET}-readelf -Wl "${binary}" | grep -q 'Requesting program interpreter: '; then
|
||||
ldso=$( ${CT_TARGET}-readelf -Wl "${binary}" | \
|
||||
grep 'Requesting program interpreter: ' | \
|
||||
sed -e 's,.*: ,,' -e 's,\].*,,' )
|
||||
fi
|
||||
CT_DoLog DEBUG "Detected dynamic linker for multilib '${multi_flags}': '${ldso}'"
|
||||
|
||||
ldso_d="${ldso%/ld*.so.*}"
|
||||
ldso_f="${ldso##*/}"
|
||||
# Create symlink if GCC produced an executable, dynamically linked, it was requesting
|
||||
# a linker not in the current directory, and there is no such file in the expected
|
||||
# ldso dir.
|
||||
if [ -n "${ldso}" -a "${ldso_d}" != "${multilib_dir}" -a ! -r "${multi_root}${ldso}" ]; then
|
||||
# Convert ldso_d to "how many levels we need to go up" and remove
|
||||
# leading slash.
|
||||
ldso_d=$( echo "${ldso_d#/}" | sed 's,[^/]\+,..,g' )
|
||||
CT_DoExecLog ALL ln -sf "${ldso_d}${multilib_dir}/${ldso_f}" \
|
||||
"${multi_root}${ldso}"
|
||||
fi
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ CT_DoLog INFO "Building environment variables"
|
||||
# Include sub-scripts instead of calling them: that way, we do not have to
|
||||
# export any variable, nor re-parse the configuration and functions files.
|
||||
. "${CT_LIB_DIR}/scripts/build/internals.sh"
|
||||
. "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
|
||||
. "${CT_LIB_DIR}/scripts/build/arch.sh"
|
||||
. "${CT_LIB_DIR}/scripts/build/companion_tools.sh"
|
||||
. "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh"
|
||||
. "${CT_LIB_DIR}/scripts/build/companion_libs.sh"
|
||||
@ -181,7 +181,6 @@ CT_SRC_DIR="${CT_WORK_DIR}/src"
|
||||
CT_BUILD_DIR="${CT_WORK_DIR}/${CT_TARGET}/build"
|
||||
CT_BUILDTOOLS_PREFIX_DIR="${CT_WORK_DIR}/${CT_TARGET}/buildtools"
|
||||
CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state"
|
||||
CT_CONFIG_DIR="${CT_BUILD_DIR}/configs"
|
||||
# Note about HOST_COMPLIBS_DIR: it's always gonna be in the buildtools dir, or a
|
||||
# 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;
|
||||
@ -266,7 +265,6 @@ CT_DoExecLog ALL mkdir -p "${CT_TARBALLS_DIR}"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_BUILD_DIR}"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_CONFIG_DIR}"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_INSTALL_DIR}"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_HOST_COMPLIBS_DIR}"
|
||||
@ -292,13 +290,13 @@ if [ -z "${CT_RESTART}" ]; then
|
||||
*/*) CT_Abort "Sysroot name contains forbidden slash(es): '${CT_SYSROOT_NAME}'";;
|
||||
esac
|
||||
|
||||
# Arrange paths depending on wether we use sysroot or not.
|
||||
# Arrange paths depending on whether we use sysroot or not.
|
||||
if [ "${CT_USE_SYSROOT}" = "y" ]; then
|
||||
CT_SYSROOT_REL_DIR="${CT_SYSROOT_DIR_PREFIX:+${CT_SYSROOT_DIR_PREFIX}/}${CT_SYSROOT_NAME}"
|
||||
CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_REL_DIR}"
|
||||
CT_DEBUGROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/debug-root"
|
||||
CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
|
||||
CT_SanitiseVarDir CT_SYSROOT_REL_DIR CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR
|
||||
CT_SanitizeVarDir CT_SYSROOT_REL_DIR CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR
|
||||
BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
|
||||
CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
|
||||
CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
|
||||
@ -312,7 +310,7 @@ if [ -z "${CT_RESTART}" ]; then
|
||||
CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
|
||||
CT_DEBUGROOT_DIR="${CT_SYSROOT_DIR}"
|
||||
CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
|
||||
CT_SanitiseVarDir CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR
|
||||
CT_SanitizeVarDir CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR
|
||||
# hack! Always use --with-sysroot for binutils.
|
||||
# binutils 2.14 and later obey it, older binutils ignore it.
|
||||
# Lets you build a working 32->64 bit cross gcc
|
||||
@ -325,40 +323,14 @@ if [ -z "${CT_RESTART}" ]; then
|
||||
fi
|
||||
CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_DEBUGROOT_DIR}"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_HEADERS_DIR}"
|
||||
|
||||
# Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
|
||||
# 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail
|
||||
# with: "ld: cannot open crti.o: No such file or directory"
|
||||
# Also prepare the lib directory in the install dir, else some 64 bit archs
|
||||
# won't build
|
||||
# Need the non-multilib directories: GCC's multi-os-directory is based off them, so
|
||||
# even if the /lib is not used for any of the multilibs, it must be present so that
|
||||
# the paths like 'lib/../lib64' still work.
|
||||
CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/lib"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/lib"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
|
||||
CT_DoExecLog ALL mkdir -p "${CT_HEADERS_DIR}"
|
||||
|
||||
if [ "${CT_USE_SYSROOT}" = "y" ]; then
|
||||
# Prevent gcc from installing its libraries outside of the sysroot
|
||||
CT_Pushd "${CT_PREFIX_DIR}/${CT_TARGET}"
|
||||
CT_DoExecLog ALL ln -sf "${CT_SYSROOT_REL_DIR}/lib" "lib"
|
||||
CT_Popd
|
||||
fi
|
||||
|
||||
# Since we're *not* multilib on the target side, we want all the
|
||||
# libraries to end up in "lib". We create "lib64" (for 64-bit
|
||||
# build or host architectures) and "lib32" (for 32-bit emulation
|
||||
# on 64-bit) as symlinks to "lib".
|
||||
#
|
||||
# Not all of these symlinks are necessary, but better safe than
|
||||
# sorry. They are summarily removed by build/internals.sh:do_finish.
|
||||
for d in \
|
||||
"${CT_PREFIX_DIR}" \
|
||||
"${CT_SYSROOT_DIR}" \
|
||||
"${CT_SYSROOT_DIR}/usr" \
|
||||
"${CT_PREFIX_DIR}/${CT_TARGET}" \
|
||||
; do
|
||||
CT_DoExecLog ALL ln -sf "lib" "${d}/lib32"
|
||||
CT_DoExecLog ALL ln -sf "lib" "${d}/lib64"
|
||||
done
|
||||
|
||||
# Determine build system if not set by the user
|
||||
if [ -z "${CT_BUILD}" ]; then
|
||||
@ -654,6 +626,14 @@ if [ "${CT_ONLY_DOWNLOAD}" != "y" -a "${CT_ONLY_EXTRACT}" != "y" ]; then
|
||||
# sub-shell ending with !0. bash-3 does not, while bash-4 does,
|
||||
# so the following line is for bash-3; bash-4 would choke above.
|
||||
[ $? -eq 0 ]
|
||||
# Pick up environment changes.
|
||||
if [ -r "${CT_BUILD_DIR}/env.modify.sh" ]; then
|
||||
CT_DoLog DEBUG "Step '${step}' modified the environment:"
|
||||
CT_DoExecLog DEBUG cat "${CT_BUILD_DIR}/env.modify.sh"
|
||||
. "${CT_BUILD_DIR}/env.modify.sh"
|
||||
CT_DoExecLog DEBUG rm -f "${CT_BUILD_DIR}/env.modify.sh"
|
||||
|
||||
fi
|
||||
if [ "${CT_STOP}" = "${step}" ]; then
|
||||
do_stop=1
|
||||
fi
|
||||
|
@ -1,6 +1,6 @@
|
||||
# -*- mode: sh; tab-width: 4 -*-
|
||||
# vi: ts=4:sw=4:sts=4:et
|
||||
# This file contains some usefull common functions
|
||||
# This file contains some useful common functions
|
||||
# Copyright 2007 Yann E. MORIN
|
||||
# Licensed under the GPL v2. See COPYING in the root of this package
|
||||
|
||||
@ -308,21 +308,57 @@ CT_SanitizePath() {
|
||||
PATH="${new}"
|
||||
}
|
||||
|
||||
# Sanitise the directory name contained in the variable passed as argument:
|
||||
# Sanitize the directory name contained in the variable passed as argument:
|
||||
# - remove duplicate /
|
||||
# Usage: CT_SanitiseVarDir CT_PREFIX_DIR
|
||||
CT_SanitiseVarDir() {
|
||||
# - remove . (current dir) at the beginning, in the middle or at the end
|
||||
# - resolve .. (parent dir) if there is a previous component
|
||||
# - remove .. (parent dir) if at the root
|
||||
#
|
||||
# Usage: CT_SanitizeVarDir CT_PREFIX_DIR
|
||||
CT_SanitizeVarDir() {
|
||||
local var
|
||||
local old_dir
|
||||
local new_dir
|
||||
local new_dir tmp
|
||||
|
||||
for var in "$@"; do
|
||||
eval "old_dir=\"\${${var}}\""
|
||||
new_dir="$( printf "${old_dir}" \
|
||||
|${sed} -r -e 's:/+:/:g;' \
|
||||
)"
|
||||
new_dir=$( echo "${old_dir}" | ${awk} '
|
||||
{
|
||||
isabs = $1 == "" # Started with a slash
|
||||
trail = $NF == "" # Ending with a slash
|
||||
ncomp = 0 # Components in a path so far
|
||||
for (i = 1; i <= NF; i++) {
|
||||
# Double-slash or current dir? Ignore
|
||||
if ($i == "" || $i == ".") {
|
||||
continue;
|
||||
}
|
||||
# .. pops the last component unless it is at the beginning
|
||||
if ($i == ".." && ncomp != 0 && comps[ncomp] != "..") {
|
||||
ncomp--;
|
||||
continue;
|
||||
}
|
||||
comps[++ncomp] = $i;
|
||||
}
|
||||
seencomp = 0
|
||||
for (i = 1; i <= ncomp; i++) {
|
||||
if (comps[i] == ".." && isabs) {
|
||||
# /../ at the beginning is equivalent to /
|
||||
continue;
|
||||
}
|
||||
printf "%s%s", isabs || i != 1 ? "/" : "", comps[i];
|
||||
seencomp = 1;
|
||||
}
|
||||
if (!seencomp && !isabs && !trail) {
|
||||
# Eliminated all components, but no trailing slash -
|
||||
# if the result is appened with /foo, must not become absolute
|
||||
printf ".";
|
||||
}
|
||||
if ((!seencomp && isabs) || (seencomp && trail)) {
|
||||
printf "/";
|
||||
}
|
||||
}' FS=/ )
|
||||
eval "${var}=\"${new_dir}\""
|
||||
CT_DoLog DEBUG "Sanitised '${var}': '${old_dir}' -> '${new_dir}'"
|
||||
CT_DoLog DEBUG "Sanitized '${var}': '${old_dir}' -> '${new_dir}'"
|
||||
done
|
||||
}
|
||||
|
||||
@ -1183,6 +1219,14 @@ CT_DoConfigSub() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Normally, each step is executed in a sub-shell and thus cannot modify the
|
||||
# environment for the next step(s). When this is needed, it can do so by
|
||||
# invoking this function.
|
||||
# Usage: CT_EnvModify VAR VALUE
|
||||
CT_EnvModify() {
|
||||
echo "${1}=\"${2}\"" >> "${CT_BUILD_DIR}/env.modify.sh"
|
||||
}
|
||||
|
||||
# Compute the target tuple from what is provided by the user
|
||||
# Usage: CT_DoBuildTargetTuple
|
||||
# In fact this function takes the environment variables to build the target
|
||||
@ -1303,25 +1347,23 @@ CT_DoBuildTargetTuple() {
|
||||
|
||||
# Now on for the target LDFLAGS
|
||||
CT_ARCH_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_ARCH_ENDIAN_LDFLAG}"
|
||||
}
|
||||
|
||||
# This function determines the target tuple for a given set of compiler
|
||||
# flags, using either GCC's multiarch feature (if supported; if not,
|
||||
# GCC prints nothing and exits with status 0), falling back to calling
|
||||
# the architecture-specific functions.
|
||||
CT_DoMultilibTarget() {
|
||||
local target="$1"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
local gcc_multiarch
|
||||
|
||||
gcc_multiarch=$( "${CT_TARGET}-gcc" -print-multiarch "${multi_flags[@]}" )
|
||||
if [ -n "${gcc_multiarch}" ]; then
|
||||
echo "${gcc_multiarch}"
|
||||
return
|
||||
# Now, a multilib quirk. We may not be able to pass CT_ARCH_TARGET_CFLAGS
|
||||
# and CT_ARCH_TARGET_LDFLAGS to gcc: even though GCC build appends the multilib
|
||||
# flags afterwards, on some architectures the build breaks because some
|
||||
# flags do not completely override each other. For example, on mips target,
|
||||
# 'gcc -mabi=32' and 'gcc -mabi=n32' both work, but 'gcc -mabi=32 -mabi=n32'
|
||||
# triggers an internal linker error. Likely a bug in GNU binutils, but we
|
||||
# have to work it around for now: *do not pass the CT_ARCH_TARGET_ flags*.
|
||||
# Instead, save them into a different variable here. Then, after the first
|
||||
# core pass, we'll know which of them vary with multilibs (i.e. must be
|
||||
# filtered out).
|
||||
if [ "${CT_MULTILIB}" = "y" ]; then
|
||||
CT_ARCH_TARGET_CFLAGS_MULTILIB="${CT_ARCH_TARGET_CFLAGS}"
|
||||
CT_ARCH_TARGET_CFLAGS=
|
||||
CT_ARCH_TARGET_LDFLAGS_MULTILIB="${CT_ARCH_TARGET_LDFLAGS}"
|
||||
CT_ARCH_TARGET_LDFLAGS=
|
||||
fi
|
||||
|
||||
# Fall back to arch-specific guesswork
|
||||
CT_DoArchMultilibTarget "${target}" "${multi_flags[@]}"
|
||||
}
|
||||
|
||||
# This function does pause the build until the user strikes "Return"
|
||||
@ -1413,7 +1455,6 @@ CT_DoSaveState() {
|
||||
/^(FUNCNAME|GROUPS|PPID|SHELLOPTS)=/d;' >"${state_dir}/env.sh"
|
||||
|
||||
CT_DoTarballIfExists "${CT_BUILDTOOLS_PREFIX_DIR}" "${state_dir}/buildtools_dir"
|
||||
CT_DoTarballIfExists "${CT_CONFIG_DIR}" "${state_dir}/config_dir"
|
||||
CT_DoTarballIfExists "${CT_PREFIX_DIR}" "${state_dir}/prefix_dir" --exclude '*.log'
|
||||
|
||||
CT_DoLog STATE " Saving log file"
|
||||
@ -1443,7 +1484,6 @@ CT_DoLoadState(){
|
||||
CT_DoLog INFO "Restoring state at step '${state_name}', as requested."
|
||||
|
||||
CT_DoExtractTarballIfExists "${state_dir}/prefix_dir" "${CT_PREFIX_DIR}"
|
||||
CT_DoExtractTarballIfExists "${state_dir}/config_dir" "${CT_CONFIG_DIR}"
|
||||
CT_DoExtractTarballIfExists "${state_dir}/buildtools_dir" "${CT_BUILDTOOLS_PREFIX_DIR}"
|
||||
|
||||
# Restore the environment, discarding any error message
|
||||
@ -1470,9 +1510,9 @@ CT_DoLoadState(){
|
||||
# This function sets a kconfig option to a specific value in a .config file
|
||||
# Usage: CT_KconfigSetOption <option> <value> <file>
|
||||
CT_KconfigSetOption() {
|
||||
option="$1"
|
||||
value="$2"
|
||||
file="$3"
|
||||
local option="$1"
|
||||
local value="$2"
|
||||
local file="$3"
|
||||
|
||||
${grep} -E -q "^${option}=.*" "${file}" && \
|
||||
${sed} -i -r -e "s;^${option}=.*$;${option}=${value};" "${file}" || \
|
||||
@ -1484,8 +1524,8 @@ CT_KconfigSetOption() {
|
||||
# This function enables a kconfig option to '=y' in a .config file
|
||||
# Usage: CT_KconfigEnableOption <option> <file>
|
||||
CT_KconfigEnableOption() {
|
||||
option="$1"
|
||||
file="$2"
|
||||
local option="$1"
|
||||
local file="$2"
|
||||
|
||||
CT_KconfigSetOption "${option}" "y" "${file}"
|
||||
}
|
||||
@ -1493,8 +1533,8 @@ CT_KconfigEnableOption() {
|
||||
# This function disables a kconfig option in a .config file
|
||||
# Usage: CT_KconfigDisableOption <option> <file>
|
||||
CT_KconfigDisableOption() {
|
||||
option="${1}"
|
||||
file="${2}"
|
||||
local option="${1}"
|
||||
local file="${2}"
|
||||
|
||||
${grep} -E -q "^# ${option} is not set$" "${file}" || \
|
||||
${grep} -E -q "^${option}=.*$" "${file}" && \
|
||||
@ -1506,11 +1546,125 @@ CT_KconfigDisableOption() {
|
||||
# is set or commented out.
|
||||
# Usage: CT_KconfigDeleteOption <option> <file>
|
||||
CT_KconfigDeleteOption() {
|
||||
option="${1}"
|
||||
file="${2}"
|
||||
local option="${1}"
|
||||
local file="${2}"
|
||||
|
||||
${grep} -E -q "^# ${option} is not set$" "${file}" && \
|
||||
${sed} -i -r -e "/^# ${option} is not set$/d" "${file}" || \
|
||||
${grep} -E -q "^${option}=.*$" "${file}" && \
|
||||
${sed} -i -r -e "/^${option}=.*$/d" "${file}" || true
|
||||
}
|
||||
|
||||
# Multilib iterator. The caller should be in a directory where the directories
|
||||
# will be created, one per multilib, and the specified command will be run in
|
||||
# each of them. The following arguments will be passed to the invoked command:
|
||||
# multi_flags CFLAGS for this multilib
|
||||
# multi_dir GCC internal library location for the multilib
|
||||
# multi_os_dir OS library location for the multilib
|
||||
# multi_root Sysroot for this multilib
|
||||
# multi_target Target tuple, either as reported by GCC or by our guesswork
|
||||
# multi_count Total number of multilibs
|
||||
# multi_index Index of the current multilib
|
||||
# Any additional arguments passed to this function will be forwarded to the called
|
||||
# function as well.
|
||||
# Usage: CT_IterateMultilibs <function> <prefix> <additional-args...>
|
||||
CT_IterateMultilibs() {
|
||||
local func="${1}"
|
||||
local prefix="${2}"
|
||||
local -a multilibs
|
||||
local multi_dir multi_os_dir multi_root multi_flags multi_index multi_target
|
||||
local root_suffix
|
||||
|
||||
# Name used internally below
|
||||
if [ "${prefix}" = "sysroot-check" ]; then
|
||||
CT_Abort "Bad prefix used in CT_IterateMultilibs"
|
||||
fi
|
||||
|
||||
# Drop mandatory arguments
|
||||
shift 2
|
||||
|
||||
# If gcc is not configured for multilib, it still prints a single line
|
||||
# for the default settings
|
||||
multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null) )
|
||||
CT_DoExecLog ALL rm -rf "sysroot-check"
|
||||
for multilib in "${multilibs[@]}"; do
|
||||
# GCC makes the distinction between:
|
||||
# multilib (-print-multi-lib or -print-multi-directory) and
|
||||
# multilib-os (--print-multi-os-directory)
|
||||
# as the gcc library and gcc sysroot library paths, respectively.
|
||||
# For example, on x86_64:
|
||||
# multilib: -m32=32 -m64=.
|
||||
# multilib-os: -m32=../lib -m64=../lib64
|
||||
# Moreover, while some multilibs can coexist in the same sysroot (e.g.
|
||||
# on x86), some have a "sysroot suffix" to separate incompatible variants.
|
||||
# Such sysroot suffixes combine with multilib-os directories, e.g.
|
||||
# on sh4 with -m4a multilib, the search order in sysroot is (dropping some
|
||||
# directories for brevity:
|
||||
# <sysroot>/m4a/lib/m4a/
|
||||
# <sysroot>/m4a/usr/lib/m4a/
|
||||
# <sysroot>/m4a/lib/
|
||||
# <sysroot>/m4a/usr/lib/
|
||||
# The problem is that while GCC itself is aware of these subtleties, the
|
||||
# binutils (notably, ld) it invokes under the hood are not. For example,
|
||||
# if a shared library libfoo.so.1 requires libbar.so.1, ld will only search
|
||||
# for libbar.so.1 in <sysroot>/m4a/usr/lib, but not in <sysroot>/m4a/usr/lib/m4a.
|
||||
# In other words, 'gcc -lfoo -lbar' will work for both the default and -m4a
|
||||
# cases, and 'gcc -lfoo' will work for the default, but not for -m4a. To
|
||||
# address this, we first try to determine if the sysroot alone makes the
|
||||
# configuration sufficiently unique. If there are no multilibs within the
|
||||
# same suffixed sysroot, we can drop the multi_os_dir and both gcc and ld
|
||||
# will work. If not, we'll supply both multi_root/multi_os_dir (which will
|
||||
# likely break later, e.g. while building final GCC with C++ support). But,
|
||||
# we've done all we can.
|
||||
multi_flags=$( echo "${multilib#*;}" | ${sed} -r -e 's/@/ -/g;' )
|
||||
multi_dir="${multilib%%;*}"
|
||||
multi_os_dir=$( "${CT_TARGET}-gcc" -print-multi-os-directory ${multi_flags} )
|
||||
multi_root=$( "${CT_TARGET}-gcc" -print-sysroot ${multi_flags} )
|
||||
root_suffix="${multi_root#${CT_SYSROOT_DIR}}"
|
||||
CT_DoExecLog ALL mkdir -p "sysroot-check${root_suffix}"
|
||||
if [ -e "sysroot-check${root_suffix}/seen" ]; then
|
||||
CT_DoExecLog ALL rm -f "sysroot-check${root_suffix}/unique"
|
||||
else
|
||||
CT_DoExecLog ALL touch "sysroot-check${root_suffix}/seen" \
|
||||
"sysroot-check${root_suffix}/unique"
|
||||
fi
|
||||
done
|
||||
|
||||
# Now, actual iteration.
|
||||
# This uses either GCC's multiarch feature (if supported; if not,
|
||||
# GCC prints nothing and exits with status 0), falling back to calling
|
||||
# the architecture-specific functions.
|
||||
multi_index=1
|
||||
for multilib in "${multilibs[@]}"; do
|
||||
multi_flags=$( echo "${multilib#*;}" | ${sed} -r -e 's/@/ -/g;' )
|
||||
multi_dir="${multilib%%;*}"
|
||||
multi_os_dir=$( "${CT_TARGET}-gcc" -print-multi-os-directory ${multi_flags} )
|
||||
multi_root=$( "${CT_TARGET}-gcc" -print-sysroot ${multi_flags} )
|
||||
multi_target=$( "${CT_TARGET}-gcc" -print-multiarch ${multi_flags} )
|
||||
root_suffix="${multi_root#${CT_SYSROOT_DIR}}"
|
||||
|
||||
# If GCC did not report the target tuple (i.e. this configuration is not
|
||||
# multiarch-capable), fall back to our guesswork.
|
||||
if [ -z "${multi_target}" ]; then
|
||||
multi_target="${CT_TARGET}"
|
||||
CT_DoArchMultilibTarget multi_target ${multi_flags}
|
||||
fi
|
||||
|
||||
# Avoid multi_os_dir if it's the only directory in this sysroot.
|
||||
if [ -e "sysroot-check${root_suffix}/unique" ]; then
|
||||
multi_os_dir=.
|
||||
fi
|
||||
|
||||
CT_mkdir_pushd "${prefix}_${multi_dir//\//_}"
|
||||
$func multi_dir="${multi_dir}" \
|
||||
multi_os_dir="${multi_os_dir}" \
|
||||
multi_flags="${multi_flags}" \
|
||||
multi_root="${multi_root}" \
|
||||
multi_target="${multi_target}" \
|
||||
multi_index="${multi_index}" \
|
||||
multi_count="${#multilibs[@]}" \
|
||||
"$@"
|
||||
CT_Popd
|
||||
multi_index=$((multi_index+1))
|
||||
done
|
||||
}
|
||||
|
4
steps.mk
4
steps.mk
@ -16,9 +16,9 @@ help-env::
|
||||
|
||||
# The _for_build steps are noop for native and cross,
|
||||
# but are actual steps for canadian and cross-native.
|
||||
# Please keep the last line with a '\' and keep the following empy line:
|
||||
# Please keep the last line with a '\' and keep the following empty line:
|
||||
# it helps when diffing and merging.
|
||||
CT_STEPS := libc_check_config \
|
||||
CT_STEPS := \
|
||||
companion_libs_for_build \
|
||||
binutils_for_build \
|
||||
companion_libs_for_host \
|
||||
|
Loading…
Reference in New Issue
Block a user