Format to Rust standards and fix ci #4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Tests | |
on: | |
push: | |
branches: | |
- main | |
- master | |
pull_request: | |
branches: | |
- main | |
- master | |
# cargo error handling is wrapped by ci-cargo, for simplicity and better logging. | |
# To use ci-cargo in a step, source ci-cargo.ps1 (using `. ./ci-cargo.ps`, note the extra dot in front). | |
# ci-cargo does not handle correctly -- separator, so wrap it in quotes ('--') | |
# A special named parameter called `ActionName` can be used to set the name of current ci-cargo action, | |
# used as `ci-cargo .... -ActionName "Called for documentation purposes"`. | |
jobs: | |
# All tests | |
tests: | |
runs-on: ${{ matrix.config.os }} | |
name: ${{ matrix.config.os }} (R-${{ matrix.config.r }} rust-${{ matrix.config.rust-version }}) | |
strategy: | |
fail-fast: false | |
matrix: | |
config: | |
# On Windows, | |
# | |
# * for R >= 4.2, both the MSVC toolchain and the GNU toolchain should | |
# work. Since our main support is on MSVC, we mainly test MSVC here. | |
# Also, at least one GNU case should be included so that we can | |
# detect when something gets broken. | |
# * for R < 4.2, the MSVC toolchain must be used to support | |
# cross-compilation for the 32-bit. | |
- {os: windows-latest, r: 'release', rust-version: 'stable-msvc', rtools-version: '43'} | |
- {os: windows-latest, r: 'devel', rust-version: 'stable-msvc'} | |
- {os: windows-latest, r: 'release', rust-version: 'stable-gnu', rtools-version: '43'} | |
# - {os: windows-latest, r: '4.1', rust-version: 'stable-msvc'} # TODO: Remove this runner when we drop the support for R < 4.2 | |
- {os: macOS-latest, r: 'release', rust-version: 'stable'} | |
# - {os: macOS-latest, r: 'release', rust-version: 'nightly'} | |
- {os: macOS-latest, r: 'devel', rust-version: 'stable'} | |
# - {os: macOS-latest, r: 'oldrel', rust-version: 'stable'} | |
- {os: ubuntu-latest, r: 'release', rust-version: 'stable', check_fmt: true} | |
# - {os: ubuntu-latest, r: 'release', rust-version: 'nightly'} | |
# R-devel requires LD_LIBRARY_PATH | |
- {os: ubuntu-latest, r: 'devel', rust-version: 'stable'} | |
# - {os: ubuntu-latest, r: 'oldrel', rust-version: 'stable'} | |
env: | |
R_REMOTES_NO_ERRORS_FROM_WARNINGS: true | |
# This environment variable enables support for pseudo multi-target cargo builds. | |
# Current stable Rust does not support multi-targeting, | |
# see https://github.com/rust-lang/cargo/issues/8176 | |
# The variable is treated as a comma-separated list of valid Rust targets. | |
# 'default' value emits no '--target' flag. | |
# E.g.: BUILD_TARGETS=i686-pc-windows-gnu,x86_64-pc-windows-gnu builds two times, | |
# each time providing '--target=*-pc-windows-gnu' flag to cargo. | |
BUILD_TARGETS: default | |
# PowerShell core is available on all platforms and can be used to unify scripts | |
defaults: | |
run: | |
shell: pwsh | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Set up Rust | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ matrix.config.rust-version }} | |
components: rustfmt, clippy | |
- name: Set up R | |
uses: r-lib/actions/setup-r@v2 | |
with: | |
r-version: ${{ matrix.config.r }} | |
rtools-version: ${{ matrix.config.rtools-version }} | |
# TODO: enable RSPM when all the packages are available | |
use-public-rspm: false | |
- name: Set up Pandoc | |
uses: r-lib/actions/setup-pandoc@v2 | |
- name: Configure Windows (R >= 4.2) | |
if: startsWith(runner.os, 'Windows') && matrix.config.r != '4.1' | |
run: | | |
if ("${{ matrix.config.rtools-version }}" -eq "42") { | |
$rtools_home = "C:\rtools42" # for R 4.2 | |
} else { | |
$rtools_home = "C:\rtools43" # for R >= 4.3 | |
} | |
# c.f. https://github.com/wch/r-source/blob/f1501504df8df1668a57d3a1b6f80167f24441d3/src/library/profile/Rprofile.windows#L70-L71 | |
echo "${rtools_home}\x86_64-w64-mingw32.static.posix\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append ; | |
echo "${rtools_home}\usr\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append ; | |
echo "$(Rscript.exe -e 'cat(normalizePath(R.home()))')\bin\x64" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append ; | |
# Add target | |
rustup target add x86_64-pc-windows-gnu | |
echo "BUILD_TARGETS=x86_64-pc-windows-gnu" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append ; | |
# The following lines add two tweaks: | |
# | |
# 1. Change the linker name to "x86_64-w64-mingw32.static.posix-gcc.exe". | |
# 2. Add empty libgcc_s.a and libgcc_eh.a, and add them to the compiler's | |
# library search paths via `LIBRARY_PATH` envvar. | |
# | |
# The first tweak is needed because Rtools42 doesn't contain | |
# "x86_64-w64-mingw32-gcc," which `rustc` uses as the default linker | |
# for the `x86_64-pc-windows-gnu` target. | |
# | |
# If we use the Rtools' toolchain, the second tweak is also required. | |
# `rustc` adds `-lgcc_eh` and `-lgcc_s` flags to the compiler, but | |
# Rtools' GCC doesn't have `libgcc_eh` or `libgcc_s` due to the | |
# compilation settings. So, in order to please the compiler, we need | |
# to add empty `libgcc_eh` or `libgcc_s` to the library search paths. | |
# | |
# For more details, please refer to https://github.com/r-windows/rtools-packages/blob/2407b23f1e0925bbb20a4162c963600105236318/mingw-w64-gcc/PKGBUILD#L313-L316 | |
New-Item -Path libgcc_mock -Type Directory | |
New-Item -Path libgcc_mock\libgcc_eh.a -Type File | |
New-Item -Path libgcc_mock\libgcc_s.a -Type File | |
New-Item -Path .cargo -ItemType Directory -Force | |
$pwd_slash = echo "${PWD}" | % {$_ -replace '\\','/'} | |
@" | |
[target.x86_64-pc-windows-gnu] | |
linker = "x86_64-w64-mingw32.static.posix-gcc.exe" | |
[env] | |
LIBRARY_PATH = "${pwd_slash}/libgcc_mock" | |
"@ | Out-File -FilePath .cargo/config.toml -Encoding utf8 -Append ; | |
env: | |
RUST_TOOLCHAIN: ${{ matrix.config.rust-version }} | |
# TODO: Remove this runner when we drop the support for R < 4.2 | |
- name: Configure Windows (R < 4.2) | |
if: startsWith(runner.os, 'Windows') && matrix.config.r == '4.1' | |
# 1. Add rust target | |
# 2. Add target name to the $targets variable | |
# 3. Add mingw32/mingw64 bin folders to PATH | |
# 4. Add R x64/i386 folders to PATH | |
run: | | |
$targets=@() | |
if ($env:RUST_TOOLCHAIN -notlike "*x86_64*") { | |
rustup target add i686-pc-windows-gnu ; | |
$targets+="i686-pc-windows-gnu" | |
echo "${env:RTOOLS40_HOME}\mingw32\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append ; | |
echo "$(Rscript.exe -e 'cat(normalizePath(R.home()))')\bin\i386" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append ; | |
} | |
if ($env:RUST_TOOLCHAIN -notlike "*i686*") { | |
rustup target add x86_64-pc-windows-gnu ; | |
$targets+="x86_64-pc-windows-gnu" | |
echo "${env:RTOOLS40_HOME}\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append ; | |
echo "$(Rscript.exe -e 'cat(normalizePath(R.home()))')\bin\x64" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append ; | |
} | |
echo "BUILD_TARGETS=$($targets -join ',')" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append ; | |
env: | |
RUST_TOOLCHAIN: ${{ matrix.config.rust-version }} | |
# This is required for ubuntu r-devel | |
# 'Del alias:R' removes 'R' alias which prevents running R | |
- name: Configure Linux | |
if: startsWith(runner.os, 'linux') | |
run: | | |
Del alias:R | |
echo "LD_LIBRARY_PATH=$(R -s -e 'cat(normalizePath(R.home()))')/lib" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
# Check code formatting. As this doesn't depend on the platform, do this only on one platform. | |
- name: Check code formatting | |
if: matrix.config.check_fmt | |
run: cargo fmt -- --check | |
# For each target in the BUILD_TARGETS comma-separated list, run cargo build with appropriate target | |
# Required by Windows builds, does not affect other platforms | |
- name: Build | |
run: | | |
. ./ci-cargo.ps1 | |
foreach($target in ($env:BUILD_TARGETS).Split(',')) { | |
ci-cargo build $(if($target -ne 'default') {"--target=$target"} ) -ActionName "Building for $target target" | |
} | |
# For each target in the BUILD_TARGETS comma-separated list, run cargo test with appropriate target | |
# Required by Windows builds, does not affect other platforms | |
# ! ci-cargo requires '--' to be wrapped in quotes (passed as an explicit string) | |
- name: Run tests | |
run: | | |
. ./ci-cargo.ps1 | |
foreach($target in ($env:BUILD_TARGETS).Split(',')) { | |
# Note: no feature is specified, which means such features like graphics, serde, ndarray, and num-complex are not tested here. | |
ci-cargo test $(if($target -ne 'default') {"--target=$target"} ) '--' --nocapture -ActionName "Testing for $target target" | |
} | |