aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2021-07-03 01:48:08 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2021-07-03 02:06:37 +0300
commit77e3dc62d556a680a94e28e0b6ed25627afd21ab (patch)
tree717e735136380e4f05a6f8a57ceea6d2f13fa2b5
parentworkflows/test: factor out steps & refactoring (diff)
downloadsetup-clang-77e3dc62d556a680a94e28e0b6ed25627afd21ab.tar.gz
setup-clang-77e3dc62d556a680a94e28e0b6ed25627afd21ab.zip
support installing multiple versions
-rw-r--r--.github/actions/check-cc/action.yml10
-rw-r--r--.github/workflows/test.yml30
-rw-r--r--action.yml113
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