Message ID | 20190929165601.20269-3-eric.le.bihan.dev@free.fr |
---|---|
State | Superseded |
Headers | show |
Series | Add support for the D programming language | expand |
Hello Eric, On Sun, 29 Sep 2019 18:56:01 +0200 Eric Le Bihan <eric.le.bihan.dev@free.fr> wrote: > +config BR2_TOOLCHAIN_BUILDROOT_DLANG > + bool "Enable D language support" > + depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9 > + depends on BR2_TOOLCHAIN_USES_GLIBC Could you explain why glibc is necessary as a dependency here ? Thanks, Thomas
Hi! On 2019-09-30 23:04, Thomas Petazzoni wrote: > Hello Eric, > > On Sun, 29 Sep 2019 18:56:01 +0200 > Eric Le Bihan <eric.le.bihan.dev@free.fr> wrote: > > > +config BR2_TOOLCHAIN_BUILDROOT_DLANG > > + bool "Enable D language support" > > + depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9 > > + depends on BR2_TOOLCHAIN_USES_GLIBC > > Could you explain why glibc is necessary as a dependency here ? The D programming language needs a runtime, named libgphobos. When building a toolchain with uclibc-ng as libc, for qemu_aarch64_virt, the following error occurs: ``` libtool: compile: /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/build/host-gcc-final-9.2.0/build/./gcc/gdc -B/home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/build/host-gcc-final-9.2.0/build/./gcc/ -B/home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/bin/ -B/home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/lib/ -isystem /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/include -isystem /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/sys-include -fPIC -O2 -g -nostdinc -I ../../../../libphobos/libdruntime -I . -c ../../../../libphobos/libdruntime/core/internal/abort.d -fversion=Shared -o core/internal/.libs/abort.o /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/build/host-gcc-final-9.2.0/libphobos/libdruntime/core/sys/posix/sys/types.d:1134:39: error: undefined identifier '__SIZEOF_PTHREAD_ATTR_T' 1134 | byte[__SIZEOF_PTHREAD_ATTR_T] __size; | ^ ``` I haven't dug into uclibc-ng code to find out the cause of the error. Hence the restriction to a glibc-based toolchain. Regards, -- ELB
Hello, On Tue, 1 Oct 2019 07:56:14 +0200 Eric Le Bihan <eric.le.bihan.dev@free.fr> wrote: > The D programming language needs a runtime, named libgphobos. When > building a toolchain with uclibc-ng as libc, for qemu_aarch64_virt, the > following error occurs: > > ``` > libtool: compile: /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/build/host-gcc-final-9.2.0/build/./gcc/gdc -B/home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/build/host-gcc-final-9.2.0/build/./gcc/ -B/home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/bin/ -B/home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/lib/ -isystem /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/include -isystem /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/sys-include -fPIC -O2 -g -nostdinc -I ../../../../libphobos/libdruntime -I . -c ../../../../libphobos/libdruntime/core/internal/abort.d -fversion=Shared -o core/internal/.libs/abort.o > /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/build/host-gcc-final-9.2.0/libphobos/libdruntime/core/sys/posix/sys/types.d:1134:39: error: undefined identifier '__SIZEOF_PTHREAD_ATTR_T' > 1134 | byte[__SIZEOF_PTHREAD_ATTR_T] __size; This is off because __SIZEOF_PTHREAD_ATTR_T is defined by uClibc-ng, for example for AArch64: libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h:#define __SIZEOF_PTHREAD_ATTR_T 64 libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h: char __size[__SIZEOF_PTHREAD_ATTR_T]; Perhaps there's an include missing in gcc ? However, musl does not define __SIZEOF_PTHREAD_ATTR_T. > I haven't dug into uclibc-ng code to find out the cause of the error. > Hence the restriction to a glibc-based toolchain. Fair enough, but it should be explained with a short comment above the dependency. Thanks! Thomas
On 2019-10-01 08:56, Thomas Petazzoni wrote: > Hello, > > On Tue, 1 Oct 2019 07:56:14 +0200 > Eric Le Bihan <eric.le.bihan.dev@free.fr> wrote: > > > The D programming language needs a runtime, named libgphobos. When > > building a toolchain with uclibc-ng as libc, for qemu_aarch64_virt, the > > following error occurs: > > > > ``` > > libtool: compile: /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/build/host-gcc-final-9.2.0/build/./gcc/gdc -B/home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/build/host-gcc-final-9.2.0/build/./gcc/ -B/home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/bin/ -B/home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/lib/ -isystem /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/include -isystem /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/host/aarch64-buildroot-linux-uclibc/sys-include -fPIC -O2 -g -nostdinc -I ../../../../libphobos/libdruntime -I . -c ../../../../libphobos/libdruntime/core/internal/abort.d -fversion=Shared -o core/internal/.libs/abort.o > > /home/eric/build/demo-dlang/qemu/aarch64/virt/uclibc/build/host-gcc-final-9.2.0/libphobos/libdruntime/core/sys/posix/sys/types.d:1134:39: error: undefined identifier '__SIZEOF_PTHREAD_ATTR_T' > > 1134 | byte[__SIZEOF_PTHREAD_ATTR_T] __size; > > This is off because __SIZEOF_PTHREAD_ATTR_T is defined by uClibc-ng, > for example for AArch64: > > libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h:#define __SIZEOF_PTHREAD_ATTR_T 64 > libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h: char __size[__SIZEOF_PTHREAD_ATTR_T]; > > Perhaps there's an include missing in gcc ? > > However, musl does not define __SIZEOF_PTHREAD_ATTR_T. > > > I haven't dug into uclibc-ng code to find out the cause of the error. > > Hence the restriction to a glibc-based toolchain. > > Fair enough, but it should be explained with a short comment above the > dependency. Looking at libphobos/libdruntime/core/sys/posix/sys/types.d turned out to be very informative. It contains a list of definitions per C-runtime mapped to architecture/OS. Bionic, uclibc and musl are supported but only for a limited set of architectures. For some of them, __SIZEOF_PTHREAD_ATTR_T and friends are redefined. ARM is supported for uclibc, but Aarch64 is not (hence the build failure). Adding the missing definitions from libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h is trivial, but then the build chokes on siginfo_t not being correct. So deep work is required. Even some combinations defined in types.d fail to build (e.g. x86_64+musl or ARM/uclibc). In the end, glibc turns out to be the only C-runtime covering most of the architectures supported by Buildroot: x86_64, Aarch64, ARM, MIPS{32,64}, PPC{,64}, RISCV32 and SPARC64. In order to restrict the supported architectures, should package/gcc/Config.in.host be updated to look like this? ``` config BR2_TOOLCHAIN_BUILDROOT_DLANG bool "Enable D language support" depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9 depends on BR2_TOOLCHAIN_USES_GLIBC depends on !BR2_arc depends on !BR2_csky depends on !BR2_m68k depends on !BR2_microblaze depends on !BR2_nds32 depends on !BR2_nios2 depends on !BR2_or1k depends on !BR2_sparc depends on !BR2_xtensa ``` Regards, -- ELB
Hello, On Sun, 6 Oct 2019 17:12:28 +0200 Eric Le Bihan <eric.le.bihan.dev@free.fr> wrote: > Looking at libphobos/libdruntime/core/sys/posix/sys/types.d turned out > to be very informative. It contains a list of definitions per C-runtime > mapped to architecture/OS. Bionic, uclibc and musl are supported but > only for a limited set of architectures. For some of them, > __SIZEOF_PTHREAD_ATTR_T and friends are redefined. > > ARM is supported for uclibc, but Aarch64 is not (hence the build > failure). Adding the missing definitions from > libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h is > trivial, but then the build chokes on siginfo_t not being correct. So > deep work is required. > > Even some combinations defined in types.d fail to build (e.g. > x86_64+musl or ARM/uclibc). > > In the end, glibc turns out to be the only C-runtime covering most of > the architectures supported by Buildroot: x86_64, Aarch64, ARM, > MIPS{32,64}, PPC{,64}, RISCV32 and SPARC64. OK. > In order to restrict the supported architectures, should > package/gcc/Config.in.host be updated to look like this? > > ``` > config BR2_TOOLCHAIN_BUILDROOT_DLANG > bool "Enable D language support" > depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9 > depends on BR2_TOOLCHAIN_USES_GLIBC > depends on !BR2_arc > depends on !BR2_csky > depends on !BR2_m68k > depends on !BR2_microblaze > depends on !BR2_nds32 > depends on !BR2_nios2 > depends on !BR2_or1k > depends on !BR2_sparc > depends on !BR2_xtensa I'd rather use some positive logic. In toolchain/Config.in, maybe something like this: config BR2_TOOLCHAIN_CAN_SUPPORT_DLANG bool depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9 depends on BR2_TOLCHAIN_USES_GLIBC default y if BR2_arm default y if BR2_x86_64 default y if ... and then re-use that for both the internal and external toolchain cases. Thanks! Thomas
On 07/10/2019 09:10, Thomas Petazzoni wrote: > Hello, > > On Sun, 6 Oct 2019 17:12:28 +0200 > Eric Le Bihan <eric.le.bihan.dev@free.fr> wrote: > >> Looking at libphobos/libdruntime/core/sys/posix/sys/types.d turned out >> to be very informative. It contains a list of definitions per C-runtime >> mapped to architecture/OS. Bionic, uclibc and musl are supported but >> only for a limited set of architectures. For some of them, >> __SIZEOF_PTHREAD_ATTR_T and friends are redefined. >> >> ARM is supported for uclibc, but Aarch64 is not (hence the build >> failure). Adding the missing definitions from >> libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h is >> trivial, but then the build chokes on siginfo_t not being correct. So >> deep work is required. >> >> Even some combinations defined in types.d fail to build (e.g. >> x86_64+musl or ARM/uclibc). >> >> In the end, glibc turns out to be the only C-runtime covering most of >> the architectures supported by Buildroot: x86_64, Aarch64, ARM, >> MIPS{32,64}, PPC{,64}, RISCV32 and SPARC64. > > OK. > >> In order to restrict the supported architectures, should >> package/gcc/Config.in.host be updated to look like this? >> >> ``` >> config BR2_TOOLCHAIN_BUILDROOT_DLANG >> bool "Enable D language support" >> depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9 >> depends on BR2_TOOLCHAIN_USES_GLIBC >> depends on !BR2_arc >> depends on !BR2_csky >> depends on !BR2_m68k >> depends on !BR2_microblaze >> depends on !BR2_nds32 >> depends on !BR2_nios2 >> depends on !BR2_or1k >> depends on !BR2_sparc >> depends on !BR2_xtensa > > I'd rather use some positive logic. In toolchain/Config.in, maybe > something like this: > > config BR2_TOOLCHAIN_CAN_SUPPORT_DLANG > bool > depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9 > depends on BR2_TOLCHAIN_USES_GLIBC > default y if BR2_arm > default y if BR2_x86_64 > default y if ... > > and then re-use that for both the internal and external toolchain cases. Nack that. An external toolchain may use a gcc branch that does support additional architectures or a different libc or a gcc version < 9. So for the external toolchain, there should just be a BR2_TOOLCHAIN_EXTERNAL_CUSTOM_DLANG that is user-settable (and verified with a compiler test). Also, there should be a hidden BR2_TOOLCHAIN_HAS_DLANG option that gets selected by BR2_TOOLCHAIN_BUILDROOT_DLANG and BR2_TOOLCHAIN_EXTERNAL_CUSTOM_DLANG (and possibly by other external toolchains in the future). Regards, Arnout > > Thanks! > > Thomas >
On Mon, 7 Oct 2019 23:09:28 +0200 Arnout Vandecappelle <arnout@mind.be> wrote: > > config BR2_TOOLCHAIN_CAN_SUPPORT_DLANG > > bool > > depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9 > > depends on BR2_TOLCHAIN_USES_GLIBC > > default y if BR2_arm > > default y if BR2_x86_64 > > default y if ... > > > > and then re-use that for both the internal and external toolchain cases. > > Nack that. An external toolchain may use a gcc branch that does support > additional architectures or a different libc or a gcc version < 9. So for the > external toolchain, there should just be a BR2_TOOLCHAIN_EXTERNAL_CUSTOM_DLANG > that is user-settable (and verified with a compiler test). That's true. I thought about that when writing my reply, but didn't see a good solution to handle that. > Also, there should be a hidden BR2_TOOLCHAIN_HAS_DLANG option that gets > selected by BR2_TOOLCHAIN_BUILDROOT_DLANG and > BR2_TOOLCHAIN_EXTERNAL_CUSTOM_DLANG (and possibly by other external toolchains > in the future). This is exactly what I suggested in my initial reply to Eric's patches. Best regards, Thomas
diff --git a/package/gcc/Config.in.host b/package/gcc/Config.in.host index fc0333d08f..1e772dc0f2 100644 --- a/package/gcc/Config.in.host +++ b/package/gcc/Config.in.host @@ -121,6 +121,16 @@ config BR2_TOOLCHAIN_BUILDROOT_FORTRAN Fortran language and you want Fortran libraries to be installed on your target system. +config BR2_TOOLCHAIN_BUILDROOT_DLANG + bool "Enable D language support" + depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9 + depends on BR2_TOOLCHAIN_USES_GLIBC + select BR2_TOOLCHAIN_HAS_DLANG + help + Enable this option if you want your toolchain to support the + D language and you want D libraries to be installed on your + target system. + config BR2_GCC_ENABLE_LTO bool "Enable compiler link-time-optimization support" select BR2_BINUTILS_ENABLE_LTO diff --git a/package/gcc/gcc-final/gcc-final.mk b/package/gcc/gcc-final/gcc-final.mk index f478fde0d7..79c88a5d60 100644 --- a/package/gcc/gcc-final/gcc-final.mk +++ b/package/gcc/gcc-final/gcc-final.mk @@ -55,6 +55,7 @@ endef # Languages supported by the cross-compiler GCC_FINAL_CROSS_LANGUAGES-y = c GCC_FINAL_CROSS_LANGUAGES-$(BR2_INSTALL_LIBSTDCPP) += c++ +GCC_FINAL_CROSS_LANGUAGES-$(BR2_TOOLCHAIN_BUILDROOT_DLANG) += d GCC_FINAL_CROSS_LANGUAGES-$(BR2_TOOLCHAIN_BUILDROOT_FORTRAN) += fortran GCC_FINAL_CROSS_LANGUAGES = $(subst $(space),$(comma),$(GCC_FINAL_CROSS_LANGUAGES-y)) @@ -172,6 +173,10 @@ ifeq ($(BR2_INSTALL_LIBSTDCPP),y) HOST_GCC_FINAL_USR_LIBS += libstdc++ endif +ifeq ($(BR2_TOOLCHAIN_BUILDROOT_DLANG),y) +HOST_GCC_FINAL_USR_LIBS += libgdruntime libgphobos +endif + ifeq ($(BR2_TOOLCHAIN_BUILDROOT_FORTRAN),y) HOST_GCC_FINAL_USR_LIBS += libgfortran # fortran needs quadmath on x86 and x86_64
Since version 9.1, GCC provides support for the D programming language [1]. So add a Kconfig entry to enable support for it. [1] https://dlang.org/ Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr> --- package/gcc/Config.in.host | 10 ++++++++++ package/gcc/gcc-final/gcc-final.mk | 5 +++++ 2 files changed, 15 insertions(+)