Rust prebuilt #50
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Rust prebuilt | |
on: workflow_dispatch | |
jobs: | |
build: | |
name: Rust [${{matrix.arch}}-${{matrix.os}}-${{matrix.version}}] | |
runs-on: ${{matrix.runner}} | |
strategy: | |
fail-fast: false | |
matrix: | |
arch: [ x86_64 ] | |
os: [ windows, macos, ubuntu-20.04, ubuntu-22.04 ] | |
version: [ 1.73.0 ] | |
include: | |
- os: windows | |
runner: windows-2022 | |
- os: macos | |
runner: macos-latest | |
- os: ubuntu-20.04 | |
runner: ubuntu-20.04 | |
- os: ubuntu-22.04 | |
runner: ubuntu-22.04 | |
steps: | |
- name: Preflight | |
shell: pwsh | |
run: | | |
$LlvmVersion = "16.0.6" | |
$LlvmRunId = '${{ github.event.inputs.run_id }}' | |
if ($LlvmRunId -eq 'latest') { | |
$LlvmRunId = $(gh run list -w 'LLVM prebuilt' --json 'status,databaseId,conclusion') | | |
ConvertFrom-Json | Where-Object { ($_.status -eq 'completed') -and ($_.conclusion -eq 'success') } | | |
Select-Object -First 1 -ExpandProperty databaseId | |
} | |
echo "LLVM_VERSION=$LlvmVersion" >> $Env:GITHUB_ENV | |
echo "LLVM_RUN_ID=$LlvmRunId" >> $Env:GITHUB_ENV | |
$RustBuildDir = if ($IsWindows) { "C:\rust" } else { "${{runner.temp}}" } | |
echo "RUST_BUILD_DIR=$RustBuildDir" >> $Env:GITHUB_ENV | |
- name: Set up Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: '3.9' | |
- name: Configure Windows runner | |
if: runner.os == 'Windows' | |
shell: pwsh | |
run: | | |
choco install --no-progress ninja 7zip wget | |
Install-Module VsDevShell -Force | |
docker system prune -a -f # free some space on C:\ | |
New-Item -Path $Env:RUST_BUILD_DIR -ItemType Directory | Out-Null | |
- name: Configure macOS runner | |
if: runner.os == 'macOS' | |
run: | | |
brew install ninja | |
echo "MACOSX_DEPLOYMENT_TARGET=10.13" >> $GITHUB_ENV | |
- name: Configure Linux runner | |
if: runner.os == 'Linux' | |
run: | | |
sudo apt update | |
sudo apt install ninja-build xz-utils | |
sudo apt install g++-aarch64-linux-gnu | |
- name: Configure Android NDK | |
if: runner.os == 'linux' | |
shell: pwsh | |
run: | | |
$CargoConfigFile = "~/.cargo/config" | |
$AndroidToolchain="${Env:ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64" | |
Get-ChildItem -Path $AndroidToolchain "libunwind.a" -Recurse | ForEach-Object { | |
$libunwind = $_.FullName | |
$libgcc = Join-Path $_.DirectoryName "libgcc.a" | |
if (-Not (Test-Path $libgcc)) { | |
Write-Host $libgcc | |
Copy-Item $libunwind $libgcc | |
} | |
} | |
echo "[target.i686-linux-android]" >> $CargoConfigFile | |
echo "linker=`"$AndroidToolchain/bin/i686-linux-android21-clang`"" >> $CargoConfigFile | |
echo "CC_i686-linux-android=$AndroidToolchain/bin/i686-linux-android21-clang" >> $Env:GITHUB_ENV | |
echo "AR_i686-linux-android=$AndroidToolchain/bin/llvm-ar" >> $Env:GITHUB_ENV | |
Copy-Item "$AndroidToolchain/bin/llvm-ar" "$AndroidToolchain/bin/i686-linux-android21-ar" | |
echo "[target.x86_64-linux-android]" >> $CargoConfigFile | |
echo "linker=`"$AndroidToolchain/bin/x86_64-linux-android21-clang`"" >> $CargoConfigFile | |
echo "CC_x86_64-linux-android=$AndroidToolchain/bin/x86_64-linux-android21-clang" >> $Env:GITHUB_ENV | |
echo "AR_x86_64-linux-android=$AndroidToolchain/bin/llvm-ar" >> $Env:GITHUB_ENV | |
Copy-Item "$AndroidToolchain/bin/llvm-ar" "$AndroidToolchain/bin/x86_64-linux-android21-ar" | |
echo "[target.armv7-linux-androideabi]" >> $CargoConfigFile | |
echo "linker=`"$AndroidToolchain/bin/armv7a-linux-androideabi21-clang`"" >> $CargoConfigFile | |
echo "CC_armv7-linux-androideabi=$AndroidToolchain/bin/armv7a-linux-androideabi21-clang" >> $Env:GITHUB_ENV | |
echo "AR_armv7-linux-androideabi=$AndroidToolchain/bin/llvm-ar" >> $Env:GITHUB_ENV | |
Copy-Item "$AndroidToolchain/bin/llvm-ar" "$AndroidToolchain/bin/armv7a-linux-androideabi21-ar" | |
echo "[target.aarch64-linux-android]" >> $CargoConfigFile | |
echo "linker=`"$AndroidToolchain/bin/aarch64-linux-android21-clang`"" >> $CargoConfigFile | |
echo "CC_aarch64-linux-android=$AndroidToolchain/bin/aarch64-linux-android21-clang" >> $Env:GITHUB_ENV | |
echo "AR_aarch64-linux-android=$AndroidToolchain/bin/llvm-ar" >> $Env:GITHUB_ENV | |
Copy-Item "$AndroidToolchain/bin/llvm-ar" "$AndroidToolchain/bin/aarch64-linux-android21-ar" | |
- name: Install clang+llvm | |
shell: pwsh | |
env: | |
GH_TOKEN: ${{ github.token }} | |
run: | | |
$LlvmPlatform='${{matrix.os}}' | |
$LlvmArch='x86_64' | |
$LlvmVersion = $Env:LLVM_VERSION | |
$LlvmRunId = $Env:LLVM_RUN_ID | |
$LlvmName="clang+llvm-${LlvmVersion}-${LlvmArch}-${LlvmPlatform}" | |
& gh run download $LlvmRunId --repo $Env:GITHUB_REPOSITORY -n $LlvmName | |
if ($IsWindows) { | |
$TempDir = "C:/temp" | |
$LLVM_PREFIX = "C:/llvm" | |
cmd.exe /c "7z.exe x ${LlvmName}.tar.xz -so | 7z x -si -ttar -o`"C:/temp`"" | |
mv "$TempDir/${LlvmName}" $LLVM_PREFIX | |
} else { | |
$TempDir = "/tmp" | |
$LLVM_PREFIX = "/opt/llvm" | |
tar -xvf "${LlvmName}.tar.xz" -C $TempDir | |
sudo mv "$TempDir/${LlvmName}" $LLVM_PREFIX | |
} | |
$LLVM_BIN_PATH="$LLVM_PREFIX/bin" | |
$LLVM_DIR="$LLVM_PREFIX/lib/cmake/llvm" | |
echo "LLVM_DIR=$LLVM_DIR" >> $Env:GITHUB_ENV | |
echo "LLVM_CONFIG=$LLVM_CONFIG" >> $Env:GITHUB_ENV | |
echo "PATH=$LLVM_BIN_PATH$([IO.Path]::PathSeparator)$Env:PATH" >> $Env:GITHUB_ENV | |
- name: Clone project | |
uses: actions/checkout@v3 | |
with: | |
path: llvm-prebuilt | |
- name: Clone Rust ${{matrix.version}} | |
uses: actions/checkout@v3 | |
with: | |
repository: rust-lang/rust | |
ref: ${{matrix.version}} | |
submodules: true | |
fetch-depth: 1 | |
path: rust | |
- name: Patch Rust | |
shell: pwsh | |
run: | | |
git -C rust apply ../llvm-prebuilt/patches/rust-${{matrix.version}}-disable-filecheck-tool-sanity-checks.patch | |
if ($IsWindows) { | |
git -C rust apply ../llvm-prebuilt/patches/rust-${{matrix.version}}-force-windows-msvc-dynamic-runtime-linking.patch | |
} | |
- name: Configure Rust | |
shell: pwsh | |
working-directory: rust | |
run: | | |
$RustBuildDir = "$Env:RUST_BUILD_DIR".Replace('\','\\') | |
$RustLlvmConfig = $Env:LLVM_CONFIG.Replace('\','\\') | |
$RustHostArch = '${{matrix.arch}}' | |
$RustHostPlatform = @{'windows'='pc-windows-msvc'; | |
'macos'='apple-darwin';'linux'='unknown-linux-gnu';}['${{runner.os}}'] | |
$RustHostTarget = "$RustHostArch-$RustHostPlatform" | |
$RustTargets = @{ | |
'windows' = @('x86_64-pc-windows-msvc', 'aarch64-pc-windows-msvc'); | |
'macos' = @('x86_64-apple-darwin', 'aarch64-apple-darwin', | |
'x86_64-apple-ios', 'aarch64-apple-ios'); | |
'linux' = @('x86_64-unknown-linux-gnu', 'aarch64-unknown-linux-gnu', | |
'i686-linux-android', 'armv7-linux-androideabi', | |
'x86_64-linux-android', 'aarch64-linux-android'); | |
}['${{runner.os}}'] | |
$config = @( | |
"changelog-seen=2", | |
"[llvm]", | |
"download-ci-llvm=false", | |
"ninja=true", | |
"link-shared=false", | |
"static-libstdcpp=false", | |
"targets=`"X86;ARM;AArch64;WebAssembly`"" | |
"[build]", | |
"docs=false", | |
"host=[`"$RustHostTarget`"]", | |
"target=[$($RustTargets | Join-String -DoubleQuote -Separator ',')]", | |
"build-dir=`"$RustBuildDir`"", | |
"[install]", | |
"[rust]", | |
"channel=`"stable`"", | |
"dist-src=false", | |
"[target.${RustHostTarget}]", | |
"llvm-config=`"${RustLlvmConfig}`"", | |
"crt-static=false", | |
"[dist]", | |
"src-tarball=false", | |
"compression-formats=[`"xz`"]" | |
) | |
Set-Content -Path .\config.toml -Value $config | |
- name: Build and package Rust | |
shell: pwsh | |
working-directory: rust | |
run: | | |
Remove-Item Env:GITHUB_ACTIONS | |
python x.py dist | |
- name: Upload Rust | |
uses: actions/upload-artifact@v3 | |
with: | |
name: rust-${{matrix.version}}-${{matrix.arch}}-${{matrix.os}} | |
path: ${{steps.dynamic-variables.outputs.rust-build-dir}}/dist |