initial commit
This commit is contained in:
commit
8d8d2c1c05
5 changed files with 231 additions and 0 deletions
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
* text=auto
|
78
.github/workflows/test.yml
vendored
Normal file
78
.github/workflows/test.yml
vendored
Normal file
|
@ -0,0 +1,78 @@
|
|||
name: Test
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
schedule:
|
||||
# Weekly, at 5:45 AM on Friday (somewhat randomly chosen).
|
||||
- cron: '45 5 * * 5'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [x86, x64]
|
||||
cygwin: [0, 1]
|
||||
os: [ubuntu-18.04, windows-2019, windows-2016]
|
||||
|
||||
include:
|
||||
# Prettier run names.
|
||||
- {os: ubuntu-18.04, name: Ubuntu}
|
||||
- {os: windows-2019, name: Windows Server 2019}
|
||||
- {os: windows-2016, name: Windows Server 2016}
|
||||
- {cygwin: 1, name: Cygwin}
|
||||
exclude:
|
||||
# No Cygwin on Ubuntu.
|
||||
- {os: ubuntu-18.04, cygwin: 1}
|
||||
# Cygwin is the same on Windows Server 2016 & 2019.
|
||||
- {os: windows-2016, cygwin: 1}
|
||||
|
||||
runs-on: '${{ matrix.os }}'
|
||||
|
||||
name: '${{ matrix.name }} / ${{ matrix.platform }}'
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: pwsh
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Clean up PATH
|
||||
uses: egor-tensin/cleanup-path@v1
|
||||
if: runner.os == 'Windows'
|
||||
|
||||
- name: Install Cygwin
|
||||
uses: egor-tensin/setup-cygwin@master
|
||||
with:
|
||||
platform: '${{ matrix.platform }}'
|
||||
if: matrix.cygwin
|
||||
|
||||
- name: Set up Clang
|
||||
id: setup
|
||||
uses: ./
|
||||
with:
|
||||
platform: '${{ matrix.platform }}'
|
||||
cygwin: '${{ matrix.cygwin }}'
|
||||
|
||||
- name: Build foo.exe
|
||||
run: |
|
||||
$flags = @()
|
||||
if ('${{ matrix.platform }}' -eq 'x86') {
|
||||
$flags += '-m32'
|
||||
}
|
||||
$flags += @(
|
||||
'-x', 'c++',
|
||||
'-std=c++14',
|
||||
'-o', 'foo',
|
||||
'foo.cpp',
|
||||
'-lstdc++'
|
||||
)
|
||||
if ('${{ runner.os }}' -eq 'Linux') {
|
||||
$flags += '-lpthread'
|
||||
}
|
||||
& '${{ steps.setup.outputs.clangxx }}' $flags
|
||||
& (Join-Path . foo)
|
21
LICENSE.txt
Normal file
21
LICENSE.txt
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2020 Egor Tensin <Egor.Tensin@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
92
action.yml
Normal file
92
action.yml
Normal file
|
@ -0,0 +1,92 @@
|
|||
name: Install Clang
|
||||
description: Install Clang & LLVM
|
||||
|
||||
inputs:
|
||||
platform:
|
||||
description: Target platform
|
||||
required: false
|
||||
default: x64
|
||||
cygwin:
|
||||
description: Install inside Cygwin
|
||||
required: false
|
||||
default: 0
|
||||
|
||||
outputs:
|
||||
clang:
|
||||
description: clang executable name or path
|
||||
value: '${{ steps.setup.outputs.clang }}'
|
||||
clangxx:
|
||||
description: clang++ executable name or path
|
||||
value: '${{ steps.setup.outputs.clangxx }}'
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- id: setup
|
||||
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) -Option Constant
|
||||
|
||||
New-Variable x64 -Value ('${{ inputs.platform }}' -eq 'x64') -Option Constant
|
||||
|
||||
function Locate-Choco {
|
||||
$path = Get-Command 'choco' -ErrorAction SilentlyContinue
|
||||
if ($path) {
|
||||
$path.Path
|
||||
} else {
|
||||
Join-Path ${env:ProgramData} 'chocolatey' 'bin' 'choco'
|
||||
}
|
||||
}
|
||||
|
||||
if ($linux_host) {
|
||||
sudo apt update
|
||||
if ($x64) {
|
||||
sudo apt install -y clang g++
|
||||
} else {
|
||||
sudo apt install -y clang g++-multilib
|
||||
}
|
||||
|
||||
echo "::set-output name=clang::clang"
|
||||
echo "::set-output name=clangxx::clang++"
|
||||
} elseif ($cygwin_host) {
|
||||
if (!$x64) {
|
||||
echo @'
|
||||
::warning ::
|
||||
32-bit-targeting Clang is unavailable on 64-bit Cygwin.
|
||||
Please use 32-bit Cygwin instead.
|
||||
If you _are_ using 32-bit Cygwin, please ignore this message.
|
||||
'@
|
||||
}
|
||||
$choco = Locate-Choco
|
||||
|
||||
# IDK why, but without libiconv-devel, even a "Hello, world!"
|
||||
# C++ app cannot be compiled as of December 2020.
|
||||
# Also, libstdc++ is required, and for simplicity's sake, gcc-g++
|
||||
# is installed.
|
||||
& $choco install -y --no-progress --source=cygwin clang libiconv-devel gcc-g++
|
||||
|
||||
# clang/clang++ are symlinks on Cygwin, pointing to clang-VERSION.exe.
|
||||
$clang = cygpath.exe -wa (readlink.exe --canonicalize-existing /usr/bin/clang)
|
||||
$clangxx = cygpath.exe -wa (readlink.exe --canonicalize-existing /usr/bin/clang++)
|
||||
|
||||
echo "::set-output name=clang::$clang"
|
||||
echo "::set-output name=clangxx::$clangxx"
|
||||
} elseif ($windows_host) {
|
||||
$choco = Locate-Choco
|
||||
|
||||
& $choco install -y --no-progress llvm
|
||||
echo (Join-Path $env:ProgramFiles LLVM bin) >> $env:GITHUB_PATH
|
||||
|
||||
echo "::set-output name=clang::clang"
|
||||
echo "::set-output name=clangxx::clang++"
|
||||
} else {
|
||||
throw "Sorry, installing Clang is unsupported on $os"
|
||||
}
|
||||
shell: pwsh
|
||||
|
||||
branding:
|
||||
icon: star
|
||||
color: green
|
39
foo.cpp
Normal file
39
foo.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <exception>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
|
||||
namespace {
|
||||
|
||||
struct Counter {
|
||||
std::mutex mtx;
|
||||
std::size_t impl = 0;
|
||||
};
|
||||
|
||||
void do_something(Counter& counter) {
|
||||
std::lock_guard<std::mutex> lck{counter.mtx};
|
||||
++counter.impl;
|
||||
std::cout << "Doing something #" << counter.impl << '\n';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
try {
|
||||
Counter counter;
|
||||
std::array<std::thread, 3> workers;
|
||||
for (auto& worker : workers) {
|
||||
worker = std::thread{&do_something, std::ref(counter)};
|
||||
}
|
||||
for (auto& worker : workers) {
|
||||
worker.join();
|
||||
}
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << e.what() << '\n';
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue