Skip to content

Instantly share code, notes, and snippets.

@sztomi
Created November 8, 2023 13:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sztomi/ff7b90b35f253b2f8f397389d98fc5b2 to your computer and use it in GitHub Desktop.
Save sztomi/ff7b90b35f253b2f8f397389d98fc5b2 to your computer and use it in GitHub Desktop.
toolchain.yml
settings:
host:
os: Linux
arch: x86_64
build_type: Release
build:
os: Linux
arch: x86_64
build_type: Release
constants:
EXEEXT: ""
TARGET: x86_64-buildroot-linux-gnu
env:
cmake.CC: x86_64-buildroot-linux-gnu-gcc
cmake.CXX: x86_64-buildroot-linux-gnu-g++
cmake.CFLAGS: -fdata-sections -ffunction-sections
cmake.CXXFLAGS: -fdata-sections -ffunction-sections
cmake.LDFLAGS: -Wl,--gc-sections -static-libgcc -static-libstdc++
binutils.CC: x86_64-buildroot-linux-gnu-gcc
binutils.CXX: x86_64-buildroot-linux-gnu-g++
binutils.LDFLAGS: -static-libgcc -static-libstdc++
ninja.CC: x86_64-buildroot-linux-gnu-gcc
ninja.CXX: x86_64-buildroot-linux-gnu-g++
ninja.LDFLAGS: -static-libgcc -static-libstdc++
zlib-host.CC: x86_64-buildroot-linux-gnu-gcc
zlib-host.CXX: x86_64-buildroot-linux-gnu-g++
zlib-host.LDFLAGS: -static-libgcc -static-libstdc++
zstd-host.CC: x86_64-buildroot-linux-gnu-gcc
zstd-host.CXX: x86_64-buildroot-linux-gnu-g++
zstd-host.LDFLAGS: -static-libgcc -static-libstdc++
minimum_version: 0.1.0
constants:
LLVM_COMMIT: 309d55140c46384b6de7a7573206cbeba3f7077f
MUSL_COMMIT: 31fb5b3ac38e020fa88eaa748b541107d758c2b7
KERNEL_HEADERS_COMMIT: 22bba0124dfe2728ef5b4555baa1ae0960492665
CHRPATH_COMMIT: d86b06e16c37353e35c61c048af29b577c93f08d
GCC_SYSROOT_VERSION: 2022.08-1
ZLIB_VERSION: 1.2.13
ZSTD_VERSION: 1.5.5
CMAKE_VERSION: 3.27.7
NASM_VERSION: 2.14.02
NINJA_VERSION: 1.11.1
BINUTILS_VERSION: "2.37"
GCC_SYSROOTS_URL: https://toolchains.bootlin.com/downloads/releases/toolchains
GH: https://github.com
sources:
- path: llvm-project
kind: archive
url: "${GH}/llvm/llvm-project/archive/${LLVM_COMMIT}.tar.gz"
sha256: a24528bc46fb436cb5aa949ef38e0c90d60dbd88c22e7bd9c6d7020c789e28b0
- path: gcc-sysroots/aarch64-buildroot-linux-gnu
package: gcc-sysroots
kind: archive
url: "${GCC_SYSROOTS_URL}/aarch64/tarballs/aarch64--glibc--bleeding-edge-${GCC_SYSROOT_VERSION}.tar.bz2"
sha256: d11a94113dc92fe1c141096dbeb1c3fe2adb0552b495bb9e3e41fad96b4b429a
- path: gcc-sysroots/x86_64-buildroot-linux-gnu
package: gcc-sysroots
kind: archive
url: "${GCC_SYSROOTS_URL}/x86-64-v2/tarballs/x86-64-v2--glibc--bleeding-edge-${GCC_SYSROOT_VERSION}.tar.bz2"
sha256: 7ac996b2ca1acdcdaddce38a3fd19bc30b864f6b73f8e6d0537243e912b5d36f
- path: gcc-sysroots/arm-buildroot-linux-gnueabihf
package: gcc-sysroots
kind: archive
url: "${GCC_SYSROOTS_URL}/armv7-eabihf/tarballs/armv7-eabihf--glibc--bleeding-edge-${GCC_SYSROOT_VERSION}.tar.bz2"
sha256: 7a3ceba0e5ed7ccb16da16e630a905c76c2ea58f66d161d6d45dce33321e70f6
- path: musl
kind: archive
url: "${GH}/sztomi/musl/archive/${MUSL_COMMIT}.tar.gz"
sha256: d23d22fd78099f53e0f97fed5cee64a4114b37b9f55d0b03c6b7ddcdfd32fb01
- path: kernel-headers
kind: archive
url: "${GH}/sabotage-linux/kernel-headers/archive/${KERNEL_HEADERS_COMMIT}.tar.gz"
sha256: 95d43aac7b195c961c316116b20d820cc9e5dfc311b1db79bd61a7a9a54c9540
- path: binutils
kind: archive
url: "https://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERSION}.tar.xz"
sha256: 820d9724f020a3e69cb337893a0b63c2db161dadcb0e06fc11dc29eb1e84a32c
- path: zlib
kind: archive
url: "${GH}/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz"
sha256: b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30
- path: chrpath
kind: archive
url: "${GH}/openEuler-BaseService/chrpath/archive/${CHRPATH_COMMIT}.zip"
sha256: fac86fd52404a3ede2866b6372affe11c889bde42fa622829d275a5196939d07
- path: cmake
kind: archive
url: "${GH}/Kitware/CMake/archive/refs/tags/v${CMAKE_VERSION}.zip"
sha256: 5b98831309e8660de930c245f2552300a2090698ccbbbc9da1feff908c041488
- path: nasm
kind: archive
url: "https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VERSION}/nasm-${NASM_VERSION}.tar.gz"
sha256: b34bae344a3f2ed93b2ca7bf25f1ed3fb12da89eeda6096e3551fd66adeae9fc
- path: ninja
kind: archive
url: "${GH}/ninja-build/ninja/archive/refs/tags/v${NINJA_VERSION}.zip"
sha256: 03b7ea14bf04b87cbdd64b9a1262577093e177f8e5662515de77f3a796b75951
- path: zstd
kind: archive
url: "${GH}/facebook/zstd/releases/download/v${ZSTD_VERSION}/zstd-${ZSTD_VERSION}.tar.gz"
sha256: 9c4396cc829cfae319a6e2615202e82aad41372073482fce286fac78646d3ee4
toolchains:
gcc-toolchain:
ROOTDIR: ${package_dir("gcc-sysroots")}/${TARGET}
BIN: "[ROOTDIR]/bin"
CMAKE_C_COMPILER: "[BIN]/${TARGET}-gcc"
CMAKE_CXX_COMPILER: "[BIN]/${TARGET}-g++"
CMAKE_C_COMPILER_TARGET: "${TARGET}"
CMAKE_CXX_COMPILER_TARGET: "${TARGET}"
CMAKE_OBJC_COMPILER_TARGET: "${TARGET}"
CMAKE_OBJCXX_COMPILER_TARGET: "${TARGET}"
CMAKE_AR: "[BIN]/${TARGET}-ar"
CMAKE_NM: "[BIN]/${TARGET}-nm"
CMAKE_RANLIB: "[BIN]/${TARGET}-ranlib"
CMAKE_SYSROOT: "[ROOTDIR]/${TARGET}/sysroot"
CMAKE_STRIP: "[BIN]/${TARGET}-strip"
CMAKE_OBJCOPY: "[BIN]/${TARGET}-objcopy"
CMAKE_LINKER: "[BIN]/${TARGET}-ld.gold"
CMAKE_READELF: "[BIN]/${TARGET}-readelf"
CMAKE_SYSTEM_NAME: "${build.os}"
CMAKE_SYSTEM_PROCESSOR: "${build.arch}"
clang-stage1:
ROOTDIR: ${package_dir("clang-stage1")}
SYSROOT: ${package_dir("gcc-sysroots")}/${TARGET}/${TARGET}/sysroot
BIN: "[ROOTDIR]/bin"
CMAKE_C_COMPILER: "[BIN]/${TARGET}-clang"
CMAKE_CXX_COMPILER: "[BIN]/${TARGET}-clang++"
CMAKE_C_COMPILER_TARGET: "${TARGET}"
CMAKE_CXX_COMPILER_TARGET: "${TARGET}"
CMAKE_OBJC_COMPILER_TARGET: "${TARGET}"
CMAKE_OBJCXX_COMPILER_TARGET: "${TARGET}"
CMAKE_AR: "[BIN]/llvm-ar"
CMAKE_NM: "[BIN]/llvm-nm"
CMAKE_RANLIB: "[BIN]/llvm-ranlib"
CMAKE_SYSROOT: "[SYSROOT]"
CMAKE_STRIP: "[BIN]/llvm-strip"
CMAKE_OBJCOPY: "[BIN]/llvm-objcopy"
CMAKE_LINKER: "[BIN]/ld64.lld"
CMAKE_READELF: "[BIN]/llvm-readelf"
CMAKE_SYSTEM_NAME: "${build.os}"
CMAKE_SYSTEM_PROCESSOR: "${build.arch}"
packages:
- package: zlib-bootstrap
kind: cmake
requires: gcc-sysroots, cmake, ninja
source-dir: zlib
toolchain: gcc-toolchain
defs:
BUILD_SHARED_LIBS: OFF
ZLIB_COMPAT: ON
# - package: zlib-host
# kind: cmake
# build:
# - ninja install # by default
# install:
# - noop # by default
#
# package info, beyond the install dir is probably not needed
- package: zstd-bootstrap
kind: cmake
requires: gcc-sysroots, cmake, ninja
source-dir: zstd/build/cmake
toolchain: gcc-toolchain
defs:
ZSTD_BUILD_STATIC: ON
ZSTD_BUILD_SHARED: OFF
- package: gcc-sysroots
if: ${build.os == "Linux"}
kind: shell
source-dir: gcc-sysroots
copy-sources: false
env:
PACKAGE_DIR: ${package_dir("gcc-sysroots")}
SOURCE_DIR: ${source_dir("gcc-sysroots")}
export-env:
# PATH+ means append to PATH. +PATH means prepend to PATH.
PATH+: :${package_dir("gcc-sysroots")}/x86_64-buildroot-linux-gnu/bin
script: |
<%text>
set -x
PACKAGES=(
"x86_64-buildroot-linux-gnu"
"aarch64-buildroot-linux-gnu"
"arm-buildroot-linux-gnueabihf"
)
stuff_to_remove=(
"sysroot/dev"
"sysroot/etc/resolv.conf"
"sysroot/etc/mtab"
)
package_folder="$PACKAGE_DIR"
# Build the exclusion list for rsync
exclusions=()
for exclude in "${stuff_to_remove[@]}"; do
exclusions+=(--exclude="$exclude")
done
# Function to copy contents excluding unwanted paths using rsync
copy_excluding() {
local src=$1
local dest=$2
rsync -aq --links "${exclusions[@]}" "$src" "$dest"
}
triple="x86_64-buildroot-linux-gnu"
subdirs=("bin" "etc" "include" "lib" "lib64" "share" "libexec" "${triple}")
for subdir in "${subdirs[@]}"; do
src="$SOURCE_DIR/${triple}/${subdir}"
dest="$PACKAGE_DIR/${triple}"
copy_excluding "${src}" "${dest}"
done
for triple in "${PACKAGES[@]}"; do
src="$SOURCE_DIR/${triple}/${triple}/sysroot"
dest="$PACKAGE_DIR/${triple}/${triple}/sysroot"
if [[ ! -d "${dest}" ]]; then
mkdir -p "${dest}"
fi
copy_excluding "${src}" "${dest}"
done
</%text>
- package: binutils
if: ${build.os == "Linux"}
requires: gcc-sysroots
kind: shell
command: python [[SCRIPT]]
env:
PACKAGE_DIR: ${package_dir("binutils")}
SOURCE_DIR: ${source_dir("binutils")}
BUILD_DIR: ${build_dir("binutils")}
script: |
<%text>
import os
import subprocess as sp
import shutil
from pathlib import Path
from contextlib import contextmanager
PACKAGE_DIR = os.environ["PACKAGE_DIR"]
BUILD_DIR = os.environ["BUILD_DIR"]
@contextmanager
def chdir(path: Path):
old_dir = os.getcwd()
os.chdir(path)
yield
os.chdir(old_dir)
ARCHS = (
"x86_64",
"armv7hf",
"aarch64",
"mingw-x86_64",
)
TRIPLE_MAP = {
"x86_64": "x86_64-unknown-linux-musl",
"aarch64": "aarch64-unknown-linux-musl",
"armv7hf": "arm-unknown-linux-musleabihf",
"mingw-x86_64": "x86_64-w64-mingw32",
}
def build_for_arch(arch):
os.makedirs(f"build-{arch}")
with chdir(f"build-{arch}"):
triple = TRIPLE_MAP[arch]
sp.run([
"../configure",
f"--target={triple}",
f"--prefix={PACKAGE_DIR}/{triple}",
f"--program-prefix={triple}-",
"--enable-lto",
"--disable-nls",
"--disable-gdb",
"--enable-gold=no",
"--enable-ld=yes",
"--disable-gprof",
"--disable-werror",
"--disable-multilib",
"--disable-separate-code",
"--enable-deterministic-archives",
])
sp.run(["make", "-j", f"{os.cpu_count()}"])
sp.run(["make", "-j", f"{os.cpu_count()}", "install"])
for arch in ARCHS:
build_for_arch(arch)
</%text>
# - package: musl
# if: ${build.os == "Linux"}
# requires: kernel-headers, clang-stage1
# kind: autotools
- package: cmake
kind: cmake
requires:
- if ${build.os == "Linux"}: gcc-sysroots
toolchain: gcc-toolchain
generator: Unix Makefiles
defs:
CMAKE_USE_OPENSSL: OFF
CMAKE_BUILD_LTO: ON
BUILD_TESTING: OFF
CMAKE_BUILD_TYPE: MinSizeRel
export-env:
+PATH: "${package_dir('cmake')}/bin:"
- package: kernel-headers
kind: shell
env:
PACKAGE_DIR: ${package_dir("gcc-sysroots")}
SOURCE_DIR: ${source_dir("gcc-sysroots")}
script:
# "x86" means both x86 and x86_64 here
- make -s ARCH=x86 INSTALL_HDR_PATH=${package_dir("kernel-headers")}/x86 install
- make -s ARCH=arm INSTALL_HDR_PATH=${package_dir("kernel-headers")}/arm install
- make -s ARCH=arm64 INSTALL_HDR_PATH=${package_dir("kernel-headers")}/arm64 install
- package: nasm
kind: autotools
requires:
- if ${build.os != "Windows"}: clang-stage1
# configure_cmd: ./configure
env:
CC: ${TARGET}-clang
CXX: ${TARGET}-clang++
args:
- --prefix=${package_dir("nasm")}
env_args:
CFLAGS:
- -fdata-sections -ffunction-sections -flto=thin -O3
- if ${build.os == "Linux" or build.os == "macOS"}: -fPIC -DPIC -fwhole-program-vtables
LDFLAGS: -Wl,--gc-sections -flto=thin
- package: ninja
kind: cmake
requires:
- cmake
- if ${build.os == "Linux"}: gcc-sysroots
toolchain: gcc-toolchain
defs:
CMAKE_CXX_FLAGS: -fdata-sections -ffunction-sections -O3
CMAKE_EXE_LINKER_FLAGS: -fdata-sections -ffunction-sections -O3
- package: clang-stage1
kind: cmake-llvm # special package kind that knows about runtumes, builtins etc.
requires: zlib-bootstrap, zstd-bootstrap, gcc-sysroots, cmake, ninja
source-dir: llvm-project/llvm
env:
BUILD_DIR: ${build_dir("clang-stage1")}
PACKAGE_DIR: ${package_dir("clang-stage1")}
export-env:
+PATH: "${package_dir('clang-stage1')}/bin:"
toolchain: gcc-toolchain
build-target: install-distribution-stripped
defs:
CMAKE_BUILD_TYPE: Release
PACKAGE_VENDOR: LLVMCraft-Bootstrap
BOOSTRAP_LLVM_ENABLE_LLD: ON
BOOSTRAP_LLVM_ENABLE_LTO: ON
CLANG_ENABLE_BOOTSTRAP: ON
CLANG_DEFAULT_RTLIB: compiler-rt
CLANG_DEFAULT_LINKER: lld
CLANG_DEFAULT_OBJCOPY: llvm-objcopy
CLANG_DEFAULT_CXX_STDLIB: libc++
CLANG_DEFAULT_UNWINDLIB: libunwind
CLANG_VENDOR_UTI: com.llvmcraft
CLANG_LINKS_TO_CREATE: clang++;clang-cpp
LLVM_BUILD_TESTS: OFF
LLVM_CCACHE_BUILD: ON
LLVM_DEFAULT_TARGET_TRIPLE: ${TARGET}
LLVM_ENABLE_ASSERTIONS: OFF
LLVM_ENABLE_BINDINGS: OFF
LLVM_ENABLE_LIBXML2: OFF
LLVM_ENABLE_LIBCXX: ON
LLVM_ENABLE_NEW_PASS_MANAGER: ON
#LLVM_ENABLE_PER_TARGET_RUNTIME_DIR: OFF
LLVM_ENABLE_TERMINFO: OFF
LLVM_ENABLE_ZLIB: FORCE_ON
LLVM_ENABLE_ZSTD: FORCE_ON
LLVM_INCLUDE_BENCHMARKS: OFF
LLVM_INCLUDE_EXAMPLES: OFF
LLVM_INCLUDE_GO_TESTS: OFF
LLVM_INCLUDE_TESTS: OFF
LLVM_USE_SANITIZER: OFF
ZLIB_ROOT: ${package_dir("zlib-bootstrap")}
zstd_ROOT: ${package_dir("zstd-bootstrap")}
triples:
- x86_64-buildroot-linux-gnu
targets:
- Native
distribution-components:
- clang-resource-headers
- clang
- lld
- llvm-ar
- llvm-config
- llvm-nm
- llvm-objcopy
- llvm-profdata
- llvm-ranlib
- llvm-strip
- llvm-tblgen
- llvm-strip
- llvm-readelf
- llvm-windres
- LTO
- llvm-lipo
- runtimes
- builtins
projects:
- clang
- lld
runtimes:
- compiler-rt
- libcxx
- libcxxabi
- libunwind
create-links: true # create <target>-clang and <target>-clang++ links
after-install:
- ${SHIM} cp $BUILD_DIR/bin/clang-tblgen $PACKAGE_DIR/bin/clang-tblgen
llvm:
builtins:
x86_64-buildroot-linux-gnu:
CMAKE_SYSTEM_NAME: Linux
CMAKE_BUILD_TYPE: Release
CMAKE_SYSTEM_PROCESSOR: x86_64
CMAKE_C_COMPILER_TARGET: x86_64-buildroot-linux-gnu
CMAKE_CXX_COMPILER_TARGET: x86_64-buildroot-linux-gnu
CMAKE_ASM_COMPILER_TARGET: x86_64-buildroot-linux-gnu
runtimes:
x86_64-buildroot-linux-gnu:
#COMPILER_RT_DEFAULT_TARGET_ONLY: ON
COMPILER_RT_BUILD_SANITIZERS: OFF
COMPILER_RT_BUILD_XRAY: OFF
COMPILER_RT_BUILD_LIBFUZZER: OFF
COMPILER_RT_BUILD_MEMPROF: OFF
COMPILER_RT_BUILD_ORC: OFF
COMPILER_RT_BUILD_GWP_ASAN: OFF
COMPILER_RT_BUILD_PROFILE: ON
LIBCXX_CXX_ABI: libcxxabi
LIBCXX_USE_COMPILER_RT: ON
LIBCXX_ENABLE_STATIC_ABI_LIBRARY: ON
LIBCXX_ABI_UNSTABLE: ON
LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY: ON
LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY: ON
LIBCXX_ABI_VERSION: "2"
- package: clang-stage2
kind: cmake-llvm
requires: zlib-bootstrap, zstd-bootstrap, clang-stage1, cmake, ninja
source-dir: llvm-project/llvm
toolchain: clang-stage1
build-target: install-distribution-stripped
defs:
CMAKE_BUILD_TYPE: Release
PACKAGE_VENDOR: LLVMCraft-Instrumented
CLANG_DEFAULT_CXX_STDLIB: libc++
CLANG_DEFAULT_LINKER: lld
CLANG_DEFAULT_OBJCOPY: llvm-objcopy
CLANG_DEFAULT_RTLIB: compiler-rt
CLANG_DEFAULT_UNWINDLIB: libunwind
CLANG_VENDOR_UTI: com.llvmcraft
CLANG_LINKS_TO_CREATE: clang++;clang-cpp
LLVM_BUILD_INSTRUMENTED: IR
LLVM_BUILD_TESTS: OFF
LLVM_CCACHE_BUILD: ON
LLVM_ENABLE_ASSERTIONS: OFF
LLVM_ENABLE_BINDINGS: OFF
LLVM_ENABLE_LIBCXX: ON
LLVM_ENABLE_LTO: THIN
LLVM_ENABLE_LIBXML2: OFF
LLVM_ENABLE_NEW_PASS_MANAGER: ON
LLVM_ENABLE_TERMINFO: OFF
LLVM_ENABLE_ZLIB: FORCE_ON
LLVM_ENABLE_ZSTD: FORCE_ON
LLVM_FORCE_SMALLFILE_FOR_ANDROID: ON
LLVM_INCLUDE_BENCHMARKS: OFF
LLVM_INCLUDE_EXAMPLES: OFF
LLVM_INCLUDE_GO_TESTS: OFF
LLVM_INCLUDE_TESTS: OFF
LLVM_USE_LINKER: lld
LLVM_OPTIMIZED_TABLEGEN: ON
LLVM_PROFILE_DATA_DIR: ${package_dir("clang-stage2")}/profile/${LLVM_COMMIT}
LLVM_TABLEGEN: ${package_dir("clang-stage1")}/bin/llvm-tblgen
CLANG_TABLEGEN: ${package_dir("clang-stage1")}/bin/clang-tblgen
LLVM_DEFAULT_TARGET_TRIPLE: x86_64-buildroot-linux-gnu
ZLIB_ROOT: ${package_dir("zlib-bootstrap")}
zstd_ROOT: ${package_dir("zstd-bootstrap")}
triples:
- x86_64-buildroot-linux-gnu
targets:
- Native
distribution-components:
- clang
- lld
projects:
- clang
- lld
runtimes:
- compiler-rt
- libcxx
- libcxxabi
- libunwind
# - aarch64-buildroot-linux-gnu
# - arm-buildroot-linux-gnueabihf
# - x86_64-w64-mingw32
# - aarch64-w64-mingw32
create-links: true # create <target>-clang and <target>-clang++ links
llvm:
builtins:
x86_64-buildroot-linux-gnu:
CMAKE_SYSTEM_NAME: Linux
CMAKE_BUILD_TYPE: Release
CMAKE_SYSTEM_PROCESSOR: x86_64
CMAKE_C_COMPILER_TARGET: x86_64-buildroot-linux-gnu
CMAKE_CXX_COMPILER_TARGET: x86_64-buildroot-linux-gnu
CMAKE_ASM_COMPILER_TARGET: x86_64-buildroot-linux-gnu
runtimes:
x86_64-buildroot-linux-gnu:
COMPILER_RT_DEFAULT_TARGET_ONLY: ON
COMPILER_RT_BUILD_SANITIZERS: OFF
COMPILER_RT_BUILD_XRAY: OFF
COMPILER_RT_BUILD_LIBFUZZER: OFF
COMPILER_RT_BUILD_MEMPROF: OFF
COMPILER_RT_BUILD_ORC: OFF
COMPILER_RT_BUILD_GWP_ASAN: OFF
COMPILER_RT_BUILD_PROFILE: ON
COMPILER_RT_SANITIZERS_TO_BUILD: "asan;msan;tsan"
COMPILER_RT_USE_BUILTINS_LIBRARY: ON
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment