Skip to content

Commit 2d6f2b2

Browse files
committed
refactor: rename project from hurl to quickurl
- Updated package name, binary name, and repository references across all configuration files - Added cross-compilation support with Makefile targets for Linux, Windows, macOS, and ARM platforms - Refreshed documentation to reflect new project name and enhanced build capabilities
1 parent cd288bf commit 2d6f2b2

File tree

15 files changed

+994
-94
lines changed

15 files changed

+994
-94
lines changed

.github/workflows/ci.yml

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [ main, master ]
6+
pull_request:
7+
branches: [ main, master ]
8+
9+
env:
10+
CARGO_TERM_COLOR: always
11+
12+
jobs:
13+
test:
14+
name: Test
15+
runs-on: ${{ matrix.os }}
16+
strategy:
17+
matrix:
18+
os: [ubuntu-latest, macos-latest, windows-latest]
19+
rust: [stable]
20+
steps:
21+
- uses: actions/checkout@v3
22+
23+
- name: Install Rust
24+
uses: actions-rs/toolchain@v1
25+
with:
26+
toolchain: ${{ matrix.rust }}
27+
override: true
28+
components: rustfmt, clippy
29+
30+
- name: Cache cargo registry
31+
uses: actions/cache@v3
32+
with:
33+
path: ~/.cargo/registry
34+
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
35+
36+
- name: Cache cargo index
37+
uses: actions/cache@v3
38+
with:
39+
path: ~/.cargo/git
40+
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
41+
42+
- name: Cache cargo build
43+
uses: actions/cache@v3
44+
with:
45+
path: target
46+
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
47+
48+
- name: Check formatting
49+
run: cargo fmt -- --check
50+
51+
- name: Run clippy
52+
run: cargo clippy -- -D warnings
53+
54+
- name: Build
55+
run: cargo build --verbose
56+
57+
- name: Run tests
58+
run: cargo test --verbose
59+
60+
- name: Build release
61+
run: cargo build --release --verbose
62+
63+
coverage:
64+
name: Code Coverage
65+
runs-on: ubuntu-latest
66+
steps:
67+
- uses: actions/checkout@v3
68+
69+
- name: Install Rust
70+
uses: actions-rs/toolchain@v1
71+
with:
72+
toolchain: stable
73+
override: true
74+
75+
- name: Install tarpaulin
76+
run: cargo install cargo-tarpaulin
77+
78+
- name: Generate coverage
79+
run: cargo tarpaulin --verbose --all-features --workspace --timeout 120 --out Xml
80+
81+
- name: Upload coverage to Codecov
82+
uses: codecov/codecov-action@v3
83+
with:
84+
files: ./cobertura.xml
85+
fail_ci_if_error: false

.github/workflows/release.yml

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
workflow_dispatch:
8+
9+
jobs:
10+
build:
11+
name: Build ${{ matrix.target }}
12+
runs-on: ${{ matrix.os }}
13+
strategy:
14+
matrix:
15+
include:
16+
- os: ubuntu-latest
17+
target: x86_64-unknown-linux-gnu
18+
artifact_name: quickurl
19+
asset_name: quickurl-linux-x86_64
20+
- os: ubuntu-latest
21+
target: aarch64-unknown-linux-gnu
22+
artifact_name: quickurl
23+
asset_name: quickurl-linux-arm64
24+
- os: ubuntu-latest
25+
target: x86_64-pc-windows-gnu
26+
artifact_name: quickurl.exe
27+
asset_name: quickurl-windows-x86_64.exe
28+
- os: macos-latest
29+
target: x86_64-apple-darwin
30+
artifact_name: quickurl
31+
asset_name: quickurl-macos-x86_64
32+
- os: macos-latest
33+
target: aarch64-apple-darwin
34+
artifact_name: quickurl
35+
asset_name: quickurl-macos-arm64
36+
37+
steps:
38+
- uses: actions/checkout@v3
39+
40+
- name: Install Rust
41+
uses: actions-rs/toolchain@v1
42+
with:
43+
toolchain: stable
44+
target: ${{ matrix.target }}
45+
override: true
46+
47+
- name: Install cross (for Linux targets)
48+
if: matrix.os == 'ubuntu-latest'
49+
run: cargo install cross
50+
51+
- name: Build
52+
run: |
53+
if [ "${{ matrix.os }}" = "ubuntu-latest" ]; then
54+
cross build --release --target ${{ matrix.target }}
55+
else
56+
cargo build --release --target ${{ matrix.target }}
57+
fi
58+
59+
- name: Strip binary (Linux/macOS)
60+
if: matrix.os != 'windows-latest'
61+
run: |
62+
strip target/${{ matrix.target }}/release/${{ matrix.artifact_name }} || true
63+
64+
- name: Upload artifact
65+
uses: actions/upload-artifact@v3
66+
with:
67+
name: ${{ matrix.asset_name }}
68+
path: target/${{ matrix.target }}/release/${{ matrix.artifact_name }}
69+
70+
create-universal-macos:
71+
name: Create macOS Universal Binary
72+
runs-on: macos-latest
73+
needs: build
74+
steps:
75+
- uses: actions/checkout@v3
76+
77+
- name: Download x86_64 binary
78+
uses: actions/download-artifact@v3
79+
with:
80+
name: quickurl-macos-x86_64
81+
path: ./x86_64
82+
83+
- name: Download arm64 binary
84+
uses: actions/download-artifact@v3
85+
with:
86+
name: quickurl-macos-arm64
87+
path: ./arm64
88+
89+
- name: Create universal binary
90+
run: |
91+
mkdir -p ./universal
92+
lipo -create ./x86_64/quickurl ./arm64/quickurl -output ./universal/quickurl
93+
chmod +x ./universal/quickurl
94+
95+
- name: Upload universal binary
96+
uses: actions/upload-artifact@v3
97+
with:
98+
name: quickurl-macos-universal
99+
path: ./universal/quickurl
100+
101+
release:
102+
name: Create Release
103+
needs: [build, create-universal-macos]
104+
runs-on: ubuntu-latest
105+
if: startsWith(github.ref, 'refs/tags/')
106+
steps:
107+
- uses: actions/checkout@v3
108+
109+
- name: Download all artifacts
110+
uses: actions/download-artifact@v3
111+
with:
112+
path: ./artifacts
113+
114+
- name: Create release archives
115+
run: |
116+
cd artifacts
117+
for dir in */; do
118+
name=${dir%/}
119+
cd "$dir"
120+
if [[ $name == *"windows"* ]]; then
121+
zip "../${name}.zip" *
122+
else
123+
tar czf "../${name}.tar.gz" *
124+
fi
125+
cd ..
126+
done
127+
128+
- name: Create Release
129+
uses: softprops/action-gh-release@v1
130+
with:
131+
files: artifacts/*.{tar.gz,zip}
132+
draft: false
133+
prerelease: false
134+
env:
135+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

APPLE_SILICON_FIX.md

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
# Apple Silicon 交叉编译修复指南
2+
3+
## 问题
4+
5+
在 Apple Silicon (M1/M2/M3) Mac 上使用 `cross` 工具进行交叉编译时,会遇到以下错误:
6+
7+
```
8+
docker: no matching manifest for linux/arm64/v8 in the manifest list entries
9+
```
10+
11+
这是因为 `cross` 工具的 Docker 镜像不支持 ARM64 主机架构。
12+
13+
## 解决方案
14+
15+
我们提供了两种解决方案:
16+
17+
### 方案 1: 使用 cargo-zigbuild (推荐)
18+
19+
`cargo-zigbuild` 使用 Zig 编译器进行交叉编译,不依赖 Docker,在 Apple Silicon 上工作完美。
20+
21+
#### 安装步骤
22+
23+
```bash
24+
# 1. 重新安装交叉编译工具(会自动检测 Apple Silicon 并安装 zigbuild)
25+
make install-cross
26+
```
27+
28+
这将自动:
29+
- 通过 Homebrew 安装 `zig` 编译器
30+
- 安装 `cargo-zigbuild` 工具
31+
- 添加所有必要的 Rust target
32+
33+
#### 使用方法
34+
35+
安装完成后,Makefile 会自动使用 `cargo-zigbuild` 而不是 `cross`
36+
37+
```bash
38+
# 编译 Linux x86_64
39+
make cross-linux
40+
41+
# 编译 Linux ARM64
42+
make cross-arm
43+
44+
# 编译 Windows x86_64
45+
make cross-windows
46+
47+
# 编译所有平台
48+
make cross-all
49+
```
50+
51+
### 方案 2: 使用 Cross.toml 配置
52+
53+
如果你仍然想使用 `cross`,可以使用项目中的 `Cross.toml` 配置文件,它指定了支持 ARM64 的 Docker 镜像:
54+
55+
```bash
56+
# 使用 edge 版本的镜像
57+
cross build --release --target x86_64-unknown-linux-gnu
58+
```
59+
60+
但是这种方法可能仍然会遇到问题,因为 Docker 镜像的支持有限。
61+
62+
## 验证安装
63+
64+
```bash
65+
# 检查 zig 是否安装
66+
zig version
67+
68+
# 检查 cargo-zigbuild 是否安装
69+
cargo zigbuild --version
70+
71+
# 检查 Rust targets
72+
rustup target list --installed
73+
```
74+
75+
## 测试交叉编译
76+
77+
```bash
78+
# 测试编译 Linux x86_64
79+
make cross-linux
80+
81+
# 如果成功,你会看到:
82+
# Building for Linux x86_64...
83+
# Using cargo-zigbuild (Apple Silicon detected)...
84+
# Binary: target/x86_64-unknown-linux-gnu/release/hurl
85+
```
86+
87+
## 常见问题
88+
89+
### Q: 为什么不能使用 cross?
90+
91+
A: `cross` 工具依赖 Docker 镜像,而大多数镜像只为 x86_64 主机构建。虽然有一些 `edge` 版本的镜像支持 ARM64,但支持不完整且不稳定。
92+
93+
### Q: cargo-zigbuild 和 cross 有什么区别?
94+
95+
A:
96+
- `cross` 使用 Docker 容器提供完整的交叉编译环境
97+
- `cargo-zigbuild` 使用 Zig 编译器作为链接器,不需要 Docker
98+
- 在 Apple Silicon 上,`cargo-zigbuild` 更可靠且速度更快
99+
100+
### Q: 如果 Homebrew 安装 zig 失败怎么办?
101+
102+
A: 可以手动下载 zig:
103+
104+
```bash
105+
# 从官网下载
106+
# https://ziglang.org/download/
107+
108+
# 或使用其他包管理器
109+
# macports:
110+
sudo port install zig
111+
112+
# 或直接下载二进制
113+
curl -L https://ziglang.org/download/0.11.0/zig-macos-aarch64-0.11.0.tar.xz | tar xJ
114+
sudo mv zig-macos-aarch64-0.11.0 /usr/local/zig
115+
export PATH="/usr/local/zig:$PATH"
116+
```
117+
118+
### Q: 编译后的二进制文件能在目标平台上运行吗?
119+
120+
A: 是的!`cargo-zigbuild` 生成的二进制文件与原生编译的二进制文件完全兼容。
121+
122+
## 手动安装步骤
123+
124+
如果 `make install-cross` 失败,可以手动执行:
125+
126+
```bash
127+
# 1. 安装 zig
128+
brew install zig
129+
130+
# 2. 安装 cargo-zigbuild
131+
cargo install cargo-zigbuild
132+
133+
# 3. 添加 Rust targets
134+
rustup target add x86_64-unknown-linux-gnu
135+
rustup target add aarch64-unknown-linux-gnu
136+
rustup target add x86_64-pc-windows-gnu
137+
138+
# 4. 测试编译
139+
cargo zigbuild --release --target x86_64-unknown-linux-gnu
140+
```
141+
142+
## 性能对比
143+
144+
在 Apple Silicon 上:
145+
146+
| 工具 | 编译时间 | 依赖 | 稳定性 |
147+
|------|---------|------|--------|
148+
| cross | ❌ 不可用 | Docker | ❌ 镜像不兼容 |
149+
| cargo-zigbuild | ✅ 快速 | Zig | ✅ 稳定 |
150+
| 原生编译 | ✅ 最快 || ✅ 仅限 macOS |
151+
152+
## 更多信息
153+
154+
- [cargo-zigbuild GitHub](https://github.com/rust-cross/cargo-zigbuild)
155+
- [Zig 官网](https://ziglang.org/)
156+
- [Cross GitHub](https://github.com/cross-rs/cross)

0 commit comments

Comments
 (0)