Skip to content

Linux Clang

Linux Clang #12

Workflow file for this run

on:
workflow_dispatch:
inputs:
clang_bootstrap_major_version:
description: "Major version of clang we'll use to build the clang toolchain."
type: number
required: true
clang_version:
description: "Version of clang we'll build."
type: string
required: true
runner:
description: "Type of runner to use/architecture to build for."
type: choice
options:
- toolchains-ubuntu-22.04-x86
- toolchains-ubuntu-22.04-arm
cpu_target:
description: "Type of CPU to optimize for."
type: string
required: false
github_tag:
description: "Tag to upload the release to."
type: string
required: false
name: Linux Clang
jobs:
build_clang:
name: build clang ${{ inputs.runner }}
runs-on: ${{ inputs.runner }}
permissions:
contents: write
steps:
- name: Install required tools
run: sudo apt-get install -y zstd cmake gcc ninja
- name: Clone MaterializeInc/toolchains repo
uses: actions/checkout@v4
- name: Install bootstrap clang
run: sudo clang/llvm.sh ${{ inputs.clang_bootstrap_major_version }}
- name: Clone llvm-project at Version
uses: actions/checkout@v4
with:
repository: llvm/llvm-project
ref: 'llvmorg-${{ inputs.clang_version }}'
fetch-depth: 1 # llvm-project is quite large
path: llvm-project
- name: Get args
run: |
TARGET_CPU_ARG=""
if [ -n "${{ inputs.target_cpu }}" ]; then
TARGET_CPU_ARG="-mcpu=${{ inputs.target_cpu }}"
fi
echo "TARGET_CPU_ARG=$TARGET_CPU_ARG" >> $GITHUB_ENV
case ${{ inputs.runner }} in
toolchains-ubuntu-22.04-x86)
CLANG_ARCH=x86_64
;;
toolchains-ubuntu-22.04-arm)
CLANG_ARCH=aarch64
;;
*)
echo "Programming error, unknown runner"
exit 1
;;
esac
echo "CLANG_ARCH=$CLANG_ARCH" >> $GITHUB_ENV
echo "CLANG_TARGET=$CLANG_ARCH-unknown-linux-gnu" >> $GITHUB_ENV
C_BINARY="clang-${{ inputs.clang_bootstrap_major_version }}"
echo "C_BINARY=$C_BINARY" >> $GITHUB_ENV
CXX_BINARY="clang++-${{ inputs.clang_bootstrap_major_version }}"
echo "CXX_BINARY=$CXX_BINARY" >> $GITHUB_ENV
LLD_BINARY="lld-${{ inputs.clang_bootstrap_major_version }}"
echo "LLD_BINARY=$LLD_BINARY" >> $GITHUB_ENV
RELEASE_TAG="clang-${{ inputs.clang_version }}"
if [ -n "${{ inputs.github_tag }}" ]; then
RELEASE_TAG="${{ inputs.github_tag }}"
fi
echo "RELEASE_TAG=$RELEASE_TAG" >> $GITHUB_ENV
echo $GITHUB_ENV
- name: cmake configure
run: |
libs_dir="$CLANG_ARCH"-linux-gnu
echo $libs_dir
cd llvm-project
cmake -G Ninja -S llvm -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS="$TARGET_CPU_ARG -flto=thin -pthread" \
-DCMAKE_CXX_FLAGS="$TARGET_CPU_ARG -flto=thin -pthread" \
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION="on" \
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind;compiler-rt" \
-DLLVM_DISTRIBUTION_COMPONENTS="clang-resource-headers" \
-DCMAKE_C_COMPILER="$C_BINARY" \
-DCMAKE_CXX_COMPILER="$CXX_BINARY" \
-DCMAKE_CXX_STANDARD=17 \
-DLLVM_STATIC_LINK_CXX_STDLIB=ON \
-DLLVM_USE_LINKER="$LLD_BINARY" \
-DLLVM_ENABLE_LTO=Thin \
-DLLVM_ENABLE_PIC=ON \
-DLLVM_ENABLE_THREADS=ON \
-DBUILD_SHARED_LIBS=OFF \
-DLLVM_INCLUDE_UTILS=OFF \
-DLLVM_INCLUDE_TESTS=OFF \
-DLLVM_INCLUDE_EXAMPLES=OFF \
-DLLVM_INCLUDE_BENCHMARKS=OFF \
-DLLVM_INCLUDE_DOCS=OFF \
-DTerminfo_LIBRARIES=/usr/lib/$libs_dir/libtinfo.a \
-DZLIB_LIBRARY=/usr/lib/$libs_dir/libz.a
- name: build clang
run: |
cd llvm-project
CC="$C_BINARY" CXX="$CXX_BINARY" LD="$LLD_BINARY" cmake --build build --target \
clang \
lld \
llvm-ar \
llvm-as \
llvm-cov \
llvm-dwp \
llvm-libtool-darwin \
llvm-nm \
llvm-objcopy \
llvm-objdump \
llvm-profdata \
llvm-strip \
llvm-ranlib \
cxx \
cxxabi \
unwind \
builtins
- name: package toolchain
run: |
mkdir package package/bin package/lib package/include
cat clang/bin.txt | while read -r val; do val=${val#linux}; eval cp -rP llvm-project/build/bin/$val package/bin/; done
cat clang/include.txt | while read -r val; do val=${val#linux}; eval cp -rP llvm-project/build/include/$val package/include/; done
cat clang/lib.txt | while read -r val; do val=${val#linux}; eval cp -rP llvm-project/build/lib/$val package/lib/; done
cd package
tar -cf - * | zstd --ultra -22 -o "../linux_$CLANG_ARCH.tar.zst"
- name: Upload Toolchain Artifact
uses: actions/upload-artifact@v4
with:
name: toolchains
path: "*.tar.zst"
- name: Upload toolchain to release
uses: svenstaro/upload-release-action@v2
with:
file: "*.tar.zst"
file_glob: true
tag: ${{ env.RELEASE_TAG }}
overwrite: true