[PATCH] Add support for static toolchains
Bryan Hundven
bryanhundven@gmail.com
Sun Oct 17 18:00:00 GMT 2010
On Sun, Oct 17, 2010 at 10:12 AM, Yann E. MORIN
<yann.morin.1998@anciens.enib.fr> wrote:
> Bryan, All,
>
> On Friday 15 October 2010 19:54:34 Bryan Hundven wrote:
>> # HG changeset patch
>> # User Bryan Hundven <bryanhundven@gmail.com>
>> # Date 1287163549 25200
>> # Node ID 723f12354ba302905f8398b9d4bc2697e780a247
>> # Parent 3b812ba8d0019ae5c283b3848bd3461ae17195aa
>> Add support for static toolchains
>
> Thank you for updating this! :-)
>
> I however have a few comments. See inline.
>
> [--SNIP--]
>> diff -r 3b812ba8d001 -r 723f12354ba3 scripts/build/binutils/binutils.sh
>> --- a/scripts/build/binutils/binutils.sh Sat Oct 09 11:38:04 2010 +0200
>> +++ b/scripts/build/binutils/binutils.sh Fri Oct 15 10:25:49 2010 -0700
> [--SNIP--]
>> @@ -66,6 +76,7 @@
>> # Now on for the target libraries
>> do_binutils_target() {
>> local -a extra_config
>> + local -a extra_make_flags
>
> This is binutils libs for the target. It should not be impacted by the
> 'staticity' of the toolchain proper.
>
> I would understand "static toolchain" as applying to executables running
> on the host be static, not stuff running on the target.
>
> It be might be interesting to have a toolchain using only static libs on
> the target, but this is another thing.
Oops, I forgot to remove the static options for the target. That was
just an experiment. Sorry ;)
>> local -a targets
>> local -a build_targets
>> local -a install_targets
>> @@ -77,6 +88,10 @@
>> build_targets+=("all-${t}")
>> install_targets+=("install-${t}")
>> done
>> +
>> + if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
>> + extra_make_flags+=("LDFLAGS=-all-static")
>> + fi
>>
>> if [ "${#targets[@]}" -ne 0 ]; then
>> CT_DoStep INFO "Installing binutils for target"
>> @@ -99,8 +114,13 @@
>> ${CT_ARCH_WITH_FLOAT} \
>> ${CT_BINUTILS_EXTRA_CONFIG}
>>
>> + if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
>> + CT_DoLog EXTRA "Prepare binutils for static build"
>> + CT_DoExecLog ALL make configure-host
>> + fi
>> +
>> CT_DoLog EXTRA "Building binutils' libraries (${targets[*]}) for target"
>> - CT_DoExecLog ALL make ${PARALLELMFLAGS} "${build_targets[@]}"
>> + CT_DoExecLog ALL make "${extra_make_flags[@]}" ${PARALLELMFLAGS} "${build_targets[@]}"
>> CT_DoLog EXTRA "Installing binutils' libraries (${targets[*]}) for target"
>> CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" "${install_targets[@]}"
>>
>> diff -r 3b812ba8d001 -r 723f12354ba3 scripts/build/cc/gcc.sh
>> --- a/scripts/build/cc/gcc.sh Sat Oct 09 11:38:04 2010 +0200
>> +++ b/scripts/build/cc/gcc.sh Fri Oct 15 10:25:49 2010 -0700
>> @@ -305,8 +305,8 @@
>> # Build final gcc
>> do_cc() {
>
> We do indeed want the final cc to be static. But what about the core cc?
> I know it is only a temporary build, and that it does not get into the
> toolchain proper. But would it also make sense to also build it static?
>
> I don't care either way, but I'm telling just for the sake of completness.
So, the gcc_core_shared should be another gcc_core_static?
I will start working on that if that is what you mean.
>> local -a extra_config
>> + local -a final_LDFLAGS
>> local tmp
>> - local final_LDFLAGS
>>
>> # If building for bare metal, nothing to be done here, the static core conpiler is enough!
>> [ "${CT_BARE_METAL}" = "y" ] && return 0
>> @@ -389,11 +389,16 @@
>> # see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
>> extra_config+=("--with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm")
>> elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
>> + if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
>> + final_LDFLAGS+=("-static")
>> + extra_config+=("--with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc++ -lm")
>> + fi
>> # When companion libraries are build static (eg !shared),
>> # the libstdc++ is not pulled automatically, although it
>> # is needed. Shoe-horn it in our LDFLAGS
>> # Ditto libm on some Fedora boxen
>> - final_LDFLAGS='-lstdc++ -lm'
>> + final_LDFLAGS+=("-lstdc++")
>> + final_LDFLAGS+=("-lm")
>> fi
>> if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
>> extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
>> @@ -451,7 +456,7 @@
>> # embedded systems don't really need message catalogs...
>> CC_FOR_BUILD="${CT_BUILD}-gcc" \
>> CFLAGS="${CT_CFLAGS_FOR_HOST}" \
>> - LDFLAGS="${final_LDFLAGS}" \
>> + LDFLAGS="${final_LDFLAGS[@]}" \
>
> Although this is working as you expect, I'm a bit uneasy with this one.
> In fact, the man page for bash states that "${ARRAY[@]}" expands to as
> many words as there are items in the array. So I would have expected
> VAR="${ARRAY[@]}" expand to VAR="ITEM1" ["ITEM2" ...]
>
> On the other hand, "${ARRAY[*]}" expands to a single word, with every
> items separated by the first word of IFS.
>
> As we do not want multiple words here, I'd rather we be explicit, and
> we use "${final_LDFLAGS[*]}".
Ok.
> Also, you're missing another component that runs on the host: the cross-gdb.
> There is already an option to build it statically, so it should be really
> easy to also apply this "static toolchain" option to the cross-gdb.
Do you mean in 'config STATIC_TOOLCHAIN' to add:
depends on GDB_CROSS_STATIC
> Overall, it is good. Would you care to repost an amended version, please?
It wouldn't be a problem at all. When I get answers to my two
questions, I will post my revision.
> Regards,
> Yann E. MORIN.
Thank you,
-Bryan
--
For unsubscribe information see http://sourceware.org/lists.html#faq
More information about the crossgcc
mailing list