Reuse LLVM when compiling Clang

This commit is contained in:
Wildan M 2026-02-01 04:07:49 +07:00
parent ffb8938755
commit 083b1c94d0
No known key found for this signature in database
GPG Key ID: 01AC53185C679C79
7 changed files with 155 additions and 111 deletions

View File

@ -1,2 +0,0 @@
set(CMAKE_C_COMPILER cc)
set(CMAKE_CXX_COMPILER c++)

View File

@ -1,81 +0,0 @@
[source]
same_as = "../llvm21"
[build]
template = "custom"
dependencies = [
]
dev-dependencies = [
"host:xz",
"host:libarchive", # workaround for cmake error
]
script = """
DYNAMIC_INIT
COOKBOOK_CMAKE_FLAGS+=(
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld"
-DLIBCLANG_BUILD_STATIC=On
-DLLVM_INCLUDE_BENCHMARKS=Off
-DLLVM_INCLUDE_DOCS=Off
# the rest of options should be exact with llvm21
-DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$(realpath "${COOKBOOK_RECIPE}/native.cmake")"
-DCMAKE_CXX_FLAGS="--std=gnu++11"
-DBUILD_SHARED_LIBS=False
-DLLVM_LINK_LLVM_DYLIB=On
-DLLVM_BUILD_EXAMPLES=Off
-DLLVM_BUILD_TESTS=Off
-DLLVM_DEFAULT_TARGET_TRIPLE="${TARGET}"
-DLLVM_ENABLE_LTO=Off
-DLLVM_ENABLE_RTTI=On
-DLLVM_ENABLE_THREADS=On
-DLLVM_INCLUDE_EXAMPLES=Off
-DLLVM_INCLUDE_TESTS=Off
-DLLVM_OPTIMIZED_TABLEGEN=On
-DLLVM_TARGET_ARCH="$(echo "${TARGET}" | cut -d - -f1)"
-DLLVM_TARGETS_TO_BUILD="X86"
-DLLVM_TOOL_LLVM_COV_BUILD=Off
-DLLVM_TOOL_LLVM_PROFDATA_BUILD=Off
-DLLVM_TOOLS_INSTALL_DIR=bin
-DLLVM_UTILS_INSTALL_DIR=bin
-DUNIX=1
)
# Native tablegen build fails with too many jobs, limit to 16
COOKBOOK_MAKE_JOBS="$(( ${COOKBOOK_MAKE_JOBS} > 16 ? 16 : ${COOKBOOK_MAKE_JOBS} ))"
COOKBOOK_SOURCE="$COOKBOOK_SOURCE/llvm"
cookbook_cmake
# Redundant LLVM packages
rm -rf ${COOKBOOK_STAGE}/usr/include/llvm* \
${COOKBOOK_STAGE}/usr/lib/libLLVM*.a \
${COOKBOOK_STAGE}/usr/lib/cmake/llvm \
${COOKBOOK_STAGE}/usr/bin/llvm-* \
"""
# lld runtime (no library)
[[optional-packages]]
name = "lld"
dependencies = [ ".runtime" ]
files = [
"usr/bin/*.lld",
"usr/bin/*-ld",
"usr/bin/lld*",
]
[[optional-packages]]
name = "dev"
files = [
"usr/include/clang*/**",
"usr/lib/libclang*.a",
"usr/lib/cmake/clang/**",
]
[[optional-packages]]
name = "lld-dev"
dependencies = [ ".lld" ]
files = [
"usr/include/lld*/**",
"usr/lib/liblld*.a",
"usr/lib/cmake/lld/**",
]

View File

@ -0,0 +1,109 @@
[source]
same_as = "../llvm21"
[build]
template = "custom"
dependencies = [
"llvm21",
]
dev-dependencies = [
"host:clang21", # for clang-tblgen
"host:llvm21",
"host:llvm21.dev",
"host:llvm21.runtime",
"host:xz",
"host:libarchive", # workaround for cmake error
]
script = """
DYNAMIC_INIT
ARCH="$(echo "${TARGET}" | cut -d - -f1)"
generate_cookbook_cmake_file $COOKBOOK_HOST_TARGET "" "$COOKBOOK_TOOLCHAIN" native.cmake
COOKBOOK_CMAKE_FLAGS+=(
-DLLVM_ROOT="${COOKBOOK_SYSROOT}"
-DCLANG_LINK_CLANG_DYLIB=ON
-DLLVM_TABLEGEN_EXE=${COOKBOOK_TOOLCHAIN}/bin/llvm-tblgen
-DLIBCLANG_BUILD_STATIC=1
-DLLVM_BUILD_UTILS=On
# the shared options from llvm
-DCMAKE_CXX_FLAGS="--std=gnu++11"
-DBUILD_SHARED_LIBS=False
-DLLVM_BUILD_EXAMPLES=Off
-DLLVM_BUILD_TESTS=Off
-DLLVM_DEFAULT_TARGET_TRIPLE="${TARGET}"
-DLLVM_ENABLE_LTO=Off
-DLLVM_ENABLE_RTTI=On
-DLLVM_ENABLE_THREADS=On
-DLLVM_INCLUDE_EXAMPLES=Off
-DLLVM_INCLUDE_TESTS=Off
-DLLVM_OPTIMIZED_TABLEGEN=On
-DLLVM_TARGET_ARCH=$ARCH
-DLLVM_TARGETS_TO_BUILD="X86"
-DLLVM_TOOLS_INSTALL_DIR=bin
-DLLVM_UTILS_INSTALL_DIR=bin
-DUNIX=1
)
COOKBOOK_SOURCE="$COOKBOOK_SOURCE/clang"
if [ "$TARGET" = "$COOKBOOK_HOST_TARGET" ]; then
"${COOKBOOK_CMAKE}" "${COOKBOOK_SOURCE}" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_INCLUDEDIR=include \
-DCMAKE_INSTALL_LIBDIR=lib \
-DCMAKE_INSTALL_OLDINCLUDEDIR=/include \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_SBINDIR=bin \
-DCMAKE_TOOLCHAIN_FILE=native.cmake \
-GNinja \
-Wno-dev \
"${COOKBOOK_CMAKE_FLAGS[@]}" \
"$@"
# All distros use clever tricks to this problem. I have no idea how I came up with this
export PATH="$PATH:$COOKBOOK_STAGE/usr/bin"
DESTDIR="${COOKBOOK_STAGE}" "${COOKBOOK_NINJA}" install-clang-tblgen
"${COOKBOOK_NINJA}" -j"${COOKBOOK_MAKE_JOBS}"
DESTDIR="${COOKBOOK_STAGE}" "${COOKBOOK_NINJA}" install -j"${COOKBOOK_MAKE_JOBS}"
else
COOKBOOK_CMAKE_FLAGS+=(
-DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$(realpath native.cmake)"
-DCLANG_TABLEGEN_EXE=${COOKBOOK_TOOLCHAIN}/bin/clang-tblgen
)
cookbook_cmake
fi
"""
# lld runtime (no library)
[[optional-packages]]
name = "lld"
dependencies = [ ".runtime" ]
files = [
"usr/bin/*.lld",
"usr/bin/*-ld",
"usr/bin/lld*",
]
[[optional-packages]]
name = "dev"
files = [
"usr/include/clang*/**",
"usr/lib/libclang*.a",
"usr/lib/cmake/clang/**",
]
[[optional-packages]]
name = "lld-dev"
dependencies = [ ".lld" ]
files = [
"usr/include/lld*/**",
"usr/lib/liblld*.a",
"usr/lib/cmake/lld/**",
]

View File

@ -11,24 +11,28 @@ dependencies = [
"libxml2",
]
dev-dependencies = [
"libstdcxx",
"host:xz",
"host:libarchive", # workaround for cmake error
]
script = """
DYNAMIC_INIT
ARCH="$(echo "${TARGET}" | cut -d - -f1)"
# This just build the LLVM library and tools just enough for Rust, to build the rest of LLVM see
# https://github.com/llvm/llvm-zorg/blob/main/zorg/buildbot/builders/annotated/standalone-build.sh
COOKBOOK_CMAKE_FLAGS+=(
-DLLVM_BUILD_UTILS=On
-DLLVM_BUILD_LLVM_DYLIB=On
-DLLVM_LINK_LLVM_DYLIB=On
-DLLVM_INCLUDE_UTILS=On
-DLLVM_INSTALL_UTILS=On
-DLLVM_TOOL_LLVM_COV_BUILD=On
-DLLVM_TOOL_LLVM_PROFDATA_BUILD=On
-DLLVM_INSTALL_UTILS=On
# the rest of options that shared to clang
-DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$(realpath "${COOKBOOK_RECIPE}/native.cmake")"
-DCMAKE_CXX_FLAGS="--std=gnu++11"
-DBUILD_SHARED_LIBS=False
-DLLVM_LINK_LLVM_DYLIB=On
-DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$(realpath "${COOKBOOK_RECIPE}/native.cmake")"
-DLLVM_BUILD_EXAMPLES=Off
-DLLVM_BUILD_TESTS=Off
-DLLVM_DEFAULT_TARGET_TRIPLE="${TARGET}"
@ -38,7 +42,7 @@ COOKBOOK_CMAKE_FLAGS+=(
-DLLVM_INCLUDE_EXAMPLES=Off
-DLLVM_INCLUDE_TESTS=Off
-DLLVM_OPTIMIZED_TABLEGEN=On
-DLLVM_TARGET_ARCH="$(echo "${TARGET}" | cut -d - -f1)"
-DLLVM_TARGET_ARCH=$ARCH
-DLLVM_TARGETS_TO_BUILD="X86"
-DLLVM_TOOLS_INSTALL_DIR=bin
-DLLVM_UTILS_INSTALL_DIR=bin

View File

@ -13,10 +13,10 @@ dependencies = [
dev-dependencies = [
"llvm21.dev",
"llvm21.runtime",
"clang",
"clang.dev",
"clang.lld-dev",
"clang.lld",
"clang21",
"clang21.dev",
"clang21.lld-dev",
"clang21.lld",
"host:libarchive",
"host:zig",
]

View File

@ -27,7 +27,7 @@ dependencies = [
"libxrandr",
"libsm",
# TODO: Should separate clang library and runtime
"clang"
"clang21"
# "sqlite3",
# "nss-nspr",
# "startup-notification",
@ -41,7 +41,7 @@ dev-dependencies = [
"host:llvm21",
"host:llvm21.dev",
"host:llvm21.runtime",
"host:clang",
"host:clang21",
]
script = """
DYNAMIC_INIT

View File

@ -198,33 +198,47 @@ COOKBOOK_CMAKE_FLAGS=(
-DENABLE_SHARED=False
-DENABLE_STATIC=True
)
function cookbook_cmake {
if [ "$(echo "${TARGET}" | cut -d - -f3)" = "linux" ]; then
SYSTEM_NAME="Linux"
else
SYSTEM_NAME="UnixPaths"
fi
cat > cross_file.cmake <<EOF
set(CMAKE_AR ${GNU_TARGET}-ar)
set(CMAKE_CXX_COMPILER ${GNU_TARGET}-g++)
set(CMAKE_C_COMPILER ${GNU_TARGET}-gcc)
set(CMAKE_FIND_ROOT_PATH ${COOKBOOK_SYSROOT})
function generate_cookbook_cmake_file {
target=$1
gcc_prefix=$2
sysroot=$3
file=$4
arch=$(echo "$target" | cut -d - -f1)
os=$(echo "$target" | cut -d - -f3)
if [ "$os" = "linux" ]; then
SYSTEM_NAME="Linux"
else
SYSTEM_NAME="UnixPaths"
fi
cat > $file <<EOF
set(CMAKE_AR ${gcc_prefix}ar)
set(CMAKE_CXX_COMPILER ${gcc_prefix}g++)
set(CMAKE_C_COMPILER ${gcc_prefix}gcc)
set(CMAKE_FIND_ROOT_PATH ${sysroot})
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_PLATFORM_USES_PATH_WHEN_NO_SONAME 1)
set(CMAKE_PREFIX_PATH, ${COOKBOOK_SYSROOT})
set(CMAKE_RANLIB ${GNU_TARGET}-ranlib)
set(CMAKE_PREFIX_PATH, ${sysroot})
set(CMAKE_RANLIB ${gcc_prefix}ranlib)
set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,")
set(CMAKE_SYSTEM_NAME ${SYSTEM_NAME})
set(CMAKE_SYSTEM_PROCESSOR $(echo "${TARGET}" | cut -d - -f1))
set(CMAKE_SYSTEM_PROCESSOR ${arch})
EOF
if [ -n "${CC_WRAPPER}" ]
then
echo "set(CMAKE_C_COMPILER_LAUNCHER ${CC_WRAPPER})" >> cross_file.cmake
echo "set(CMAKE_CXX_COMPILER_LAUNCHER ${CC_WRAPPER})" >> cross_file.cmake
echo "set(CMAKE_C_COMPILER_LAUNCHER ${CC_WRAPPER})" >> $file
echo "set(CMAKE_CXX_COMPILER_LAUNCHER ${CC_WRAPPER})" >> $file
fi
}
function cookbook_cmake {
generate_cookbook_cmake_file $TARGET $GNU_TARGET- "$COOKBOOK_SYSROOT" cross_file.cmake
"${COOKBOOK_CMAKE}" "${COOKBOOK_SOURCE}" \
-DCMAKE_BUILD_TYPE=Release \