Message ID | 20231020114236.4129636-2-neal.frager@amd.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [v6,01/10] package/binutils-bare-metal: new package | expand |
On Fri, 20 Oct 2023 12:42:28 +0100 Neal Frager <neal.frager@amd.com> wrote: > This patch adds a new package for building gcc for a bare-metal toolchain. > The cpu architecture is defined by a toolchain-bare-metal virtual package. > While any cpu architecture could be used, the default configuration will be a > Xilinx microblaze little endian architecture, so that buildroot will be able > to build the microblaze firmware applications for zynqmp and versal. > > Signed-off-by: Ibai Erkiaga <ibai.erkiaga-elorza@amd.com> > Signed-off-by: Neal Frager <neal.frager@amd.com> [Tested on Kria KV260 starter kit] Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Hello, On Fri, 20 Oct 2023 12:42:28 +0100 Neal Frager via buildroot <buildroot@buildroot.org> wrote: > diff --git a/package/gcc-bare-metal/Config.in.host b/package/gcc-bare-metal/Config.in.host > new file mode 100644 > index 0000000000..ca7735340c > --- /dev/null > +++ b/package/gcc-bare-metal/Config.in.host > @@ -0,0 +1,12 @@ > +config BR2_PACKAGE_HOST_GCC_BARE_METAL > + bool "host gcc-bare-metal" > + help > + Build GCC for a bare-metal toolchain > + > +if BR2_PACKAGE_HOST_GCC_BARE_METAL > + > +config BR2_PACKAGE_HOST_GCC_BARE_METAL_VERSION > + string > + default "13.2.0" Both of these options are useless, they should be dropped. > diff --git a/package/gcc-bare-metal/gcc-bare-metal.hash b/package/gcc-bare-metal/gcc-bare-metal.hash > new file mode 100644 > index 0000000000..5c5c28fa7e > --- /dev/null > +++ b/package/gcc-bare-metal/gcc-bare-metal.hash Symlink to package/gcc/gcc.hash ? > diff --git a/package/gcc-bare-metal/gcc-bare-metal.mk b/package/gcc-bare-metal/gcc-bare-metal.mk > new file mode 100644 > index 0000000000..fe6f931008 > --- /dev/null > +++ b/package/gcc-bare-metal/gcc-bare-metal.mk > @@ -0,0 +1,68 @@ > +################################################################################ > +# > +# gcc-bare-metal > +# > +################################################################################ > + > +HOST_GCC_BARE_METAL_VERSION = \ > + $(call qstrip,$(BR2_PACKAGE_HOST_GCC_BARE_METAL_VERSION)) > +ifeq ($(HOST_GCC_BARE_METAL_VERSION),) > +HOST_GCC_BARE_METAL_VERSION = 13.2.0 > +endif Just harcode the version. > + > +HOST_GCC_BARE_METAL_SITE = \ > + https://ftp.gnu.org/gnu/gcc/gcc-$(HOST_GCC_BARE_METAL_VERSION) > +HOST_GCC_BARE_METAL_SOURCE = gcc-$(HOST_GCC_BARE_METAL_VERSION).tar.xz > + > +HOST_GCC_BARE_METAL_LICENSE = GPL-2.0, GPL-3.0, LGPL-2.1, LGPL-3.0 > +HOST_GCC_BARE_METAL_LICENSE_FILES = COPYING COPYING3 COPYING.LIB COPYING3.LIB > + > +HOST_GCC_BARE_METAL_DEPENDENCIES = \ > + host-binutils-bare-metal \ > + host-gmp \ > + host-mpc \ > + host-mpfr \ > + host-isl > + > +# gcc doesn't support in-tree build, so we create a 'build' > +# subdirectory in the gcc sources, and build from there. > +define GCC_BARE_METAL_CONFIGURE_SYMLINK > + mkdir -p $(@D)/build > + ln -sf ../configure $(@D)/build/configure > +endef > + > +HOST_GCC_BARE_METAL_PRE_CONFIGURE_HOOKS += GCC_BARE_METAL_CONFIGURE_SYMLINK > +HOST_GCC_BARE_METAL_SUBDIR = build > + > +HOST_GCC_BARE_METAL_MAKE_OPTS = \ > + $(HOST_GCC_COMMON_MAKE_OPTS) \ > + all-gcc \ > + all-target-libgcc > + > +HOST_GCC_BARE_METAL_INSTALL_OPTS = install-gcc install-target-libgcc > + > +GCC_BARE_METAL_ARCH = \ > + $(call qstrip,$(BR2_PACKAGE_HOST_TOOLCHAIN_BARE_METAL_BUILDROOT_ARCH)) From a patch sequencing perspective, this is a bit weird because BR2_PACKAGE_HOST_TOOLCHAIN_BARE_METAL_BUILDROOT_ARCH does not even exist yet. But I don't have a very good suggestion on how to handle this, so it's fine as is. Should the variable be named HOST_GCC_BARE_METAL_ARCH, for consistency with the other variables? > +HOST_GCC_BARE_METAL_CONF_OPTS = \ > + --target=$(GCC_BARE_METAL_ARCH)-elf \ I'm wondering if BR2_PACKAGE_HOST_TOOLCHAIN_BARE_METAL_BUILDROOT_ARCH shouldn't be the full tuple, instead of assuming it's also going to end in -elf. Whenever we've assumed things like this, it sometimes turned out to be wrong. So I would suggest that BR2_PACKAGE_HOST_TOOLCHAIN_BARE_METAL_BUILDROOT_ARCH carry the full tuple instead. > + --disable-initfini_array \ > + --disable-__cxa_atexit \ > + --disable-libstdcxx-pch \ > + --with-newlib \ > + --disable-threads \ > + --enable-plugins \ > + --with-gnu-as \ > + --disable-libitm \ > + --without-long-double-128 \ > + --without-headers \ > + --enable-languages=c \ > + --disable-multilib \ > + --with-gmp=$(HOST_DIR) \ > + --with-mpc=$(HOST_DIR) \ > + --with-mpfr=$(HOST_DIR) \ > + --with-isl=$(HOST_DIR) \ > + AR_FOR_TARGET=$(O)/host/bin/$(GCC_BARE_METAL_ARCH)-elf-ar \ > + RANLIB_FOR_TARGET=$(O)/host/bin/$(GCC_BARE_METAL_ARCH)-elf-ranlib $(HOST_DIR) instead of $(O)/host/bin Thanks! Thomas
diff --git a/DEVELOPERS b/DEVELOPERS index 9c2b664426..922a74e426 100644 --- a/DEVELOPERS +++ b/DEVELOPERS @@ -1368,6 +1368,7 @@ F: package/python-rpi-gpio/ N: Ibai Erkiaga <ibai.erkiaga-elorza@amd.com> F: package/binutils-bare-metal/ +F: package/gcc-bare-metal/ N: Ignacy Gawędzki <ignacy.gawedzki@green-communications.fr> F: package/angularjs/ @@ -2202,6 +2203,7 @@ F: configs/zynqmp_zcu102_defconfig F: configs/zynqmp_zcu106_defconfig F: package/binutils-bare-metal/ F: package/bootgen/ +F: package/gcc-bare-metal/ F: package/versal-firmware/ N: Nicola Di Lieto <nicola.dilieto@gmail.com> diff --git a/package/gcc-bare-metal/13.2.0 b/package/gcc-bare-metal/13.2.0 new file mode 120000 index 0000000000..9ae96a8a45 --- /dev/null +++ b/package/gcc-bare-metal/13.2.0 @@ -0,0 +1 @@ +../gcc/13.2.0 \ No newline at end of file diff --git a/package/gcc-bare-metal/Config.in.host b/package/gcc-bare-metal/Config.in.host new file mode 100644 index 0000000000..ca7735340c --- /dev/null +++ b/package/gcc-bare-metal/Config.in.host @@ -0,0 +1,12 @@ +config BR2_PACKAGE_HOST_GCC_BARE_METAL + bool "host gcc-bare-metal" + help + Build GCC for a bare-metal toolchain + +if BR2_PACKAGE_HOST_GCC_BARE_METAL + +config BR2_PACKAGE_HOST_GCC_BARE_METAL_VERSION + string + default "13.2.0" + +endif #BR2_PACKAGE_HOST_GCC_BARE_METAL diff --git a/package/gcc-bare-metal/gcc-bare-metal.hash b/package/gcc-bare-metal/gcc-bare-metal.hash new file mode 100644 index 0000000000..5c5c28fa7e --- /dev/null +++ b/package/gcc-bare-metal/gcc-bare-metal.hash @@ -0,0 +1,9 @@ +# From https://gcc.gnu.org/pub/gcc/releases/gcc-13.2.0/sha512.sum +sha512 d99e4826a70db04504467e349e9fbaedaa5870766cda7c5cab50cdebedc4be755ebca5b789e1232a34a20be1a0b60097de9280efe47bdb71c73251e30b0862a2 gcc-13.2.0.tar.xz + +# Locally calculated +sha256 231f7edcc7352d7734a96eef0b8030f77982678c516876fcb81e25b32d68564c COPYING +sha256 8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903 COPYING3 +sha256 a853c2ffec17057872340eee242ae4d96cbf2b520ae27d903e1b2fef1a5f9d1c COPYING3.LIB +sha256 a9bdde5616ecdd1e980b44f360600ee8783b1f99b8cc83a2beb163a0a390e861 COPYING.LIB +sha256 9d6b43ce4d8de0c878bf16b54d8e7a10d9bd42b75178153e3af6a815bdc90f74 COPYING.RUNTIME diff --git a/package/gcc-bare-metal/gcc-bare-metal.mk b/package/gcc-bare-metal/gcc-bare-metal.mk new file mode 100644 index 0000000000..fe6f931008 --- /dev/null +++ b/package/gcc-bare-metal/gcc-bare-metal.mk @@ -0,0 +1,68 @@ +################################################################################ +# +# gcc-bare-metal +# +################################################################################ + +HOST_GCC_BARE_METAL_VERSION = \ + $(call qstrip,$(BR2_PACKAGE_HOST_GCC_BARE_METAL_VERSION)) +ifeq ($(HOST_GCC_BARE_METAL_VERSION),) +HOST_GCC_BARE_METAL_VERSION = 13.2.0 +endif + +HOST_GCC_BARE_METAL_SITE = \ + https://ftp.gnu.org/gnu/gcc/gcc-$(HOST_GCC_BARE_METAL_VERSION) +HOST_GCC_BARE_METAL_SOURCE = gcc-$(HOST_GCC_BARE_METAL_VERSION).tar.xz + +HOST_GCC_BARE_METAL_LICENSE = GPL-2.0, GPL-3.0, LGPL-2.1, LGPL-3.0 +HOST_GCC_BARE_METAL_LICENSE_FILES = COPYING COPYING3 COPYING.LIB COPYING3.LIB + +HOST_GCC_BARE_METAL_DEPENDENCIES = \ + host-binutils-bare-metal \ + host-gmp \ + host-mpc \ + host-mpfr \ + host-isl + +# gcc doesn't support in-tree build, so we create a 'build' +# subdirectory in the gcc sources, and build from there. +define GCC_BARE_METAL_CONFIGURE_SYMLINK + mkdir -p $(@D)/build + ln -sf ../configure $(@D)/build/configure +endef + +HOST_GCC_BARE_METAL_PRE_CONFIGURE_HOOKS += GCC_BARE_METAL_CONFIGURE_SYMLINK +HOST_GCC_BARE_METAL_SUBDIR = build + +HOST_GCC_BARE_METAL_MAKE_OPTS = \ + $(HOST_GCC_COMMON_MAKE_OPTS) \ + all-gcc \ + all-target-libgcc + +HOST_GCC_BARE_METAL_INSTALL_OPTS = install-gcc install-target-libgcc + +GCC_BARE_METAL_ARCH = \ + $(call qstrip,$(BR2_PACKAGE_HOST_TOOLCHAIN_BARE_METAL_BUILDROOT_ARCH)) + +HOST_GCC_BARE_METAL_CONF_OPTS = \ + --target=$(GCC_BARE_METAL_ARCH)-elf \ + --disable-initfini_array \ + --disable-__cxa_atexit \ + --disable-libstdcxx-pch \ + --with-newlib \ + --disable-threads \ + --enable-plugins \ + --with-gnu-as \ + --disable-libitm \ + --without-long-double-128 \ + --without-headers \ + --enable-languages=c \ + --disable-multilib \ + --with-gmp=$(HOST_DIR) \ + --with-mpc=$(HOST_DIR) \ + --with-mpfr=$(HOST_DIR) \ + --with-isl=$(HOST_DIR) \ + AR_FOR_TARGET=$(O)/host/bin/$(GCC_BARE_METAL_ARCH)-elf-ar \ + RANLIB_FOR_TARGET=$(O)/host/bin/$(GCC_BARE_METAL_ARCH)-elf-ranlib + +$(eval $(host-autotools-package))