mbox series

[v2,00/12] Add the support for Clang cross-compiler

Message ID 20190907094027.9537-1-romain.naour@smile.fr
Headers show
Series Add the support for Clang cross-compiler | expand

Message

Romain Naour Sept. 7, 2019, 9:40 a.m. UTC
Last year Valentin Korenblit added during his internship at Smile,
llvm/clang packages to provide llvm/clang libraries for the target.
See the article from Valentin on Linuxembedded blog [1].

But Clang could not be used as a cross-compiler by Buildroot since
it was necessary to build the Linux kernel with GCC [2].

Recently, I've tried to build an aarch64 Linux kernel (5.2.7) with
Clang and it worked under Qemu [3]. I also tested for x86_64 but we need
the upcomming llvm/clang version 9 to build the kernel [4].
This new version add the support of "asm-goto" which was the last
missing part to be able to build the Linux kernel on x86_64 [5].
But for theses tests, only the kernel was built with Clang.

While testing the x86_64 kernel and it's rootfs built with Clang under Qemu,
I had a runtime issue during the userspace boot process (Busybox's init).
While searching about the issue, I discover the lowRISC blog from Luís Marques
about the same issue and tested the patch he contributed to the Busybox project
(Thanks!).

So, this series is about to complete the integration of Clang as cross-compiler
by using a toolchain-wrapper and fixing some build system infrastructure
(cmake, meson) to use Clang instead of GCC.

Add this new experimental option into "Advanced" menu since we are expecting
some build and runtime issues for number of packages (bootloaders, kernel).

For now, Clang cross-compiler can only be use as internal toolchain,
so it is build from the source which take a long time...

[1] http://www.linuxembedded.fr/2018/07/llvmclang-integration-into-buildroot
[2] https://www.elinux.org/Buildroot:DeveloperDaysFOSDEM2018#LLVM.2FClang
[3] http://www.linuxembedded.fr/2019/08/my-first-linux-kernel-built-with-clang-compiler
[4] https://www.phoronix.com/scan.php?page=news_item&px=LLVM-9.0-RC3-Released
[5] https://www.phoronix.com/scan.php?page=news_item&px=LLVM-Asm-Goto-Merged
[6] https://www.lowrisc.org/blog/2019/07/large-scale-risc-v-llvm-testing-with-buildroot

Best regards,
Romain

v2: Fix pkg-meson (missing $) and keep TARGET_CROSS in sed command for other tools (as etc).
    Install the GCC external toolchain before executing realpath command.
	Move host-clang dependency to toolchain virtual package since host-clang now
	 depends on external-toolchain.
	Add Glibc toolchain dependency
	Use GCC to build Glibc for internal toolchain.

Romain Naour (12):
  package/clang: help host-clang to find our external toolchain
  package/llvm: add the version major variable
  package/clang: add the version major variable
  package/clang: install a toolchain-wrapper for the host clang
    cross-compiler
  linux: override CC for the case CC is not GCC
  package/meson: use TARGET_{CC,CXX} instead of TARGET_CROSS for cc and
    cpp
  package/busybox: fix applets runtime issue when building with clang
    cross-compiler
  package/clang: add a host entry for clang
  package/glibc: use GCC cross-compiler if Clang is used as
    cross-compiler
  core: allow to use Clang as cross-compiler
  toolchain: add a warning when Clang is used as cross-compiler
  linux: don't set -Wno-attribute-alias flag when Clang is used as
    cross-compiler

 Config.in                                     |  23 +++
 linux/linux.mk                                |   4 +-
 package/Config.in.host                        |   1 +
 package/Makefile.in                           |  13 +-
 ...use-BB_GLOBAL_CONST-where-applicable.patch | 173 ++++++++++++++++++
 ...hains-Gnu-Use-GCC_INSTALL_PREFIX-in-.patch |  76 ++++++++
 package/clang/Config.in.host                  |  19 ++
 package/clang/clang.mk                        |  51 +++++-
 package/glibc/glibc.mk                        |   5 +
 package/llvm/llvm.mk                          |   3 +-
 package/meson/cross-compilation.conf.in       |   4 +-
 package/meson/meson.mk                        |   2 +
 package/pkg-meson.mk                          |   2 +
 toolchain/Config.in                           |   6 +
 toolchain/toolchain/toolchain.mk              |   7 +
 15 files changed, 381 insertions(+), 8 deletions(-)
 create mode 100644 package/busybox/0003-use-BB_GLOBAL_CONST-where-applicable.patch
 create mode 100644 package/clang/0001-lib-Driver-ToolChains-Gnu-Use-GCC_INSTALL_PREFIX-in-.patch
 create mode 100644 package/clang/Config.in.host

Comments

Arnout Vandecappelle Aug. 29, 2020, 6:53 p.m. UTC | #1
Hi Romain,

 After almost a year, let's try to make some progress on this series :-)

On 07/09/2019 11:40, Romain Naour wrote:
[snip]
> Recently, I've tried to build an aarch64 Linux kernel (5.2.7) with
> Clang and it worked under Qemu [3]. I also tested for x86_64 but we need
> the upcomming llvm/clang version 9 to build the kernel [4].

 Since we waited long enough, this is now in Buildroot :-)

> This new version add the support of "asm-goto" which was the last
> missing part to be able to build the Linux kernel on x86_64 [5].
> But for theses tests, only the kernel was built with Clang.
> 
> While testing the x86_64 kernel and it's rootfs built with Clang under Qemu,
> I had a runtime issue during the userspace boot process (Busybox's init).
> While searching about the issue, I discover the lowRISC blog from Luís Marques
> about the same issue and tested the patch he contributed to the Busybox project
> (Thanks!).
> 
> So, this series is about to complete the integration of Clang as cross-compiler
> by using a toolchain-wrapper and fixing some build system infrastructure
> (cmake, meson) to use Clang instead of GCC.

 I started integrating the series, but then I had some fundamental problems with
the core patch itself. So I stopped and pushed my results to
https://gitlab.com/arnout/buildroot branch clang-as-cross-compiler. I put my
changes as squash patches rather than changing the original patches, so you can
easily take over from there. Note that I haven't tested my rebased and modified
branch (just a build test immediately after applying the modified patch), so
there may still be some rebase f**up there.

 I'll put my feedback in the individual patches.

 Regards,
 Arnout

> 
> Add this new experimental option into "Advanced" menu since we are expecting
> some build and runtime issues for number of packages (bootloaders, kernel).
> 
> For now, Clang cross-compiler can only be use as internal toolchain,
> so it is build from the source which take a long time...
[snip]
Romain Naour Sept. 14, 2020, 7:53 p.m. UTC | #2
Hi Arnout,

Le 29/08/2020 à 20:53, Arnout Vandecappelle a écrit :
>  Hi Romain,
> 
>  After almost a year, let's try to make some progress on this series :-)
> 
> On 07/09/2019 11:40, Romain Naour wrote:
> [snip]
>> Recently, I've tried to build an aarch64 Linux kernel (5.2.7) with
>> Clang and it worked under Qemu [3]. I also tested for x86_64 but we need
>> the upcomming llvm/clang version 9 to build the kernel [4].
> 
>  Since we waited long enough, this is now in Buildroot :-)

We are in late about llvm version, the version 11 should be released anytime soon.

> 
>> This new version add the support of "asm-goto" which was the last
>> missing part to be able to build the Linux kernel on x86_64 [5].
>> But for theses tests, only the kernel was built with Clang.
>>
>> While testing the x86_64 kernel and it's rootfs built with Clang under Qemu,
>> I had a runtime issue during the userspace boot process (Busybox's init).
>> While searching about the issue, I discover the lowRISC blog from Luís Marques
>> about the same issue and tested the patch he contributed to the Busybox project
>> (Thanks!).
>>
>> So, this series is about to complete the integration of Clang as cross-compiler
>> by using a toolchain-wrapper and fixing some build system infrastructure
>> (cmake, meson) to use Clang instead of GCC.
> 
>  I started integrating the series, but then I had some fundamental problems with
> the core patch itself. So I stopped and pushed my results to
> https://gitlab.com/arnout/buildroot branch clang-as-cross-compiler. I put my
> changes as squash patches rather than changing the original patches, so you can
> easily take over from there. Note that I haven't tested my rebased and modified
> branch (just a build test immediately after applying the modified patch), so
> there may still be some rebase f**up there.
> 
>  I'll put my feedback in the individual patches.

Thanks!

I'm not sure how many free time I will able to devote to this series.
I recently did a test with llvm/clang 10 for risv64 [1] but the series needs
some work to be upstreamable...

I'd like to be able to work on this series as a full day job :)

[1] https://asciinema.org/a/DDspJVktlVl1Rh97dwLgtYcRY

Best regards,
Romain

> 
>  Regards,
>  Arnout
> 
>>
>> Add this new experimental option into "Advanced" menu since we are expecting
>> some build and runtime issues for number of packages (bootloaders, kernel).
>>
>> For now, Clang cross-compiler can only be use as internal toolchain,
>> so it is build from the source which take a long time...
> [snip]
>