Skip to content

Add a Compiler option to profile the compilation time #3361

Add a Compiler option to profile the compilation time

Add a Compiler option to profile the compilation time #3361

Workflow file for this run

---
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&