Re: cross compile dietlibc with clang for arm
Giorgio Dal Molin <[email protected]> Mon, 16 Dec 2019 18:08:47 +0100 (CET)
| Newsgroups | gmane.linux.lib.dietlibc |
|---|---|
| Message-ID | <[email protected]> |
Hi,
I build the clang cross compiler from its git repo:
git://github.com/llvm/llvm-project.git
The structure of the project makes it possible to configure / build / install a native
compiler and some cross compilers in one go.
I attached the rc shell script I use to automate the build; it's a bit lengthy because
of the repeated BUILTIN / RUNTIMES blocks; it builds a native c/c++ compiler, and 3
crosscompilers for the triples: 'x86_64-atom-linux-gnu' (intel atom E3825),
'arm-cortexa7-linux-gnueabihf' (imx7) and 'aarch64-v8a-linux-gnu' (raspi 3).
To build the cross compilers I also need a cross compiled libc who's prefix path is given
in the CFLAGS with the command line options:
'--gcc-toolchain=$atom_gcc_toolchain' and '--sysroot=$atom_sysroot'
but I'm not sure this is really mandatory to build the cross compilers or if it's
only needed for the BUILTINS and RUNTIMES (libunwind;compiler-rt;libcxxabi;libcxx).
The resulting clang / clang++ drivers can be used for native compile or cross by specifying
the '-target <triple>' option or by calling the clang driver through the symlink '<triple>-clang'.
The symlink trick is particularly important when cross compiling dietlibc so that the 'diet'
wrapper can work properly.
giorgio
Here is the script:
#!/bin/rc
if ( test $#* '-lt' '2' ) {
echo 'syntax: build.rc <build_bir> <src_dir>'
exit 1
}
build_root_dir=`{realpath $1} #`
src_root_dir=`{realpath $2} #`
atom_triple='x86_64-atom-linux-gnu'
atom_gcc_toolchain='/opt/crosstc/'$atom_triple
atom_sysroot=$atom_gcc_toolchain'/sysroot-'$atom_triple
atom_optflags='-O2 -march=bonnell'
atom_cflags=$atom_optflags' --gcc-toolchain='$atom_gcc_toolchain' --sysroot='$atom_sysroot
cortexa7_triple='arm-cortexa7-linux-gnueabihf'
cortexa7_gcc_toolchain='/opt/crosstc/'$cortexa7_triple
cortexa7_sysroot=$cortexa7_gcc_toolchain'/sysroot-'$cortexa7_triple
cortexa7_optflags='-O2 -march=armv7-a -mfpu=neon-vfpv4 -mtune=cortex-a7 -mfloat-abi=hard'
cortexa7_cflags=$cortexa7_optflags' --gcc-toolchain='$cortexa7_gcc_toolchain' --sysroot='$cortexa7_sysroot
cortexa53_triple='aarch64-v8a-linux-gnu'
cortexa53_gcc_toolchain='/opt/crosstc/'$cortexa53_triple
cortexa53_sysroot=$cortexa53_gcc_toolchain'/sysroot-'$cortexa53_triple
cortexa53_optflags='-O2 -march=armv8-a -mcpu=cortex-a53+crc+crypto -mtune=cortex-a53 -ftree-vectorize'
cortexa53_cflags=$cortexa53_optflags' --gcc-toolchain='$cortexa53_gcc_toolchain' --sysroot='$cortexa53_sysroot
native_triple='x86_64-pc-linux-gnu'
native_cflags='-O2 -march=native'
args=( '-DCMAKE_INSTALL_PREFIX=/opt/cross' \
'-DCMAKE_CXX_STANDARD=17' \
'-DLLVM_DEFAULT_TARGET_TRIPLE='$native_triple \
'-DLLVM_ENABLE_FFI=YES' \
'-DLLVM_ENABLE_LIBCXX=ON' \
'-DCMAKE_BUILD_TYPE=Release' \
'-DCMAKE_POSITION_INDEPENDENT_CODE=YES' \
'-DLLVM_BUILD_LLVM_DYLIB=YES' \
'-DLLVM_LINK_LLVM_DYLIB=YES' \
'-DLLVM_ENABLE_RTTI=YES' \
'-DLLVM_TARGETS_TO_BUILD=host;X86;AMDGPU;BPF;AArch64;ARM' \
'-DLLVM_BUILD_TESTS=NO' \
'-DLLVM_INCLUDE_TESTS=NO' \
'-DLLVM_INSTALL_UTILS=YES' \
'-DLLVM_BUILD_TOOLS=YES' \
'-DLLVM_LIBDIR_SUFFIX=' \
'-DLLVM_BUILD_DOCS=NO' \
'-DLLVM_ENABLE_DOXYGEN=NO' \
'-DLLVM_ENABLE_SPHINX=NO' \
'-DLLVM_ENABLE_BINDINGS=OFF' \
'-DLLVM_ENABLE_IDE=NO' \
'-DLLVM_ENABLE_LLD=YES' \
'-DPYTHON_EXECUTABLE=/usr/bin/python3' \
\
'-DLLVM_ENABLE_Z3_SOLVER=YES' \
\
'-DLLVM_ENABLE_PROJECTS=clang;lldb;lld' \
'-DLLVM_ENABLE_RUNTIMES=libunwind;compiler-rt;libcxxabi;libcxx' \
'-DLLVM_BUILTIN_TARGETS='$native_triple';'$atom_triple';'$cortexa7_triple';'$cortexa53_triple \
'-DLLVM_RUNTIME_TARGETS='$native_triple';'$atom_triple';'$cortexa7_triple';'$cortexa53_triple \
'-DBUILTINS_'$native_triple'_CMAKE_C_FLAGS='$native_cflags \
'-DBUILTINS_'$native_triple'_CMAKE_CXX_FLAGS='$native_cflags \
'-DBUILTINS_'$native_triple'_CMAKE_ASM_FLAGS='$native_cflags \
'-DRUNTIMES_'$native_triple'_CMAKE_C_FLAGS='$native_cflags \
'-DRUNTIMES_'$native_triple'_CMAKE_CXX_FLAGS='$native_cflags \
'-DRUNTIMES_'$native_triple'_CMAKE_ASM_FLAGS='$native_cflags \
'-DRUNTIMES_'$native_triple'_LIBCXX_ENABLE_THREADS=YES' \
'-DRUNTIMES_'$native_triple'_LIBCXX_LIBDIR_SUFFIX=' \
'-DRUNTIMES_'$native_triple'_LIBCXX_USE_COMPILER_RT=YES' \
'-DRUNTIMES_'$native_triple'_LIBCXX_ENABLE_STATIC_ABI_LIBRARY=NO' \
'-DRUNTIMES_'$native_triple'_LIBCXX_CXX_ABI_LIBRARY_PATH='$build_root_dir'/lib/'$native_triple'/c++' \
'-DRUNTIMES_'$native_triple'_LIBCXX_CXX_ABI=libcxxabi' \
'-DRUNTIMES_'$native_triple'_LIBCXX_CXX_ABI_INCLUDE_PATHS='$src_root_dir'/libcxxabi/include' \
'-DRUNTIMES_'$native_triple'_LIBCXXABI_USE_LLVM_UNWINDER=YES' \
'-DRUNTIMES_'$native_triple'_LIBCXXABI_ENABLE_STATIC_UNWINDER=YES' \
'-DRUNTIMES_'$native_triple'_LIBCXXABI_ENABLE_STATIC=YES' \
'-DRUNTIMES_'$native_triple'_LIBUNWIND_ENABLE_THREADS=YES' \
'-DRUNTIMES_'$native_triple'_LIBUNWIND_ENABLE_CROSS_UNWINDING=YES' \
'-DRUNTIMES_'$native_triple'_LIBUNWIND_ENABLE_SHARED=YES' \
'-DRUNTIMES_'$native_triple'_LIBUNWIND_ENABLE_STATIC=YES' \
\
'-DBUILTINS_'$atom_triple'_CMAKE_C_FLAGS='$atom_cflags \
'-DBUILTINS_'$atom_triple'_CMAKE_CXX_FLAGS='$atom_cflags \
'-DBUILTINS_'$atom_triple'_CMAKE_ASM_FLAGS='$atom_cflags \
'-DRUNTIMES_'$atom_triple'_CMAKE_C_FLAGS='$atom_cflags \
'-DRUNTIMES_'$atom_triple'_CMAKE_CXX_FLAGS='$atom_cflags \
'-DRUNTIMES_'$atom_triple'_CMAKE_ASM_FLAGS='$atom_cflags \
'-DRUNTIMES_'$atom_triple'_LIBCXX_ENABLE_THREADS=YES' \
'-DRUNTIMES_'$atom_triple'_LIBCXX_LIBDIR_SUFFIX=' \
'-DRUNTIMES_'$atom_triple'_LIBCXX_USE_COMPILER_RT=YES' \
'-DRUNTIMES_'$atom_triple'_LIBCXX_ENABLE_STATIC_ABI_LIBRARY=NO' \
'-DRUNTIMES_'$atom_triple'_LIBCXX_CXX_ABI_LIBRARY_PATH='$build_root_dir'/lib/'$atom_triple'/c++' \
'-DRUNTIMES_'$atom_triple'_LIBCXX_CXX_ABI=libcxxabi' \
'-DRUNTIMES_'$atom_triple'_LIBCXX_CXX_ABI_INCLUDE_PATHS='$src_root_dir'/libcxxabi/include' \
'-DRUNTIMES_'$atom_triple'_LIBCXXABI_USE_LLVM_UNWINDER=YES' \
'-DRUNTIMES_'$atom_triple'_LIBCXXABI_ENABLE_STATIC_UNWINDER=YES' \
'-DRUNTIMES_'$atom_triple'_LIBCXXABI_ENABLE_STATIC=YES' \
'-DRUNTIMES_'$atom_triple'_LIBUNWIND_ENABLE_THREADS=YES' \
'-DRUNTIMES_'$atom_triple'_LIBUNWIND_ENABLE_CROSS_UNWINDING=YES' \
'-DRUNTIMES_'$atom_triple'_LIBUNWIND_ENABLE_SHARED=YES' \
'-DRUNTIMES_'$atom_triple'_LIBUNWIND_ENABLE_STATIC=YES' \
\
'-DBUILTINS_'$cortexa7_triple'_CMAKE_C_FLAGS='$cortexa7_cflags \
'-DBUILTINS_'$cortexa7_triple'_CMAKE_CXX_FLAGS='$cortexa7_cflags \
'-DBUILTINS_'$cortexa7_triple'_CMAKE_ASM_FLAGS='$cortexa7_cflags \
'-DRUNTIMES_'$cortexa7_triple'_CMAKE_C_FLAGS='$cortexa7_cflags \
'-DRUNTIMES_'$cortexa7_triple'_CMAKE_CXX_FLAGS='$cortexa7_cflags \
'-DRUNTIMES_'$cortexa7_triple'_CMAKE_ASM_FLAGS='$cortexa7_cflags \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXX_ENABLE_THREADS=YES' \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXX_LIBDIR_SUFFIX=' \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXX_USE_COMPILER_RT=YES' \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXX_ENABLE_STATIC_ABI_LIBRARY=NO' \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXX_CXX_ABI_LIBRARY_PATH='$build_root_dir'/lib/'$cortexa7_triple'/c++' \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXX_CXX_ABI=libcxxabi' \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXX_CXX_ABI_INCLUDE_PATHS='$src_root_dir'/libcxxabi/include' \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXXABI_USE_LLVM_UNWINDER=YES' \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXXABI_ENABLE_STATIC_UNWINDER=YES' \
'-DRUNTIMES_'$cortexa7_triple'_LIBCXXABI_ENABLE_STATIC=YES' \
'-DRUNTIMES_'$cortexa7_triple'_LIBUNWIND_ENABLE_THREADS=YES' \
'-DRUNTIMES_'$cortexa7_triple'_LIBUNWIND_ENABLE_CROSS_UNWINDING=YES' \
'-DRUNTIMES_'$cortexa7_triple'_LIBUNWIND_ENABLE_SHARED=YES' \
'-DRUNTIMES_'$cortexa7_triple'_LIBUNWIND_ENABLE_STATIC=YES' \
\
'-DBUILTINS_'$cortexa53_triple'_CMAKE_C_FLAGS='$cortexa53_cflags \
'-DBUILTINS_'$cortexa53_triple'_CMAKE_CXX_FLAGS='$cortexa53_cflags \
'-DBUILTINS_'$cortexa53_triple'_CMAKE_ASM_FLAGS='$cortexa53_cflags \
'-DRUNTIMES_'$cortexa53_triple'_CMAKE_C_FLAGS='$cortexa53_cflags \
'-DRUNTIMES_'$cortexa53_triple'_CMAKE_CXX_FLAGS='$cortexa53_cflags \
'-DRUNTIMES_'$cortexa53_triple'_CMAKE_ASM_FLAGS='$cortexa53_cflags \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXX_ENABLE_THREADS=YES' \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXX_LIBDIR_SUFFIX=' \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXX_USE_COMPILER_RT=YES' \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXX_ENABLE_STATIC_ABI_LIBRARY=NO' \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXX_CXX_ABI_LIBRARY_PATH='$build_root_dir'/lib/'$cortexa53_triple'/c++' \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXX_CXX_ABI=libcxxabi' \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXX_CXX_ABI_INCLUDE_PATHS='$src_root_dir'/libcxxabi/include' \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXXABI_USE_LLVM_UNWINDER=YES' \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXXABI_ENABLE_STATIC_UNWINDER=YES' \
'-DRUNTIMES_'$cortexa53_triple'_LIBCXXABI_ENABLE_STATIC=YES' \
'-DRUNTIMES_'$cortexa53_triple'_LIBUNWIND_ENABLE_THREADS=YES' \
'-DRUNTIMES_'$cortexa53_triple'_LIBUNWIND_ENABLE_CROSS_UNWINDING=YES' \
'-DRUNTIMES_'$cortexa53_triple'_LIBUNWIND_ENABLE_SHARED=YES' \
'-DRUNTIMES_'$cortexa53_triple'_LIBUNWIND_ENABLE_STATIC=YES' \
)
{ mkdir -p $build_root_dir && CC=gcc CXX=g++ cmake $args '-Wno-dev' '-G' Ninja -S $src_root_dir/llvm -B $build_root_dir && ninja -v -C $build_root_dir }
> On December 16, 2019 at 2:02 PM Felix von Leitner <[email protected]> wrote:
>
>
> > ...
> > arm-cortexa7-linux-gnueabihf-clang -I. -isystem include -pipe -nostdinc -D_REENTRANT -Wall -O2 -fstack-protector-all -march=armv7-a -mtune=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 --sysroot=/opt/OSELAS.Toolchain/arm-cortexa7-linux-gnueabihf/sysroot-arm-cortexa7-linux-gnueabihf --gcc-toolchain=/opt/OSELAS.Toolchain/arm-cortexa7-linux-gnueabihf -ffunction-sections -fdata-sections -fno-stack-protector -std=gnu99 -fno-builtin-bcmp -fomit-frame-pointer -fstrict-aliasing -W -Wall -Wextra -Wchar-subscripts -Wmissing-prototypes -Wmissing-declarations -Wno-switch -Wno-unused -Wredundant-decls -Wshadow -c arm/unified.S -Wa,--noexecstack -o bin-arm/unified.o
>
> I would love to officially support cross compiling with clang but I
> never found out how to do it. Where did you get the
> arm-cortexa7-linux-gnueabihf-clang (I assume it's a wrapper) and what
> exactly does it do?
>
> Felix