diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 529f257..ba9a055 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -6,7 +6,27 @@ on: - "v*" jobs: - build-linux-static: + create-release: + runs-on: ubuntu-latest + outputs: + release_id: ${{ steps.create.outputs.release_id }} + steps: + - name: Create Gitea release + id: create + env: + GITEA_TOKEN: ${{ secrets.GITEATOKEN }} + TAG: ${{ github.ref_name }} + run: | + sudo apt-get update -qq && sudo apt-get install -y -qq jq + release_id=$(curl -s -X POST \ + "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases" \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\"}" | jq -r '.id') + echo "release_id=$release_id" >> $GITHUB_OUTPUT + + build-linux-x86_64: + needs: create-release runs-on: ubuntu-latest defaults: run: @@ -45,23 +65,58 @@ jobs: PKG_CONFIG_ALLOW_CROSS: "1" run: cargo zigbuild --release --target x86_64-unknown-linux-musl - - name: Prepare artifact + - name: Prepare and upload artifact + env: + GITEA_TOKEN: ${{ secrets.GITEATOKEN }} + RELEASE_ID: ${{ needs.create-release.outputs.release_id }} run: | mkdir -p /tmp/dist cp target/x86_64-unknown-linux-musl/release/obikmer /tmp/dist/obikmer-linux-x86_64 strip /tmp/dist/obikmer-linux-x86_64 - - - name: Create Gitea release and upload binary - env: - GITEA_TOKEN: ${{ secrets.GITEATOKEN }} - TAG: ${{ github.ref_name }} - run: | - release_id=$(curl -s -X POST \ - "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases" \ - -H "Authorization: token $GITEA_TOKEN" \ - -H "Content-Type: application/json" \ - -d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\"}" | jq -r '.id') curl -s -X POST \ - "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/$release_id/assets" \ + "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/$RELEASE_ID/assets" \ -H "Authorization: token $GITEA_TOKEN" \ -F "attachment=@/tmp/dist/obikmer-linux-x86_64" + + build-macos-arm64: + needs: create-release + runs-on: ubuntu-latest + defaults: + run: + working-directory: src + steps: + - uses: actions/checkout@v4 + + - name: Install Rust + zigbuild + run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable + echo "$HOME/.cargo/bin" >> $GITHUB_PATH + sudo apt-get update -qq && sudo apt-get install -y -qq jq + pip install ziglang --quiet --break-system-packages + $HOME/.cargo/bin/cargo install cargo-zigbuild + $HOME/.cargo/bin/rustup target add aarch64-apple-darwin + + - name: Cache cargo registry + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + src/target + key: macos-arm64-cargo-${{ hashFiles('src/Cargo.lock') }} + restore-keys: macos-arm64-cargo- + + - name: Build macOS binary + run: cargo zigbuild --release --target aarch64-apple-darwin --no-default-features + + - name: Prepare and upload artifact + env: + GITEA_TOKEN: ${{ secrets.GITEATOKEN }} + RELEASE_ID: ${{ needs.create-release.outputs.release_id }} + run: | + mkdir -p /tmp/dist + cp target/aarch64-apple-darwin/release/obikmer /tmp/dist/obikmer-macos-arm64 + curl -s -X POST \ + "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/$RELEASE_ID/assets" \ + -H "Authorization: token $GITEA_TOKEN" \ + -F "attachment=@/tmp/dist/obikmer-macos-arm64" diff --git a/src/Cargo.lock b/src/Cargo.lock index 80d30d7..38b6af5 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -1704,7 +1704,7 @@ dependencies = [ [[package]] name = "obikmer" -version = "1.1.15" +version = "1.1.16" dependencies = [ "clap", "csv", diff --git a/src/obikindex/Cargo.toml b/src/obikindex/Cargo.toml index 3541d90..c8fef8e 100644 --- a/src/obikindex/Cargo.toml +++ b/src/obikindex/Cargo.toml @@ -17,4 +17,8 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" indicatif = "0.17" tracing = "0.1.44" -hwlocality = { version = "1.0.0-alpha.11", features = ["vendored"] } +hwlocality = { version = "1.0.0-alpha.11", features = ["vendored"], optional = true } + +[features] +default = ["numa"] +numa = ["hwlocality"] diff --git a/src/obikindex/src/numa.rs b/src/obikindex/src/numa.rs index 9032a99..42eb48b 100644 --- a/src/obikindex/src/numa.rs +++ b/src/obikindex/src/numa.rs @@ -12,9 +12,13 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use crossbeam_channel::unbounded; +#[cfg(feature = "numa")] use hwlocality::Topology; +#[cfg(feature = "numa")] use hwlocality::cpu::binding::CpuBindingFlags; +#[cfg(feature = "numa")] use hwlocality::cpu::cpuset::CpuSet; +#[cfg(feature = "numa")] use hwlocality::object::types::ObjectType; use obisys::CpuSample; use tracing::debug; @@ -40,6 +44,7 @@ impl NumaSetup { /// Detect NUMA topology and build per-node Rayon pools. /// Always succeeds: falls back to a single synthetic UMA node on failure. +#[cfg(feature = "numa")] pub fn build() -> NumaSetup { if let Ok(topology) = Topology::new() { let nodes: Vec> = topology @@ -81,8 +86,21 @@ pub fn build() -> NumaSetup { } } +#[cfg(not(feature = "numa"))] +pub fn build() -> NumaSetup { + let n_cores = std::thread::available_parallelism() + .map(|n| n.get()) + .unwrap_or(1); + debug!("UMA: single synthetic node, {} core(s)", n_cores); + NumaSetup { + pools: vec![None], + cpus_per_node: vec![(0..n_cores).collect()], + } +} + /// Bind the calling thread to `cpu_indices` using hwloc. /// Silently returns on any error so the thread still runs, just unbound. +#[cfg(feature = "numa")] pub fn pin_current_thread(cpu_indices: &[usize]) { let Ok(topology) = Topology::new() else { return }; let mut cpuset = CpuSet::new(); @@ -92,8 +110,12 @@ pub fn pin_current_thread(cpu_indices: &[usize]) { let _ = topology.bind_cpu(&cpuset, CpuBindingFlags::THREAD); } +#[cfg(not(feature = "numa"))] +pub fn pin_current_thread(_cpu_indices: &[usize]) {} + // ── Internal helpers ────────────────────────────────────────────────────────── +#[cfg(feature = "numa")] fn build_pool(cpus: &[usize]) -> Option { let cpus = cpus.to_vec(); rayon::ThreadPoolBuilder::new() diff --git a/src/obikmer/Cargo.toml b/src/obikmer/Cargo.toml index 936e46a..3f6502a 100644 --- a/src/obikmer/Cargo.toml +++ b/src/obikmer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "obikmer" -version = "1.1.15" +version = "1.1.16" edition = "2024" [[bin]]