Add a Compiler option to profile the compilation time #3361
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: Build and test | |
# README: | |
# | |
# The semantics for running shell commands in GitHub actions is non-obvious. Please read | |
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell | |
# before modifying this file. Our strategy is to rely on the built-in (unspecified) shell, and | |
# explicitly set the shell settings we want (with `set -eo pipefail`) at the beginning of any | |
# bash script. For more information on these settings, see `man bash`. | |
# | |
# GitHub Actions files can be difficult to modify with confidence, because testing changes often | |
# requires pushing to a branch and running CI remotely. To make this process easier, consider | |
# the following: | |
# | |
# 1) Use Visual Studio Code with the GitHub Actions Extension (github.vscode-github-actions). | |
# This allows you to check the validity of your action schema and syntax without pushing to a | |
# branch. | |
# 2) Use https://github.com/nektos/act to run your CI steps locally. Note this will only work with | |
# steps run on Linux platforms, as `act` is implemented with Docker containers. | |
# | |
on: | |
push: | |
branches: [main] | |
paths-ignore: | |
- "Docs/**" | |
- "**.md" | |
- "README.md" | |
- "LICENSE" | |
- ".gitignore" | |
- ".editorconfig" | |
tags: | |
- v* | |
pull_request: | |
branches: ["**"] | |
paths-ignore: | |
- "Docs/**" | |
- "**.md" | |
- "README.md" | |
- "LICENSE" | |
- ".gitignore" | |
- ".editorconfig" | |
env: | |
spm-build-options: -Xswiftc -enable-testing --explicit-target-dependency-import-check error | |
spm-test-options: --parallel | |
swift-version: '5.10' | |
jobs: | |
determine-version: | |
name: "Determine compiler version from git tag" | |
runs-on: ubuntu-latest | |
outputs: | |
version: ${{ steps.get-tag.outputs.version }} | |
steps: | |
- id: get-tag | |
run: | | |
if [[ "$GITHUB_REF" == refs/tags/* ]]; then | |
version="${GITHUB_REF#refs/tags/}" | |
else | |
version="" | |
fi | |
echo "version=$version" >> "$GITHUB_OUTPUT" | |
devcontainer: | |
needs: determine-version | |
name: Ubuntu dev container/${{ matrix.cmake_build_type }} | |
strategy: | |
fail-fast: false | |
matrix: | |
spm_configuration: [debug, release] | |
include: | |
- spm_configuration: debug | |
cmake_build_type: Debug | |
more-spm-test-options: --enable-code-coverage | |
HYLO_LLVM_BUILD_TYPE: MinSizeRel | |
- spm_configuration: release | |
cmake_build_type: Release | |
HYLO_LLVM_BUILD_TYPE: MinSizeRel | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
show-progress: false | |
- name: Set compiler version | |
run: ./Tools/set-hc-version.sh ${{ needs.determine-version.outputs.version }} | |
- name: Initialize Dev Container | |
uses: devcontainers/[email protected] | |
with: | |
runCmd: uname -a | |
push: never | |
- name: Build and Test via CMake | |
uses: devcontainers/[email protected] | |
env: | |
HYLO_LLVM_BUILD_TYPE: ${{ matrix.HYLO_LLVM_BUILD_TYPE }} | |
with: | |
runCmd: >- | |
cmake -GNinja -S . -B .ninja-build | |
-DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} | |
-DBUILD_TESTING=YES | |
-DLLVM_DIR=/opt/llvm-${{ matrix.HYLO_LLVM_BUILD_TYPE }}/lib/cmake/llvm | |
cmake --build .ninja-build | |
find .ninja-build -name '*.o' -delete | |
find .ninja-build -name '*.a' -delete | |
ctest --parallel --test-dir .ninja-build | |
push: never | |
- name: Reclaim disk space | |
run: rm -rf .ninja-build | |
- name: Restore Cache for SPM | |
uses: actions/cache@v4 | |
with: | |
path: .build | |
key: devcontainer-${{ matrix.spm_configuration }}-spm-${{ hashFiles('**/Package.resolved') }} | |
restore-keys: | | |
${{ runner.os }}-spm- | |
- name: Build and Test via SPM | |
uses: devcontainers/[email protected] | |
with: | |
runCmd: | | |
llvm-cov-15 --version | |
swift test -c ${{ matrix.spm_configuration }} ${{ env.spm-build-options }} ${{ env.spm-test-options }} ${{ matrix.more-spm-test-options }} | |
push: never | |
- name: Export Coverage | |
uses: devcontainers/[email protected] | |
if: ${{ contains(matrix.more-spm-test-options, '--enable-code-coverage') }} | |
with: | |
runCmd: | | |
shopt -s nullglob | |
dot_os=(.build/${{ matrix.spm_configuration }}/*.build/*.o .build/${{ matrix.spm_configuration }}/*.build/**/*.o) | |
bin_params=("${dot_os[0]}") | |
for o in "${dot_os[@]:1}"; do | |
bin_params+=("-object" "${o}") | |
done | |
# Note: on mac using llvm-cov from Xcode might require a leading xcrun. | |
llvm-cov-15 export -format="lcov" -instr-profile "$(swift test -c ${{ matrix.spm_configuration }} --show-codecov-path | xargs dirname)"/default.profdata "${bin_params[@]}" > info.lcov | |
push: never | |
- name: Upload coverage reports to Codecov | |
if: ${{ contains(matrix.more-spm-test-options, '--enable-code-coverage') }} | |
uses: codecov/[email protected] | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
fail_ci_if_error: true | |
- name: Output compiler version | |
uses: devcontainers/[email protected] | |
with: | |
runCmd: .build/${{ matrix.spm_configuration }}/hc --version | |
push: never | |
native: | |
needs: determine-version | |
name: "Native: ${{ matrix.os }}/${{ matrix.spm_configuration }}/${{ matrix.cmake_generator }}" | |
strategy: | |
fail-fast: false | |
matrix: | |
# macos-latest is apparently not the latest. | |
os: [macos-13, ubuntu-latest, windows-latest] | |
spm_configuration: [debug, release] | |
cmake_generator: [Ninja, Xcode] | |
exclude: | |
- os: ubuntu-latest | |
cmake_generator: Xcode | |
- os: windows-latest | |
cmake_generator: Xcode | |
include: | |
- HYLO_LLVM_BUILD_RELEASE: 20240303-215025 | |
- HYLO_LLVM_BUILD_TYPE: MinSizeRel | |
- HYLO_LLVM_DOWNLOAD_URL: https://github.com/hylo-lang/llvm-build/releases/download | |
- HYLO_LLVM_VERSION: '17.0.6' | |
- llvm_package_suffix: .tar.zst | |
- unpackage_command: tar -x --zstd -f | |
# https://github.com/apple/swift/issues/72121 | |
- windows_only: '# WINDOWS ONLY:' | |
- on_windows_and_spm_works: false | |
- use_spm: true | |
- os: windows-latest | |
unpackage_command: 7z x -t7z | |
llvm_package_suffix: .7z | |
triple_suffix: unknown-windows-msvc17 | |
windows_only: '' | |
- os: windows-latest | |
use_spm: false | |
- os: macos-13 | |
triple_suffix: apple-darwin23.3.0 | |
- os: ubuntu-latest | |
triple_suffix: unknown-linux-gnu | |
- spm_configuration: debug | |
cmake_build_type: Debug | |
- spm_configuration: release | |
cmake_build_type: Release | |
- cmake_generator: Xcode | |
use_spm: false | |
runs-on: ${{ matrix.os }} | |
env: | |
llvm_url_prefix: ${{ matrix.HYLO_LLVM_DOWNLOAD_URL }}/${{ matrix.HYLO_LLVM_BUILD_RELEASE }} | |
llvm_package_basename: llvm-${{ matrix.HYLO_LLVM_VERSION }}-x86_64-${{ matrix.triple_suffix }}-${{ matrix.HYLO_LLVM_BUILD_TYPE }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
submodules: true | |
show-progress: false | |
path: hylo | |
- name: Set compiler version | |
working-directory: hylo | |
run: ./Tools/set-hc-version.sh ${{ needs.determine-version.outputs.version }} | |
shell: bash | |
- name: Set up swift (non-Windows) | |
if: ${{ runner.os != 'Windows' }} | |
uses: SwiftyLab/setup-swift@latest | |
with: | |
swift-version: ${{ env.swift-version }} | |
cache-snapshot: false # Workaround for https://github.com/SwiftyLab/setup-swift/issues/315 | |
- uses: compnerd/gha-setup-vsdevenv@main | |
- name: Set up swift (Windows) | |
if: ${{ runner.os == 'Windows' }} | |
uses: compnerd/[email protected] | |
with: | |
branch: swift-${{ env.swift-version }}-release | |
tag: ${{ env.swift-version }}-RELEASE | |
- name: Verify swift version | |
run: swift --version && swift --version | grep -q ${{ env.swift-version }} | |
shell: bash | |
- name: Set up latest CMake and Ninja | |
uses: lukka/get-cmake@latest | |
with: | |
cmakeVersion: latestrc | |
- name: Install LLVM | |
# 7z doesn't support decompressing from a stream or we'd do this all as one statement. Maybe | |
# we should find a way to use zstd on windows. | |
run: >- | |
curl --no-progress-meter -L -O | |
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" | |
${{ env.llvm_url_prefix }}/${{ env.llvm_package_basename }}${{ matrix.llvm_package_suffix }} | |
${{ matrix.unpackage_command }} ${{ env.llvm_package_basename }}${{ matrix.llvm_package_suffix }} | |
- name: Configure (CMake) | |
# We explicitly point to swiftc in the PATH because otherwise CMake picks up the one in XCode. | |
run: >- | |
cmake -G '${{ matrix.cmake_generator }}' -S . -B .ninja-build | |
${{ matrix.cmake_generator != 'Xcode' && format('-DCMAKE_BUILD_TYPE={0}', matrix.cmake_build_type) || '' }} | |
-DBUILD_TESTING=YES | |
-DLLVM_DIR=${{ github.workspace }}/${{ env.llvm_package_basename }}/lib/cmake/llvm | |
${{ matrix.os == 'macos-13' && '-D CMAKE_Swift_COMPILER=swiftc' || '' }} | |
working-directory: hylo | |
- name: Build (CMake) | |
run: cmake --build hylo/.ninja-build ${{ matrix.cmake_generator == 'Xcode' && format('--config {0}', matrix.cmake_build_type) || '' }} | |
- name: Test (CMake) | |
run: ctest --parallel --test-dir hylo/.ninja-build ${{ matrix.cmake_generator == 'Xcode' && format('-C {0}', matrix.cmake_build_type) || '' }} | |
- if: ${{ matrix.use_spm }} | |
name: Create LLVM pkgconfig file and make it findable | |
run: >- | |
set -ex -o pipefail | |
mkdir pkg-config | |
PATH="${{ github.workspace }}/${{ env.llvm_package_basename }}/bin:$PATH" | |
hylo/Tools/make-pkgconfig.sh pkg-config/llvm.pc | |
echo 'PKG_CONFIG_PATH=${{ github.workspace }}/pkg-config' >> "$GITHUB_ENV" | |
shell: bash | |
- if: ${{ matrix.use_spm }} | |
uses: actions/cache@v4 | |
name: SPM cache setup | |
with: | |
path: hylo/.build | |
key: ${{ runner.os }}-${{ matrix.spm_configuration }}-spm-${{ hashFiles('hylo/**/Package.resolved') }} | |
restore-keys: | | |
${{ runner.os }}-${{ matrix.spm_configuration }}-spm- | |
- if: ${{ matrix.on_windows_and_spm_works }} | |
name: Build support library | |
run: clang -c ./StandardLibrary/Sources/LibC.c -o HyloLibC.lib | |
working-directory: hylo | |
- if: ${{ matrix.on_windows_and_spm_works }} | |
name: Build the dependencies of build tools | |
run: | | |
echo 'SPM_BUILD_TOOL_SUPPORT_NO_REENTRANT_BUILD=1' >> $env:GITHUB_ENV | |
swift build ${{ env.spm-build-options }} --target BuildToolDependencies | |
# https://github.com/apple/swift/issues/72121 | |
if (-not $?) { | |
swift build ${{ env.spm-build-options }} --target BuildToolDependencies | |
} | |
working-directory: hylo | |
- if: ${{ matrix.use_spm }} | |
name: Build | |
run: | | |
swift build -c ${{ matrix.spm_configuration }} ${{ env.spm-build-options }} --build-tests | |
${{ matrix.windows_only }} if (-not $?) { swift build ${{ env.spm-build-options }} --target BuildToolDependencies } | |
working-directory: hylo | |
- if: ${{ matrix.use_spm }} | |
name: Test | |
run: | | |
swift test --skip-build -c ${{ matrix.spm_configuration }} ${{ env.spm-build-options }} ${{ env.spm-test-options }} | |
${{ matrix.windows_only }} if (-not $?) { swift test -c ${{ matrix.spm_configuration }} ${{ env.spm-test-options }} } | |
working-directory: hylo | |
- name: Output compiler version | |
run: cmake --build hylo/.ninja-build --target output_compiler_version -- --quiet& |