From 77e3dc62d556a680a94e28e0b6ed25627afd21ab Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Sat, 3 Jul 2021 01:48:08 +0300 Subject: support installing multiple versions --- .github/actions/check-cc/action.yml | 10 ++++ .github/workflows/test.yml | 30 ++++++++++ action.yml | 113 +++++++++++++++++++++++++++++++++--- 3 files changed, 145 insertions(+), 8 deletions(-) diff --git a/.github/actions/check-cc/action.yml b/.github/actions/check-cc/action.yml index b297f72..1e5b988 100644 --- a/.github/actions/check-cc/action.yml +++ b/.github/actions/check-cc/action.yml @@ -1,9 +1,15 @@ name: Check cc/c++ description: Check cc/c++ +inputs: + version: + description: Specific version to check + required: false runs: using: composite steps: - run: | + $version = '${{ inputs.version }}' + function Check-Exe { param( [Parameter(Mandatory=$true)] @@ -15,6 +21,10 @@ runs: echo $output $($output | Select-String -Pattern "clang version" -SimpleMatch -Quiet) -or $(throw "Unexpected `$Exe --version` output") + + if ($script:version) { + $($output | Select-String -Pattern "$script:version." -SimpleMatch -Quiet) -or $(throw "Unexpected `$Exe --version` output") + } } Check-Exe cc diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 77edef1..e9ef424 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,6 +34,36 @@ jobs: - name: Check cc/c++ uses: ./.github/actions/check-cc + versions: + strategy: + matrix: + os: [ubuntu-18.04, ubuntu-20.04] + version: ['5.0', '6.0', 7, 8, 9, 10, 11, 12] + exclude: + - {os: ubuntu-20.04, version: '5.0'} + - {os: ubuntu-20.04, version: '6.0'} + - {os: ubuntu-20.04, version: 7} + - {os: ubuntu-20.04, version: 8} + runs-on: '${{ matrix.os }}' + name: 'Version: ${{ matrix.os }} / ${{ matrix.version }}' + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set up Clang + uses: ./ + with: + version: '${{ matrix.version }}' + platform: '${{ matrix.platform }}' + cc: 1 + - name: Build foo.exe + uses: ./.github/actions/build-foo + - name: Run foo.exe + uses: ./.github/actions/run-foo + - name: Check cc/c++ + uses: ./.github/actions/check-cc + with: + version: '${{ matrix.version }}' + cygwin: strategy: matrix: diff --git a/action.yml b/action.yml index 9cbf940..f1b9a1b 100644 --- a/action.yml +++ b/action.yml @@ -2,6 +2,10 @@ name: Install Clang description: Install Clang & LLVM inputs: + version: + description: Version to install + required: false + default: latest platform: description: Target platform required: false @@ -19,16 +23,27 @@ inputs: required: false default: 0 +outputs: + clang: + description: clang binary name + value: '${{ steps.install.outputs.clang }}' + clangxx: + description: clang++ binary name + value: '${{ steps.install.outputs.clangxx }}' + runs: using: composite steps: - - run: | + - id: install + run: | New-Variable os -Value '${{ runner.os }}' -Option Constant New-Variable linux_host -Value ($os -eq 'Linux') -Option Constant New-Variable cygwin_host -Value ('${{ inputs.cygwin }}' -eq '1') -Option Constant New-Variable windows_host -Value ($os -eq 'Windows' -and !$cygwin_host) -Option Constant + New-Variable version -Value ('${{ inputs.version }}') -Option Constant + New-Variable latest -Value ($version -eq 'latest') -Option Constant New-Variable x64 -Value ('${{ inputs.platform }}' -eq 'x64') -Option Constant function Locate-Choco { @@ -60,13 +75,92 @@ runs: } } + function Get-DistroVersion { + if (!(Get-Command lsb_release -ErrorAction SilentlyContinue)) { + throw "Couldn't find lsb_release; LLVM only provides repositories for Debian/Ubuntu" + } + $distro = lsb_release -is + $version = lsb_release -sr + "$distro-$version" + } + + function Format-UpstreamVersion { + param( + [Parameter(Mandatory=$true)] + [string] $Version + ) + + switch -Exact ($Version) { + # Since version 7, they dropped the .0 suffix. The earliest + # version supported is 5.0 on Bionic; versions 5 and 6 are + # mapped to LLVM-friendly 5.0 and 6.0. + '5' { '5.0' } + '6' { '6.0' } + default { $Version } + } + } + + function Format-AptLine { + param( + [Parameter(Mandatory=$true)] + [string] $Version + ) + + $distro = Get-DistroVersion + + switch -Wildcard -CaseSensitive ($distro) { + 'Debian-9*' { "deb http://apt.llvm.org/stretch/ llvm-toolchain-stretch-$Version main" } + 'Debian-10*' { "deb http://apt.llvm.org/buster/ llvm-toolchain-buster-$Version main" } + 'Debian-11*' { "deb http://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-$Version main" } + 'Debian-unstable' { "deb http://apt.llvm.org/unstable/ llvm-toolchain-$Version main" } + 'Debian-testing' { "deb http://apt.llvm.org/unstable/ llvm-toolchain-$Version main" } + 'Ubuntu-16.04' { "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-$Version main" } + 'Ubuntu-18.04' { "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-$Version main" } + 'Ubuntu-18.10' { "deb http://apt.llvm.org/cosmic/ llvm-toolchain-cosmic-$Version main" } + 'Ubuntu-19.04' { "deb http://apt.llvm.org/disco/ llvm-toolchain-disco-$Version main" } + 'Ubuntu-19.10' { "deb http://apt.llvm.org/eoan/ llvm-toolchain-eoan-$Version main" } + 'Ubuntu-20.04' { "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-$Version main" } + 'Ubuntu-20.10' { "deb http://apt.llvm.org/groovy/ llvm-toolchain-groovy-$Version main" } + 'Ubuntu-21.04' { "deb http://apt.llvm.org/hirsute/ llvm-toolchain-hirsute-$Version main" } + + default { throw "Unsupported distribution: $distro" } + } + } + + function Add-UpstreamRepo { + param( + [Parameter(Mandatory=$true)] + [string] $Version + ) + + wget -qO - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + $apt_line = Format-AptLine $Version + sudo add-apt-repository --yes --update $apt_line + } + + $clang = 'clang' + $clangxx = 'clang++' + if ($linux_host) { - if ($x64) { - $pkgs = 'clang','g++','llvm' - } else { - $pkgs = 'clang','g++-multilib','llvm' + $pkg_clang = 'clang' + $pkg_llvm = 'llvm' + $pkg_gxx = 'g++' + + if (!$latest) { + $pkg_version = Format-UpstreamVersion $version + Add-UpstreamRepo $pkg_version + + $pkg_clang = "$pkg_clang-$pkg_version" + $pkg_llvm = "$pkg_llvm-$pkg_version" + + $clang = "$clang-$pkg_version" + $clangxx = "$clangxx-$pkg_version" } - Install-Package $pkgs + if (!$x64) { + $pkg_gxx = 'g++-multilib' + } + + Install-Package $pkg_clang $pkg_llvm $pkg_gxx } elseif ($cygwin_host) { if (!$x64) { echo @' @@ -90,6 +184,9 @@ runs: } else { throw "Sorry, installing Clang is unsupported on $os" } + + echo "::set-output name=clang::$clang" + echo "::set-output name=clangxx::$clangxx" shell: pwsh - run: | @@ -124,8 +221,8 @@ runs: } if ($cc) { - Link-Exe clang cc - Link-Exe clang++ c++ + Link-Exe '${{ steps.install.outputs.clang }}' cc + Link-Exe '${{ steps.install.outputs.clangxx }}' c++ } shell: pwsh -- cgit v1.2.3