diff mbox

[1/3,v2] toolchain/external: add Linaro ARM 2014.11 ARMv7 EABIhf

Message ID 09383bf10969ac4b1705180abd33576e52b5a3e6.1427556250.git.yann.morin.1998@free.fr
State Changes Requested
Headers show

Commit Message

Yann E. MORIN March 28, 2015, 3:27 p.m. UTC
This toolchain has a kind of hstory of its own... ;-(

First released in November 2014, it was completely broken, and Thomas
opened a bug report. Here's the story (for reference):
    https://plus.google.com/+ThomasPetazzoni/posts/SjFkrX3ow5M
    https://bugs.linaro.org/show_bug.cgi?id=862

since then, the release has been re-done, and the issue reported above
has been fixed. This makes that toolchain almost usable by Buildroot,
with just a few little nits:

  - it is available only for x86_64 hosts

  - the toolchain is split in three parts:
    - the main archive, with the tools and a minimalist sysroot with
      just the strictly required stuff (e.g. just the C library and most
      libs as static libs, i.e. no shared libs but libc.so)
    - a secondary archive, with the complete sysroot , duplicationg most
      previously existing files in the minimal sysroot, above
    - a tertiary archive, with the 'runtime' content (whatever that
      could mean...); that one seems completely unnecessary for
      Buildroot.

  - the sys/types.h headers from the main sysroot is correct, while the
    one from the secondary archive (thus overwriting the main one) is
    broken, as it removes the definition of caddr_t (why? WHY?).

  - there's a stray backup file for libstdc++

So, add this new toolchain with three post-extract hooks, one to extract
the secondary, sysroot archive, the second to restore sys/types.h to a
useable state, and the third to remove the backup file.

(Note: we're doing it in three hooks, because the cleanup hook is
different for the AArch64 toolchain, coming soon...)

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 toolchain/toolchain-external/Config.in             | 27 +++++++++++++++++++++
 .../toolchain-external/toolchain-external.hash     |  2 ++
 toolchain/toolchain-external/toolchain-external.mk | 28 ++++++++++++++++++++++
 3 files changed, 57 insertions(+)

Comments

Thomas Petazzoni March 29, 2015, 11:11 a.m. UTC | #1
Dear Yann E. MORIN,

On Sat, 28 Mar 2015 16:27:10 +0100, Yann E. MORIN wrote:

>   - it is available only for x86_64 hosts
> 
>   - the toolchain is split in three parts:
>     - the main archive, with the tools and a minimalist sysroot with
>       just the strictly required stuff (e.g. just the C library and most
>       libs as static libs, i.e. no shared libs but libc.so)
>     - a secondary archive, with the complete sysroot , duplicationg most
>       previously existing files in the minimal sysroot, above
>     - a tertiary archive, with the 'runtime' content (whatever that
>       could mean...); that one seems completely unnecessary for
>       Buildroot.
> 
>   - the sys/types.h headers from the main sysroot is correct, while the
>     one from the secondary archive (thus overwriting the main one) is
>     broken, as it removes the definition of caddr_t (why? WHY?).

Can you report this bug to the Linaro folks?

> 
>   - there's a stray backup file for libstdc++

I already reported the stray backup file issue, but as part of my
original bug report. Maybe we should report it as a separate bug.


> +config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM_2014_11
> +	bool "Linaro arm 2014.11"

For Linaro toolchains, we've stopped adding version-specific Config.in
options. At any given time, we support only one Linaro toolchain, under
the option BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM.

> +# The Linaro 2014.11 toolchains are split in two parts:
> +# - the main archive, contains compiler and other tools, plus a minimal

No comma between 'archive' and 'contains'.

> +#   sysroot without a lot of share dlibs (e.g. libstdc++.so)
> +# - a secondrary archive with another part of the sysroot (in that both

secondary

> +#   the intersection and exclusion are non-empty)

"in that both the intersection and exclusion are non-empty" ?!?

> +# The standard package infra handles the main archive, and we use a
> +# post-extract hook to extract the secondary, sysroot archive
> +define TOOLCHAIN_EXTERNAL_LINARO_2014_11_EXTRACT_SYSROOT
> +	$(call suitable-extractor,$(TOOLCHAIN_EXTERNAL_EXTRA_DOWNLOADS)) $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_EXTRA_DOWNLOADS) | \
> +		$(TAR) $(TAR_STRIP_COMPONENTS)=1 --hard-dereference -C $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/libc $(TAR_OPTIONS) -
> +endef
> +# The sysroot archive is kinda broken, keep the pieces together...

Maybe be more specific here about what is being done rather than just
"let's fix the breakage".

> +define TOOLCHAIN_EXTERNAL_LINARO_2014_11_FIX_TYPES_H
> +	$(SED) 's/\(typedef __daddr_t daddr_t;\)/\1\ntypedef __caddr_t caddr_t;/' \
> +		$(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/libc/usr/include/sys/types.h
> +endef
> +define TOOLCHAIN_EXTERNAL_LINARO_2014_11_CLEAN_UP_32
> +	rm -f $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/libc/usr/lib/libgcc_s.so.1.backup
> +endef

Thanks,

Thomas
Yann E. MORIN March 29, 2015, 11:23 a.m. UTC | #2
Thomas, All,

On 2015-03-29 13:11 +0200, Thomas Petazzoni spake thusly:
> On Sat, 28 Mar 2015 16:27:10 +0100, Yann E. MORIN wrote:
> 
> >   - it is available only for x86_64 hosts
> > 
> >   - the toolchain is split in three parts:
> >     - the main archive, with the tools and a minimalist sysroot with
> >       just the strictly required stuff (e.g. just the C library and most
> >       libs as static libs, i.e. no shared libs but libc.so)
> >     - a secondary archive, with the complete sysroot , duplicationg most
> >       previously existing files in the minimal sysroot, above
> >     - a tertiary archive, with the 'runtime' content (whatever that
> >       could mean...); that one seems completely unnecessary for
> >       Buildroot.
> > 
> >   - the sys/types.h headers from the main sysroot is correct, while the
> >     one from the secondary archive (thus overwriting the main one) is
> >     broken, as it removes the definition of caddr_t (why? WHY?).
> 
> Can you report this bug to the Linaro folks?

ACK, will do.

> >   - there's a stray backup file for libstdc++
> I already reported the stray backup file issue, but as part of my
> original bug report. Maybe we should report it as a separate bug.

ACK, will do.

> > +config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM_2014_11
> > +	bool "Linaro arm 2014.11"
> 
> For Linaro toolchains, we've stopped adding version-specific Config.in
> options. At any given time, we support only one Linaro toolchain, under
> the option BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM.

Well, because the 2014.11 is kinda new and a bit broken so far, I wanted
to keep the 2014.09 as a backup, in case I missed issues with 2014.11.

I was able to build quite a lot of stuff with it, like the full Kodi
suite and the whole of Qt5, but QtWebKit, which should exercise the
compiler pretty well, but there might still be issues lurking around.
Hence adding it instead of replacing.

But if you really want we replace the existing one, I'm OK.

> > +#   sysroot without a lot of share dlibs (e.g. libstdc++.so)
> > +# - a secondrary archive with another part of the sysroot (in that both
> > +#   the intersection and exclusion are non-empty)
> "in that both the intersection and exclusion are non-empty" ?!?

Well, it means the set of files in the sysroot archive is not a superset
of the sysroot files of the main archive:

  - main archive's sysroot:       [----------------]
  - secondary archive's sysroot:       [-----------------------]
  - intersection:                      [-----------]
  - exclusion:                    [----]           [-----------]

> > +# The standard package infra handles the main archive, and we use a
> > +# post-extract hook to extract the secondary, sysroot archive
> > +define TOOLCHAIN_EXTERNAL_LINARO_2014_11_EXTRACT_SYSROOT
> > +	$(call suitable-extractor,$(TOOLCHAIN_EXTERNAL_EXTRA_DOWNLOADS)) $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_EXTRA_DOWNLOADS) | \
> > +		$(TAR) $(TAR_STRIP_COMPONENTS)=1 --hard-dereference -C $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/libc $(TAR_OPTIONS) -
> > +endef
> > +# The sysroot archive is kinda broken, keep the pieces together...
> 
> Maybe be more specific here about what is being done rather than just
> "let's fix the breakage".

ACK, will do.

Thanks! :-)

Regards,
Yann E. MORIN.
diff mbox

Patch

diff --git a/toolchain/toolchain-external/Config.in b/toolchain/toolchain-external/Config.in
index 8b0f09b..199b6ab 100644
--- a/toolchain/toolchain-external/Config.in
+++ b/toolchain/toolchain-external/Config.in
@@ -6,6 +6,32 @@  choice
 comment "(e)glibc toolchains only available with shared lib support"
 	depends on BR2_STATIC_LIBS
 
+config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM_2014_11
+	bool "Linaro arm 2014.11"
+	depends on BR2_arm
+	depends on BR2_ARM_CPU_ARMV7A
+	depends on BR2_HOSTARCH = "x86_64"
+	depends on BR2_ARM_EABIHF
+	depends on !BR2_STATIC_LIBS
+	select BR2_TOOLCHAIN_EXTERNAL_GLIBC
+	select BR2_TOOLCHAIN_HAS_NATIVE_RPC
+	select BR2_INSTALL_LIBSTDCPP
+	select BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17
+	help
+	  Linaro toolchain for the ARM architecture. It uses Linaro
+	  GCC 2014.11 (based on gcc 4.9), Linaro GDB 2014.11 (based on
+	  GDB 7.8), Linaro glibc 2014.11 (based on glibc2.20), Linaro
+	  Binutils 2014.09 (based on 2.24). It generates code that runs
+	  on all Cortex-A profile devices, but tuned for the Cortex-A9.
+	  The code generated is Thumb 2, with the hard floating point
+	  calling convention, and uses the VFPv3-D16 FPU instructions.
+
+comment "Linaro toolchain 2014.11 available only on x86_64 hosts"
+	depends on BR2_arm
+	depends on !BR2_ARM_CPU_ARMV7A || !BR2_ARM_EABIHF
+	depends on !BR2_STATIC_LIBS
+	depends on BR2_HOSTARCH != "x86_64"
+
 config BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM
 	bool "Linaro ARM 2014.09"
 	depends on BR2_arm
@@ -948,6 +974,7 @@  config BR2_TOOLCHAIN_EXTERNAL_PREFIX
 	string
 	default "arc-linux"		 if BR2_TOOLCHAIN_EXTERNAL_SYNOPSYS_ARC_2014_12 && BR2_arcle
 	default "arceb-linux"		 if BR2_TOOLCHAIN_EXTERNAL_SYNOPSYS_ARC_2014_12 && BR2_arceb
+	default "arm-linux-gnueabihf"	 if BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM_2014_11
 	default "arm-linux-gnueabihf"	 if BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM
 	default "armeb-linux-gnueabihf"	 if BR2_TOOLCHAIN_EXTERNAL_LINARO_ARMEB
 	default "arm-none-linux-gnueabi" if BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM201305
diff --git a/toolchain/toolchain-external/toolchain-external.hash b/toolchain/toolchain-external/toolchain-external.hash
index 7362b81..1a0c0f3 100644
--- a/toolchain/toolchain-external/toolchain-external.hash
+++ b/toolchain/toolchain-external/toolchain-external.hash
@@ -51,6 +51,8 @@  sha256 f2febf3b3c565536461ad4405f1bcb835d75a6afb2a8bec958a1248cb4b81fc7  arago-2
 sha256 254af7d02eb3bcc8345c78e131700bc995d65b68232caaed21150a5fd1456070  arago-2011.09-armv5te-linux-gnueabi-sdk.tar.bz2
 
 # ARM and Aarch64 toolchains from Linaro
+sha256 bc4ca2ced084d2dc12424815a4442e19cb1422db87068830305d90075feb1a3b  gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz
+sha256 c85cda17fcf6e83cfb35bab646ebce7061edd15ae0b796f2f616cb61e92b4e61  sysroot-linaro-eglibc-gcc4.9-2014.11-arm-linux-gnueabihf.tar.xz
 sha256 0cffac0caea0eb3c8bdddfa14be011ce366680f40aeddbefc7cf23cb6d4f1891  gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz
 sha256 4bc9d86390f8fa67a693ba4768ba5b12faaf7dd37c706c05ccd9321e765226e4  gcc-linaro-armeb-linux-gnueabihf-4.9-2014.09_linux.tar.xz
 sha256 3954f496ab01de67241109e82abfaa9b7625fdab4f05e79e7902e9814a07b832  gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux.tar.xz
diff --git a/toolchain/toolchain-external/toolchain-external.mk b/toolchain/toolchain-external/toolchain-external.mk
index c0429bb..3c40797 100644
--- a/toolchain/toolchain-external/toolchain-external.mk
+++ b/toolchain/toolchain-external/toolchain-external.mk
@@ -253,6 +253,26 @@  define TOOLCHAIN_EXTERNAL_LINARO_AARCH64_SYMLINK
 	ln -sf . $(TARGET_DIR)/usr/lib/aarch64-linux-gnu
 endef
 
+# The Linaro 2014.11 toolchains are split in two parts:
+# - the main archive, contains compiler and other tools, plus a minimal
+#   sysroot without a lot of share dlibs (e.g. libstdc++.so)
+# - a secondrary archive with another part of the sysroot (in that both
+#   the intersection and exclusion are non-empty)
+# The standard package infra handles the main archive, and we use a
+# post-extract hook to extract the secondary, sysroot archive
+define TOOLCHAIN_EXTERNAL_LINARO_2014_11_EXTRACT_SYSROOT
+	$(call suitable-extractor,$(TOOLCHAIN_EXTERNAL_EXTRA_DOWNLOADS)) $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_EXTRA_DOWNLOADS) | \
+		$(TAR) $(TAR_STRIP_COMPONENTS)=1 --hard-dereference -C $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/libc $(TAR_OPTIONS) -
+endef
+# The sysroot archive is kinda broken, keep the pieces together...
+define TOOLCHAIN_EXTERNAL_LINARO_2014_11_FIX_TYPES_H
+	$(SED) 's/\(typedef __daddr_t daddr_t;\)/\1\ntypedef __caddr_t caddr_t;/' \
+		$(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/libc/usr/include/sys/types.h
+endef
+define TOOLCHAIN_EXTERNAL_LINARO_2014_11_CLEAN_UP_32
+	rm -f $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/libc/usr/lib/libgcc_s.so.1.backup
+endef
+
 ifeq ($(BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM201305),y)
 TOOLCHAIN_EXTERNAL_SITE = http://sourcery.mentor.com/public/gnu_toolchain/arm-none-linux-gnueabi
 TOOLCHAIN_EXTERNAL_SOURCE = arm-2013.05-24-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
@@ -276,6 +296,14 @@  define TOOLCHAIN_EXTERNAL_FIXUP_CMDS
 	mv $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/arago-2011.09/armv5te/* $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/
 	rm -rf $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)/arago-2011.09/
 endef
+else ifeq ($(BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM_2014_11),y)
+TOOLCHAIN_EXTERNAL_SITE = http://releases.linaro.org/14.11/components/toolchain/binaries/arm-linux-gnueabihf/
+TOOLCHAIN_EXTERNAL_SOURCE = gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz
+TOOLCHAIN_EXTERNAL_EXTRA_DOWNLOADS = sysroot-linaro-eglibc-gcc4.9-2014.11-arm-linux-gnueabihf.tar.xz
+TOOLCHAIN_EXTERNAL_POST_EXTRACT_HOOKS += \
+	TOOLCHAIN_EXTERNAL_LINARO_2014_11_EXTRACT_SYSROOT \
+	TOOLCHAIN_EXTERNAL_LINARO_2014_11_FIX_TYPES_H \
+	TOOLCHAIN_EXTERNAL_LINARO_2014_11_CLEAN_UP_32
 else ifeq ($(BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM),y)
 TOOLCHAIN_EXTERNAL_SITE = http://releases.linaro.org/14.09/components/toolchain/binaries
 TOOLCHAIN_EXTERNAL_SOURCE = gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz