support installing multiple versions

This commit is contained in:
Egor Tensin 2021-07-03 01:48:08 +03:00
parent 3d49180b0b
commit 77e3dc62d5
3 changed files with 146 additions and 9 deletions

View file

@ -1,9 +1,15 @@
name: Check cc/c++ name: Check cc/c++
description: Check cc/c++ description: Check cc/c++
inputs:
version:
description: Specific version to check
required: false
runs: runs:
using: composite using: composite
steps: steps:
- run: | - run: |
$version = '${{ inputs.version }}'
function Check-Exe { function Check-Exe {
param( param(
[Parameter(Mandatory=$true)] [Parameter(Mandatory=$true)]
@ -15,6 +21,10 @@ runs:
echo $output echo $output
$($output | Select-String -Pattern "clang version" -SimpleMatch -Quiet) -or $(throw "Unexpected `$Exe --version` 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 Check-Exe cc

View file

@ -34,6 +34,36 @@ jobs:
- name: Check cc/c++ - name: Check cc/c++
uses: ./.github/actions/check-cc 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: cygwin:
strategy: strategy:
matrix: matrix:

View file

@ -2,6 +2,10 @@ name: Install Clang
description: Install Clang & LLVM description: Install Clang & LLVM
inputs: inputs:
version:
description: Version to install
required: false
default: latest
platform: platform:
description: Target platform description: Target platform
required: false required: false
@ -19,16 +23,27 @@ inputs:
required: false required: false
default: 0 default: 0
outputs:
clang:
description: clang binary name
value: '${{ steps.install.outputs.clang }}'
clangxx:
description: clang++ binary name
value: '${{ steps.install.outputs.clangxx }}'
runs: runs:
using: composite using: composite
steps: steps:
- run: | - id: install
run: |
New-Variable os -Value '${{ runner.os }}' -Option Constant New-Variable os -Value '${{ runner.os }}' -Option Constant
New-Variable linux_host -Value ($os -eq 'Linux') -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 cygwin_host -Value ('${{ inputs.cygwin }}' -eq '1') -Option Constant
New-Variable windows_host -Value ($os -eq 'Windows' -and !$cygwin_host) -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 New-Variable x64 -Value ('${{ inputs.platform }}' -eq 'x64') -Option Constant
function Locate-Choco { function Locate-Choco {
@ -60,13 +75,92 @@ runs:
} }
} }
if ($linux_host) { function Get-DistroVersion {
if ($x64) { if (!(Get-Command lsb_release -ErrorAction SilentlyContinue)) {
$pkgs = 'clang','g++','llvm' throw "Couldn't find lsb_release; LLVM only provides repositories for Debian/Ubuntu"
} else {
$pkgs = 'clang','g++-multilib','llvm'
} }
Install-Package $pkgs $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) {
$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"
}
if (!$x64) {
$pkg_gxx = 'g++-multilib'
}
Install-Package $pkg_clang $pkg_llvm $pkg_gxx
} elseif ($cygwin_host) { } elseif ($cygwin_host) {
if (!$x64) { if (!$x64) {
echo @' echo @'
@ -90,6 +184,9 @@ runs:
} else { } else {
throw "Sorry, installing Clang is unsupported on $os" throw "Sorry, installing Clang is unsupported on $os"
} }
echo "::set-output name=clang::$clang"
echo "::set-output name=clangxx::$clangxx"
shell: pwsh shell: pwsh
- run: | - run: |
@ -124,8 +221,8 @@ runs:
} }
if ($cc) { if ($cc) {
Link-Exe clang cc Link-Exe '${{ steps.install.outputs.clang }}' cc
Link-Exe clang++ c++ Link-Exe '${{ steps.install.outputs.clangxx }}' c++
} }
shell: pwsh shell: pwsh