Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c9b9d6490 | ||
|
|
778bb6075f | ||
|
|
1bbdab0f68 | ||
|
|
c40662f61a | ||
|
|
7d5643fe34 | ||
|
|
3be49880a3 | ||
|
|
070eee0271 | ||
|
|
d4b2d5201c | ||
|
|
e1ea800ed7 | ||
|
|
fc51bd6dfd | ||
|
|
d02a87e838 | ||
|
|
3de92613ad | ||
|
|
c507aeb1b5 | ||
|
|
9fb7236944 | ||
|
|
883c7a0854 | ||
|
|
ef5051e603 | ||
|
|
e89db86c83 | ||
|
|
d3cc976c26 | ||
|
|
42fe96a4c1 |
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
name: Check that code is lint clean using precious
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config --global user.email "jdoe@example.com"
|
||||
|
||||
160
.github/workflows/test.yml
vendored
160
.github/workflows/test.yml
vendored
@@ -14,167 +14,152 @@ jobs:
|
||||
- platform_name: FreeBSD-x86_64
|
||||
os: ubuntu-20.04
|
||||
target: x86_64-unknown-freebsd
|
||||
expect_cross: true
|
||||
expect_file: "x86-64.+FreeBSD"
|
||||
expect_stripped: false
|
||||
expect_file_re: "x86-64.+FreeBSD"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: false
|
||||
|
||||
- platform_name: Linux-x86_64
|
||||
os: ubuntu-20.04
|
||||
target: x86_64-unknown-linux-musl
|
||||
expect_cross: false
|
||||
expect_file: "ELF.+x86-64"
|
||||
expect_stripped: true
|
||||
expect_file_re: "ELF.+x86-64"
|
||||
expect_cross: "--no-expect-cross"
|
||||
expect_stripped: "--expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-aarch64
|
||||
os: ubuntu-20.04
|
||||
target: aarch64-unknown-linux-musl
|
||||
expect_cross: true
|
||||
expect_file: "aarch64"
|
||||
expect_stripped: false
|
||||
expect_file_re: "aarch64"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-aarch64-with-cross-v0.2.3
|
||||
os: ubuntu-20.04
|
||||
target: aarch64-unknown-linux-musl
|
||||
cross-version: "v0.2.3"
|
||||
expect_file_re: "aarch64"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_cross_version: "0.2.3"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-arm
|
||||
os: ubuntu-20.04
|
||||
target: arm-unknown-linux-musleabi
|
||||
expect_cross: true
|
||||
expect_file: "32.+ARM"
|
||||
expect_stripped: false
|
||||
expect_file_re: "32.+ARM"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-i586
|
||||
os: ubuntu-20.04
|
||||
target: i586-unknown-linux-musl
|
||||
expect_cross: false
|
||||
expect_file: "ELF.+80386"
|
||||
expect_stripped: true
|
||||
expect_file_re: "ELF.+80386"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-mips
|
||||
- platform_name: Linux-i686
|
||||
os: ubuntu-20.04
|
||||
target: mips-unknown-linux-musl
|
||||
expect_cross: true
|
||||
expect_file: "MIPS32.+mips-"
|
||||
expect_stripped: false
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-mipsel
|
||||
os: ubuntu-20.04
|
||||
target: mipsel-unknown-linux-musl
|
||||
expect_cross: true
|
||||
expect_file: "MIPS32.+mipsel-"
|
||||
expect_stripped: false
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-mips64
|
||||
os: ubuntu-20.04
|
||||
target: mips64-unknown-linux-muslabi64
|
||||
expect_cross: true
|
||||
expect_file: "MIPS64"
|
||||
expect_stripped: false
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-mips64el
|
||||
os: ubuntu-20.04
|
||||
target: mips64el-unknown-linux-muslabi64
|
||||
expect_cross: true
|
||||
expect_file: "MIPS64"
|
||||
expect_stripped: false
|
||||
target: i686-unknown-linux-musl
|
||||
expect_file_re: "ELF.+80386"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-powerpc
|
||||
os: ubuntu-20.04
|
||||
target: powerpc-unknown-linux-gnu
|
||||
expect_cross: true
|
||||
expect_file: "32.+PowerPC"
|
||||
expect_stripped: false
|
||||
expect_file_re: "32.+PowerPC"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-powerpc64
|
||||
os: ubuntu-20.04
|
||||
target: powerpc64-unknown-linux-gnu
|
||||
expect_cross: true
|
||||
expect_file: "64.+PowerPC"
|
||||
expect_stripped: false
|
||||
expect_file_re: "64.+PowerPC"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-powerpc64le
|
||||
os: ubuntu-20.04
|
||||
target: powerpc64le-unknown-linux-gnu
|
||||
expect_cross: true
|
||||
expect_file: "64.+PowerPC"
|
||||
expect_stripped: false
|
||||
expect_file_re: "64.+PowerPC"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-riscv64
|
||||
os: ubuntu-20.04
|
||||
target: riscv64gc-unknown-linux-gnu
|
||||
expect_cross: true
|
||||
expect_file: "64.+RISC-V"
|
||||
expect_stripped: false
|
||||
expect_file_re: "64.+RISC-V"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Linux-s390x
|
||||
os: ubuntu-20.04
|
||||
target: s390x-unknown-linux-gnu
|
||||
expect_cross: true
|
||||
expect_file: "64.+S/390"
|
||||
expect_stripped: false
|
||||
expect_file_re: "64.+S/390"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: NetBSD-x86_64
|
||||
os: ubuntu-20.04
|
||||
target: x86_64-unknown-netbsd
|
||||
expect_cross: true
|
||||
expect_file: "x86-64.+NetBSD"
|
||||
expect_stripped: false
|
||||
expect_file_re: "x86-64.+NetBSD"
|
||||
expect_cross: "--expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: false
|
||||
|
||||
- platform_name: Windows-aarch64
|
||||
os: windows-latest
|
||||
target: aarch64-pc-windows-msvc
|
||||
expect_cross: false
|
||||
expect_file: "Aarch64.+Windows"
|
||||
expect_stripped: false
|
||||
expect_file_re: "Aarch64.+Windows"
|
||||
expect_cross: "--no-expect-cross"
|
||||
expect_stripped: "--no-expect-stripped"
|
||||
can_test: false
|
||||
|
||||
- platform_name: Windows-i686
|
||||
os: windows-latest
|
||||
target: i686-pc-windows-msvc
|
||||
expect_cross: false
|
||||
expect_file: "80386.+Windows"
|
||||
expect_stripped: true
|
||||
expect_file_re: "80386.+Windows"
|
||||
expect_cross: "--no-expect-cross"
|
||||
expect_stripped: "--expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: Windows-x86_64
|
||||
os: windows-latest
|
||||
target: x86_64-pc-windows-msvc
|
||||
expect_cross: false
|
||||
expect_file: "x86-64.+Windows"
|
||||
expect_stripped: true
|
||||
expect_file_re: "x86-64.+Windows"
|
||||
expect_stripped: "--expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: macOS-x86_64
|
||||
os: macOS-latest
|
||||
target: x86_64-apple-darwin
|
||||
expect_cross: false
|
||||
expect_file: "Mach-O.+x86_64"
|
||||
expect_stripped: true
|
||||
expect_file_re: "Mach-O.+x86_64"
|
||||
expect_cross: "--no-expect-cross"
|
||||
expect_stripped: "--expect-stripped"
|
||||
can_test: true
|
||||
|
||||
- platform_name: macOS-aarch64
|
||||
os: macOS-latest
|
||||
target: aarch64-apple-darwin
|
||||
expect_cross: false
|
||||
expect_file: "Mach-O.+arm64"
|
||||
expect_stripped: true
|
||||
expect_file_re: "Mach-O.+arm64"
|
||||
expect_cross: "--no-expect-cross"
|
||||
expect_stripped: "--expect-stripped"
|
||||
can_test: false
|
||||
|
||||
runs-on: ${{ matrix.platform.os }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- name: Copy test project to root
|
||||
shell: bash
|
||||
run: |
|
||||
@@ -184,6 +169,7 @@ jobs:
|
||||
uses: ./
|
||||
with:
|
||||
command: both
|
||||
cross-version: ${{ matrix.platform.cross-version }}
|
||||
target: ${{ matrix.platform.target }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
if: ${{ matrix.platform.can_test }}
|
||||
@@ -191,6 +177,7 @@ jobs:
|
||||
uses: ./
|
||||
with:
|
||||
command: test
|
||||
cross-version: ${{ matrix.platform.cross-version }}
|
||||
target: ${{ matrix.platform.target }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
if: ${{ matrix.platform.can_test }}
|
||||
@@ -198,10 +185,25 @@ jobs:
|
||||
uses: ./
|
||||
with:
|
||||
command: build
|
||||
cross-version: ${{ matrix.platform.cross-version }}
|
||||
target: ${{ matrix.platform.target }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
strip: true
|
||||
- name: Run build command for subdir
|
||||
uses: ./
|
||||
with:
|
||||
command: build
|
||||
cross-version: ${{ matrix.platform.cross-version }}
|
||||
working-directory: subcrate
|
||||
target: ${{ matrix.platform.target }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
strip: true
|
||||
- name: Check binary and cross on ${{ matrix.platform.platform_name }}
|
||||
shell: bash
|
||||
run: |
|
||||
tests/check-binary.sh "${{ matrix.platform.target }}" "${{ matrix.platform.expect_cross }}" "${{ matrix.platform.expect_file }}" "${{ matrix.platform.expect_stripped }}"
|
||||
tests/check-binary.pl \
|
||||
--target "${{ matrix.platform.target }}" \
|
||||
--expect-file-re "${{ matrix.platform.expect_file_re }}" \
|
||||
--expect-cross-version "${{ matrix.platform.expect_cross_version }}" \
|
||||
${{ matrix.platform.expect_cross }} \
|
||||
${{ matrix.platform.expect_stripped }}
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -3,4 +3,4 @@
|
||||
/package.json
|
||||
.\#*
|
||||
\#*\#
|
||||
test-project/target/**
|
||||
test-project/**/target/**
|
||||
|
||||
25
Changes.md
25
Changes.md
@@ -1,3 +1,28 @@
|
||||
## 0.0.12 - 2024-02-25
|
||||
|
||||
- Bumped the version of `actions/cache` used in this action to v4. The v3 version uses Node 16,
|
||||
which causes warnings when run.
|
||||
|
||||
## 0.0.11 - 2023-12-17
|
||||
|
||||
- Use `cross` when compiling for 32-bit Linux targets. While in theory this should work without
|
||||
`cross`, compiling `openssl` with the `vendored` feature fails when we run
|
||||
`cargo build --target i686-unknown-linux-musl`.
|
||||
|
||||
## 0.0.10 - 2023-12-10
|
||||
|
||||
- Fixed handling of crates with multiple binaries. Attempting to strip binaries for such a crate
|
||||
caused the build to fail. Reported by Tomaž Hribernik. GH #8
|
||||
- Added a new `cross-version` parameter. This can be specified to make this action use a specific
|
||||
version of `cross`. If this is not specified, the latest version will be used.
|
||||
|
||||
## 0.0.9 - 2023-09-10
|
||||
|
||||
- Added a `working-directory` parameter. By default this is the current directory (`.`) but you can
|
||||
set it to something else to compile a single crate or workspace in a subdirectory of the repo.
|
||||
This allows you to use this action with monorepos with multiple crates. Based on GH #7 by
|
||||
@aaronvg.
|
||||
|
||||
## 0.0.8 - 2023-07-22
|
||||
|
||||
- For builds that need the `cross` binary, this binary is now cached. A cache hit saves about 20
|
||||
|
||||
24
README.md
24
README.md
@@ -55,18 +55,20 @@ jobs:
|
||||
|
||||
This action takes the following parameters:
|
||||
|
||||
| Key | Type | Required? | Description |
|
||||
| -------------- | ---------------------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `command` | string (one of `build`, `test`, or `both`) | no | The command(s) to run. The default is `build`. Running the `test` command will fails with \*BSD targets, non-x86 Windows, and macOS ARM. |
|
||||
| `target` | string | yes | The target triple to compile for. This should be one of the targets listed by running `rustup target list`. |
|
||||
| `toolchain` | string (one of `stable`, `beta`, or `nightly`) | no | The Rust toolchain version to install. The default is `stable` |
|
||||
| `GITHUB_TOKEN` | string | no | Defaults to the value of `${{ github.token }}`. |
|
||||
| `args` | string | no | A string-separated list of arguments to be passed to `cross build`, like `--release --locked`. |
|
||||
| `strip` | boolean (`true` or `false`) | no | If this is true, then the resulting binary will be stripped if possible. This is only possible for binaries which weren't cross-compiled. |
|
||||
| Key | Type | Required? | Description |
|
||||
| ------------------- | ---------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `command` | string (one of `build`, `test`, or `both`) | no | The command(s) to run. The default is `build`. Running the `test` command will fail with \*BSD targets, non-x86 Windows, and macOS ARM. |
|
||||
| `target` | string | yes | The target triple to compile for. This should be one of the targets found by running `rustup target list`. |
|
||||
| `working-directory` | string | no | The working directory in which to run the `cargo` or `cross` commands. Defaults to the current directory (`.`). |
|
||||
| `toolchain` | string (one of `stable`, `beta`, or `nightly`) | no | The Rust toolchain version to install. The default is `stable`. |
|
||||
| `GITHUB_TOKEN` | string | no | Defaults to the value of `${{ github.token }}`. |
|
||||
| `args` | string | no | A string-separated list of arguments to be passed to `cross build`, like `--release --locked`. |
|
||||
| `strip` | boolean (`true` or `false`) | no | If this is true, then the resulting binaries will be stripped if possible. This is only possible for binaries which weren't cross-compiled. |
|
||||
| `cross-version` | string | no | This can be used to set the version of `cross` to use. If specified, it should be a specific `cross` release tag. If this is not set then the latest version will always be used. |
|
||||
|
||||
## How it Works
|
||||
|
||||
Under the hood, this action will compile your binary with either `cargo` or `cross`, depending on
|
||||
Under the hood, this action will compile your binaries with either `cargo` or `cross`, depending on
|
||||
the host machine and target. For Linux builds, it will always use `cross` except for builds
|
||||
targeting an x86 architecture like `x86_64` or `i686`.
|
||||
|
||||
@@ -80,12 +82,12 @@ build `cross`.
|
||||
When compiling on Windows, it will do so in a Powershell environment, which can matter in some
|
||||
corner cases, like compiling the `openssl` crate with the `vendored` feature.
|
||||
|
||||
Finally, it will run `strip` to strip the binary if the `strip` parameter is true. This is only
|
||||
Finally, it will run `strip` to strip the binaries if the `strip` parameter is true. This is only
|
||||
possible for builds that are not done via `cross`. In addition, Windows builds for `aarch64` cannot
|
||||
be stripped either.
|
||||
|
||||
## Caching Rust Compilation Output
|
||||
|
||||
You can use the [Swatinem/rust-cache](https://github.com/Swatinem/rust-cache) action with this one
|
||||
seemlessly, whether or not a specific build target needs `cross. There is no special configuration
|
||||
seemlessly, whether or not a specific build target needs `cross`. There is no special configuration
|
||||
that you need for this. It just works.
|
||||
|
||||
26
action.yml
26
action.yml
@@ -6,6 +6,9 @@ branding:
|
||||
description: |
|
||||
Cross compile your Rust projects with cross (https://github.com/cross-rs/cross).
|
||||
inputs:
|
||||
working-directory:
|
||||
description: The working directory for each step
|
||||
default: "."
|
||||
command:
|
||||
description: |
|
||||
The commands to run (one of "build", "test", or "both").
|
||||
@@ -19,7 +22,7 @@ inputs:
|
||||
default: stable
|
||||
GITHUB_TOKEN:
|
||||
description: |
|
||||
A GitHub token, available in the secrets.GITHUB_TOKEN context variable.
|
||||
A GitHub token, available in the secrets.GITHUB_TOKEN working-directory variable.
|
||||
default: ${{ github.token }}
|
||||
args:
|
||||
description: |
|
||||
@@ -29,6 +32,10 @@ inputs:
|
||||
strip:
|
||||
description: Strip the compiled binary
|
||||
default: false
|
||||
cross-version:
|
||||
description: |
|
||||
The version of cross to use. If not specified, then the latest version
|
||||
will be used.
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
@@ -44,10 +51,10 @@ runs:
|
||||
with:
|
||||
targets: ${{ inputs.target }}
|
||||
toolchain: ${{ inputs.toolchain }}
|
||||
- name: Determine latest cross version
|
||||
id: determine-latest-cross-version
|
||||
- name: Determine cross version
|
||||
id: determine-cross-version
|
||||
shell: bash
|
||||
run: determine-latest-cross-version.sh
|
||||
run: determine-cross-version.sh "${{ inputs.cross-version }}"
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ inputs.GITHUB_TOKEN }}
|
||||
if: ${{ steps.determine-cross-compile.outputs.needs-cross == 'true' }}
|
||||
@@ -60,14 +67,14 @@ runs:
|
||||
if: ${{ steps.determine-cross-compile.outputs.needs-cross == 'true' }}
|
||||
- name: Cache cross
|
||||
id: cache-cross
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ steps.set-cross-dir.outputs.cross-dir }}/cross
|
||||
key: ${{ runner.os }}-${{ steps.determine-latest-cross-version.outputs.cross-version }}
|
||||
key: ${{ runner.os }}-${{ steps.determine-cross-version.outputs.cross-version }}
|
||||
if: ${{ steps.determine-cross-compile.outputs.needs-cross == 'true' }}
|
||||
- name: Install cross if cross-compiling (*nix)
|
||||
shell: bash
|
||||
run: install-cross-nix.sh ${{ steps.set-cross-dir.outputs.cross-dir }}
|
||||
run: install-cross-nix.sh ${{ steps.set-cross-dir.outputs.cross-dir }} ${{ steps.determine-cross-version.outputs.cross-version }}
|
||||
if: ${{ steps.determine-cross-compile.outputs.needs-cross == 'true' && steps.cache-cross.outputs.cache-hit != 'true' }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ inputs.GITHUB_TOKEN }}
|
||||
@@ -76,6 +83,7 @@ runs:
|
||||
shell: bash
|
||||
run: set-build-command.sh ${{ steps.set-cross-dir.outputs.cross-dir }}
|
||||
- name: Run tests (*nix)
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
shell: bash
|
||||
run: |
|
||||
${{ steps.set-build-command.outputs.build-command }} +${{inputs.toolchain}} test ${{ inputs.args }} --target ${{ inputs.target }}
|
||||
@@ -85,21 +93,25 @@ runs:
|
||||
# msys, notably OpenSSL, which is compiled locally when using the
|
||||
# `openssl` crate with the `vendored` feature.
|
||||
- name: Run tests (Windows)
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
shell: powershell
|
||||
run: |
|
||||
& ${{ steps.set-build-command.outputs.build-command }} +${{inputs.toolchain}} test ${{ inputs.args }} --target ${{ inputs.target }}
|
||||
if: ${{ inputs.command != 'build' && runner.os == 'Windows' }}
|
||||
- name: Build binary (*nix)
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
shell: bash
|
||||
run: |
|
||||
${{ steps.set-build-command.outputs.build-command }} +${{inputs.toolchain}} build ${{ inputs.args }} --target ${{ inputs.target }}
|
||||
if: ${{ inputs.command != 'test' && runner.os != 'Windows' }}
|
||||
- name: Build binary (Windows)
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
shell: powershell
|
||||
run: |
|
||||
& ${{ steps.set-build-command.outputs.build-command }} +${{inputs.toolchain}} build ${{ inputs.args }} --target ${{ inputs.target }}
|
||||
if: ${{ inputs.command != 'test' && runner.os == 'Windows' }}
|
||||
- name: Strip binary
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
shell: bash
|
||||
run: strip-binary.sh ${{ inputs.target }}
|
||||
# strip doesn't work with cross-arch binaries on Linux or Windows.
|
||||
|
||||
15
determine-cross-version.sh
Executable file
15
determine-cross-version.sh
Executable file
@@ -0,0 +1,15 @@
|
||||
set -e
|
||||
set -x
|
||||
set -o pipefail
|
||||
|
||||
VERSION=$1
|
||||
|
||||
if [ -z "$VERSION" ]; then
|
||||
JSON=$( curl \
|
||||
--request GET \
|
||||
--header "Authorization: Bearer $GITHUB_TOKEN" \
|
||||
https://api.github.com/repos/cross-rs/cross/releases/latest )
|
||||
VERSION=$( echo "$JSON" | jq -r ".tag_name")
|
||||
fi
|
||||
|
||||
echo "cross-version=$VERSION" >> $GITHUB_OUTPUT
|
||||
@@ -1,11 +0,0 @@
|
||||
set -e
|
||||
set -x
|
||||
set -o pipefail
|
||||
|
||||
JSON=$( curl \
|
||||
--request GET \
|
||||
--header "Authorization: Bearer $GITHUB_TOKEN" \
|
||||
https://api.github.com/repos/cross-rs/cross/releases/latest )
|
||||
VERSION=$( echo "$JSON" | jq -r ".tag_name")
|
||||
|
||||
echo "cross-version=$VERSION" >> $GITHUB_OUTPUT
|
||||
@@ -14,6 +14,9 @@ function install_tools () {
|
||||
run "ubi --project houseabsolute/precious --in ~/bin"
|
||||
run "ubi --project houseabsolute/omegasort --in ~/bin"
|
||||
run "npm install prettier"
|
||||
run "curl -L https://cpanmin.us/ -o ~/bin/cpanm"
|
||||
run "chmod 0755 ~/bin/cpanm"
|
||||
run "~/bin/cpanm --sudo --notest Perl::Tidy"
|
||||
}
|
||||
|
||||
if [ "$1" == "-v" ]; then
|
||||
|
||||
@@ -3,9 +3,16 @@ set -x
|
||||
set -o pipefail
|
||||
|
||||
CROSS_DIR="$1"
|
||||
VERSION="$2"
|
||||
|
||||
VERSION_ARGS=""
|
||||
if [ -n "$VERSION" ]; then
|
||||
VERSION_ARGS="--tag $VERSION"
|
||||
fi
|
||||
|
||||
cd "$CROSS_DIR"
|
||||
export TARGET=.
|
||||
curl --silent --location \
|
||||
https://raw.githubusercontent.com/houseabsolute/ubi/master/bootstrap/bootstrap-ubi.sh |
|
||||
sh
|
||||
./ubi --project cross-rs/cross --matching musl --in .
|
||||
./ubi --project cross-rs/cross --matching musl --in . $VERSION_ARGS
|
||||
|
||||
22
perltidyrc
Normal file
22
perltidyrc
Normal file
@@ -0,0 +1,22 @@
|
||||
-l=78
|
||||
-i=4
|
||||
-ci=4
|
||||
-se
|
||||
-b
|
||||
-bar
|
||||
-boc
|
||||
-vt=0
|
||||
-vtc=0
|
||||
-cti=0
|
||||
-pt=1
|
||||
-bt=1
|
||||
-sbt=1
|
||||
-bbt=1
|
||||
-nolq
|
||||
-npro
|
||||
-nsfs
|
||||
--blank-lines-before-packages=0
|
||||
--opening-hash-brace-right
|
||||
--no-outdent-long-comments
|
||||
--iterations=2
|
||||
-wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
|
||||
@@ -2,6 +2,17 @@ exclude = [
|
||||
"target",
|
||||
]
|
||||
|
||||
[commands.perltidy]
|
||||
type = "both"
|
||||
include = [ "**/*.{pl,pm,t,psgi}" ]
|
||||
exclude = "tests/lib/**"
|
||||
cmd = [ "perltidy", "--profile=$PRECIOUS_ROOT/perltidyrc" ]
|
||||
lint_flags = [ "--assert-tidy", "--no-standard-output", "--outfile=/dev/null" ]
|
||||
tidy_flags = [ "--backup-and-modify-in-place", "--backup-file-extension=/" ]
|
||||
ok_exit_codes = 0
|
||||
lint_failure_exit_codes = 2
|
||||
ignore_stderr = "Begin Error Output Stream"
|
||||
|
||||
[commands.prettier-md]
|
||||
type = "both"
|
||||
include = [ "**/*.md" ]
|
||||
|
||||
@@ -10,7 +10,11 @@ if uname -a | grep --quiet --extended-regexp -i "darwin|msys|windows"; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if echo "$TARGET" | grep --quiet --extended-regexp -i '(x86_64|586|686).+linux-(gnu|musl)'; then
|
||||
# On Linux, we should be able to cross-compile to i586 and i686, but in
|
||||
# practice this fails with some crates, notably openssl with the "vendored"
|
||||
# feature. This feature makes it compile openssl itself, which fails without
|
||||
# cross.
|
||||
if echo "$TARGET" | grep --quiet --extended-regexp -i 'x86_64.+linux-(gnu|musl)'; then
|
||||
echo "needs-cross=false" >> $GITHUB_OUTPUT
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -2,20 +2,29 @@ set -e
|
||||
set -x
|
||||
|
||||
TARGET=$1
|
||||
stripped=""
|
||||
did_strip=""
|
||||
|
||||
strip_binary () {
|
||||
if [[ $( uname -s ) =~ "Darwin" ]]; then
|
||||
EXE=$( find "$1" -maxdepth 1 -type f -perm +111 )
|
||||
stripped=$(
|
||||
find "$1" -maxdepth 1 -type f -perm +111 | while read exe; do
|
||||
strip "$exe"
|
||||
echo "stripped $exe"
|
||||
done
|
||||
)
|
||||
else
|
||||
EXE=$( find "$1" -maxdepth 1 -type f -executable )
|
||||
stripped=$(
|
||||
find "$1" -maxdepth 1 -type f -executable | while read exe; do
|
||||
strip "$exe"
|
||||
echo "stripped $exe"
|
||||
done
|
||||
)
|
||||
fi
|
||||
|
||||
if [ -z "$EXE" ]; then
|
||||
echo "Could not find a binary to strip in $1"
|
||||
if [ -z "$stripped" ]; then
|
||||
echo "Could not find any binaries to strip in $1"
|
||||
else
|
||||
strip "$EXE"
|
||||
stripped="$EXE"
|
||||
did_strip="true"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -27,7 +36,7 @@ for type in debug release; do
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$stripped" ]; then
|
||||
if [ -z "$did_strip" ]; then
|
||||
echo "No binaries were stripped"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -3,4 +3,25 @@ name = "test-project"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
# For testing it would be nice to create a binary with spaces in the name, but
|
||||
# right now the `name` value must be a valid crate name, and there's no
|
||||
# separate setting for the compiled executable's name. See
|
||||
# https://github.com/rust-lang/cargo/issues/9778.
|
||||
[[bin]]
|
||||
name = "bin1"
|
||||
path = "src/bin1.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "bin2"
|
||||
path = "src/bin2.rs"
|
||||
|
||||
# workaround for https://github.com/cross-rs/cross/issues/1345
|
||||
[package.metadata.cross.target.x86_64-unknown-netbsd]
|
||||
pre-build = [
|
||||
"mkdir -p /tmp/netbsd",
|
||||
"curl https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.2/amd64/binary/sets/base.tar.xz -O",
|
||||
"tar -C /tmp/netbsd -xJf base.tar.xz",
|
||||
"cp /tmp/netbsd/usr/lib/libexecinfo.so /usr/local/x86_64-unknown-netbsd/lib",
|
||||
"rm base.tar.xz",
|
||||
"rm -rf /tmp/netbsd",
|
||||
]
|
||||
|
||||
11
test-project/src/bin2.rs
Normal file
11
test-project/src/bin2.rs
Normal file
@@ -0,0 +1,11 @@
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
#[test]
|
||||
fn test_something() {
|
||||
assert_eq!(1, 1);
|
||||
}
|
||||
}
|
||||
7
test-project/subcrate/Cargo.lock
generated
Normal file
7
test-project/subcrate/Cargo.lock
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "subcrate"
|
||||
version = "0.1.0"
|
||||
15
test-project/subcrate/Cargo.toml
Normal file
15
test-project/subcrate/Cargo.toml
Normal file
@@ -0,0 +1,15 @@
|
||||
[package]
|
||||
name = "subcrate"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# workaround for https://github.com/cross-rs/cross/issues/1345
|
||||
[package.metadata.cross.target.x86_64-unknown-netbsd]
|
||||
pre-build = [
|
||||
"mkdir -p /tmp/netbsd",
|
||||
"curl https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.2/amd64/binary/sets/base.tar.xz -O",
|
||||
"tar -C /tmp/netbsd -xJf base.tar.xz",
|
||||
"cp /tmp/netbsd/usr/lib/libexecinfo.so /usr/local/x86_64-unknown-netbsd/lib",
|
||||
"rm base.tar.xz",
|
||||
"rm -rf /tmp/netbsd",
|
||||
]
|
||||
3
test-project/subcrate/src/main.rs
Normal file
3
test-project/subcrate/src/main.rs
Normal file
@@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
println!("Hello, world (subcrate)!");
|
||||
}
|
||||
114
tests/check-binary.pl
Executable file
114
tests/check-binary.pl
Executable file
@@ -0,0 +1,114 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use v5.30;
|
||||
use strict;
|
||||
use warnings;
|
||||
no warnings 'experimental::signatures';
|
||||
use feature 'signatures';
|
||||
use autodie;
|
||||
|
||||
use FindBin qw( $Bin );
|
||||
use File::Spec;
|
||||
use lib File::Spec->catdir( $Bin, 'lib' );
|
||||
|
||||
use Getopt::Long;
|
||||
use IPC::System::Simple qw( capturex );
|
||||
use Path::Tiny qw( path );
|
||||
use Test::More;
|
||||
|
||||
sub main {
|
||||
my $target;
|
||||
my $expect_cross;
|
||||
my $expect_cross_version;
|
||||
my $expect_file_re;
|
||||
my $expect_stripped;
|
||||
|
||||
GetOptions(
|
||||
'target=s' => \$target,
|
||||
'expect-file-re=s' => \$expect_file_re,
|
||||
'expect-cross!' => \$expect_cross,
|
||||
'expect-cross-version=s' => \$expect_cross_version,
|
||||
'expect-stripped!' => \$expect_stripped,
|
||||
);
|
||||
|
||||
check_cross(
|
||||
path( $ENV{RUNNER_TEMP} ),
|
||||
$expect_cross,
|
||||
$expect_cross_version
|
||||
);
|
||||
|
||||
for my $bin (
|
||||
path( qw( . target ), $target, qw( debug bin1 ) ),
|
||||
path( qw( . target ), $target, qw( debug bin2 ) ),
|
||||
path( qw( . subcrate target ), $target, qw( debug subcrate ) )
|
||||
) {
|
||||
check_binary( $bin, $expect_file_re, $expect_stripped );
|
||||
}
|
||||
|
||||
done_testing();
|
||||
}
|
||||
|
||||
sub check_cross ( $bin_dir, $expect_cross, $expect_cross_version ) {
|
||||
my $cross = $bin_dir->child('cross');
|
||||
if ($expect_cross) {
|
||||
ok( $cross->is_file && -x $cross, 'found `cross` in $PATH' );
|
||||
if ($expect_cross_version) {
|
||||
my $version = capturex( $cross, '--version' );
|
||||
like(
|
||||
$version, qr/\Q$expect_cross_version/,
|
||||
'cross version matches expected version'
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
ok( !$cross->exists, 'did not find `cross` in $PATH' );
|
||||
}
|
||||
}
|
||||
|
||||
sub check_binary ( $bin, $expect_file_re, $expect_stripped ) {
|
||||
ok( $bin->exists, "Binary at $bin exists" )
|
||||
or return;
|
||||
ok( $bin->is_file, "Binary at $bin is a file" )
|
||||
or return;
|
||||
ok( -x $bin, "Binary at $bin is executable" )
|
||||
or return;
|
||||
|
||||
my $file = capturex( qw( file --brief ), $bin ) // q{};
|
||||
chomp $file;
|
||||
|
||||
like(
|
||||
$file, qr/$expect_file_re/,
|
||||
"`file` output for $bin matches expected output"
|
||||
);
|
||||
|
||||
# The file command on macOS doesn't report whether the binary is stripped
|
||||
# or not.
|
||||
return if $^O eq 'darwin';
|
||||
|
||||
if ($expect_stripped) {
|
||||
unlike(
|
||||
$file, qr/not stripped/,
|
||||
"`file` does not report $bin as not stripped"
|
||||
);
|
||||
like( $file, qr/stripped/, "`file` reports $bin as stripped" );
|
||||
}
|
||||
else {
|
||||
if ( $^O eq 'MSWin32' || $^O eq 'msys' ) {
|
||||
|
||||
# On Windows, unstripped binaries don't contain the word
|
||||
# "stripped" at all.
|
||||
unlike(
|
||||
$file, qr/stripped/,
|
||||
"`file` does not report $bin as stripped"
|
||||
);
|
||||
}
|
||||
else {
|
||||
like(
|
||||
$file, qr/not stripped/,
|
||||
"`file` reports $bin as not stripped"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
@@ -1,49 +0,0 @@
|
||||
set -e
|
||||
set -x
|
||||
|
||||
TARGET=$1
|
||||
EXPECT_CROSS=$2
|
||||
EXPECT_FILE_RE=$3
|
||||
EXPECT_STRIPPED=$4
|
||||
|
||||
if [ "$EXPECT_CROSS" == "true" ]; then
|
||||
if [ ! -f "$RUNNER_TEMP/cross" ]; then
|
||||
echo "Could not find cross in path: $PATH"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
if [ -f "$RUNNER_TEMP/cross" ]; then
|
||||
echo "Found cross in path: $PATH"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
FILE=$(file --brief ./target/$TARGET/debug/test-project)
|
||||
if [[ "$FILE" =~ $EXPECT_FILE_RE ]]; then
|
||||
echo "file output matches $EXPECT_FILE_RE"
|
||||
else
|
||||
echo "file output does not match $EXPECT_FILE_RE"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [[ $( uname -s ) =~ "Darwin" ]]; then
|
||||
# File on macOS doesn't report whether the binary is stripped or not.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "$FILE" =~ "not stripped" ]]; then
|
||||
echo "binary was not stripped"
|
||||
GOT_STRIPPED="false"
|
||||
elif [[ "$FILE" =~ "stripped" ]]; then
|
||||
echo "binary was stripped"
|
||||
GOT_STRIPPED="true"
|
||||
else
|
||||
# On Windows the aarch64 binary's file info doesn't include the word
|
||||
# "stripped" at all.
|
||||
echo "binary was not stripped"
|
||||
GOT_STRIPPED="false"
|
||||
fi
|
||||
|
||||
if [ "$EXPECT_STRIPPED" != "$GOT_STRIPPED" ]; then
|
||||
exit 3
|
||||
fi
|
||||
1115
tests/lib/IPC/System/Simple.pm
Normal file
1115
tests/lib/IPC/System/Simple.pm
Normal file
File diff suppressed because it is too large
Load Diff
3880
tests/lib/Path/Tiny.pm
Normal file
3880
tests/lib/Path/Tiny.pm
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user