Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix publishing of static binaries #24

Merged
merged 19 commits into from
Feb 24, 2023
12 changes: 12 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# On Windows MSVC, statically link the C runtime so that the resulting EXE does
# not depend on the vcruntime DLL.
#
# See: https://github.com/BurntSushi/ripgrep/pull/1613
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]
[target.i686-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]

# On ARM, need to link to the atomic library
[target.arm-unknown-linux-gnueabihf]
rustflags = ["-C", "link-args=-latomic"]
128 changes: 114 additions & 14 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,129 @@ on:

jobs:
publish:
name: Publish for ${{ matrix.os }}
name: Publish for ${{ matrix.os }} - ${{ matrix.target }}
runs-on: ${{ matrix.os }}
env:
# For some builds, we use cross to test on 32-bit and big-endian
# systems.
CARGO: cargo
# When CARGO is set to CROSS, this is set to `--target matrix.target`.
TARGET_FLAGS: ""
# When CARGO is set to CROSS, TARGET_DIR includes matrix.target.
TARGET_DIR: ./target
# Emit backtraces on panics.
RUST_BACKTRACE: 1
strategy:
fail-fast: false
matrix:
build: [linux, linux-arm, macos, win-msvc, win-gnu, win32-msvc]
include:
- os: ubuntu-latest
artifact_name: fqgrep
asset_name: fqgrep-linux-amd64
- os: macos-latest
artifact_name: fqgrep
asset_name: fqgrep-macos-amd64
- os: windows-latest
artifact_name: fqgrep.exe
asset_name: fqgrep-windows-amd64
# TODO:
# - arm-unknown-linux-musleabihf
# - aarch64-unknown-linux-gnu
# - i686-unknown-linux-gnu
# - i686-unknown-linux-musl
# - x86_64-unknown-linux-gnu
- build: linux
os: ubuntu-22.04
rust: nightly
use-cross: true
target: x86_64-unknown-linux-musl
asset_name: fqgrep-x86_64-unknown-linux-musl
- build: linux-arm
os: ubuntu-22.04
rust: nightly
use-cross: true
target: arm-unknown-linux-gnueabihf
asset_name: fqgrep-arm-unknown-linux-gnueabihf
- build: macos
os: macos-12
rust: nightly
target: x86_64-apple-darwin
asset_name: fqgrep-x86_64-apple-darwin
- build: win-msvc
os: windows-2022
rust: nightly
target: x86_64-pc-windows-msvc
asset_name: fqgrep-x86_64-pc-windows-msvc.exe
- build: win-gnu
os: windows-2022
rust: nightly
target: x86_64-pc-windows-gnu
asset_name: fqgrep-x86_64-pc-windows-gnu.exe
- build: win32-msvc
os: windows-2022
rust: nightly
target: i686-pc-windows-msvc
asset_name: fqgrep-i686-pc-windows-msvc.exe

steps:
- uses: actions/checkout@v2
- name: Build
run: cargo build --release --locked
- name: Checkout repository
uses: actions/checkout@v3

- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
target: ${{ matrix.target }}

- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.job.os }}-${{ matrix.job.target }}

- name: Use Cross
shell: bash
if: ${{ matrix.use-cross == true }}
run: |
cargo install cross
echo "CARGO=cross" >> $GITHUB_ENV

- name: Set target environment variables
shell: bash
run: |
echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV
echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV

- name: Add missing target
run: rustup target add ${{ matrix.target }}

- name: Show command used for Cargo
run: |
echo "cargo command is: ${{ env.CARGO }}"
echo "target flag is: ${{ env.TARGET_FLAGS }}"
echo "target dir is: ${{ env.TARGET_DIR }}"

- name: Build release binary
run: ${{ env.CARGO }} build --locked --verbose --release ${{ env.TARGET_FLAGS }}

- name: Strip release binary (linux and macos)
if: matrix.build == 'linux' || matrix.build == 'macos'
run: strip "target/${{ matrix.target }}/release/fqgrep"

- name: Strip release binary (arm)
if: matrix.build == 'linux-arm'
run: |
docker run --rm -v \
"$PWD/target:/target:Z" \
rustembedded/cross:arm-unknown-linux-gnueabihf \
arm-linux-gnueabihf-strip \
/target/arm-unknown-linux-gnueabihf/release/fqgrep

- name: Rename binary
shell: bash
run: |
if [ "${{ matrix.os }}" = "windows-2022" ]; then
cp "target/${{ matrix.target }}/release/fqgrep.exe" "fqgrep-${{ matrix.target }}"
else
# The man page is only generated on Unix systems. ¯\_(ツ)_/¯
nh13 marked this conversation as resolved.
Show resolved Hide resolved
cp "target/${{ matrix.target }}/release/fqgrep" "fqgrep-${{ matrix.target }}"
fi

- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: target/release/${{ matrix.artifact_name }}
file: fqgrep-${{ matrix.target }}
asset_name: ${{ matrix.asset_name }}
tag: ${{ github.ref }}