diff --git a/.gitea/workflows/codegen.yml b/.gitea/workflows/codegen.yml index 6387b9f..a44f64c 100644 --- a/.gitea/workflows/codegen.yml +++ b/.gitea/workflows/codegen.yml @@ -10,6 +10,7 @@ on: - "codegen/**" - "tools/codegen/**" - "tools/generate_*.py" + - "tools/install_openjpeg_2_5_4.sh" - "tools/check_api_coverage.py" - "tools/check_codegen_gate.py" - "tools/check_milestone_08.py" @@ -51,6 +52,7 @@ on: - "codegen/**" - "tools/codegen/**" - "tools/generate_*.py" + - "tools/install_openjpeg_2_5_4.sh" - "tools/check_api_coverage.py" - "tools/check_codegen_gate.py" - "tools/check_milestone_08.py" @@ -88,11 +90,20 @@ on: jobs: deterministic: runs-on: ubuntu-latest + env: + OPENJPEG_PREFIX: /tmp/metacrate-openjpeg-${{ github.run_id }} + PKG_CONFIG_PATH: /tmp/metacrate-openjpeg-${{ github.run_id }}/lib/pkgconfig + LD_LIBRARY_PATH: /tmp/metacrate-openjpeg-${{ github.run_id }}/lib steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: components: clippy,rustfmt + - name: Install audited OpenJPEG 2.5.4 + run: | + sudo apt-get update + sudo apt-get install --yes build-essential cmake pkg-config + tools/install_openjpeg_2_5_4.sh "$OPENJPEG_PREFIX" - name: Test diagnostics and byte-identical generation run: cargo test -p libremetaverse-codegen - name: Verify vendored hashes and checked-in output diff --git a/.gitea/workflows/imaging-meshing.yml b/.gitea/workflows/imaging-meshing.yml index e738340..fef5e09 100644 --- a/.gitea/workflows/imaging-meshing.yml +++ b/.gitea/workflows/imaging-meshing.yml @@ -21,6 +21,7 @@ on: - "tests/compat/tests/imaging_meshing_semantics.rs" - "tests/upstream-tests.json" - "tools/check_milestone_06.py" + - "tools/install_openjpeg_2_5_4.sh" pull_request: paths: - ".gitea/workflows/imaging-meshing.yml" @@ -41,6 +42,7 @@ on: - "tests/compat/tests/imaging_meshing_semantics.rs" - "tests/upstream-tests.json" - "tools/check_milestone_06.py" + - "tools/install_openjpeg_2_5_4.sh" workflow_dispatch: jobs: @@ -48,6 +50,9 @@ jobs: runs-on: ubuntu-latest env: RUSTDOCFLAGS: -D warnings + OPENJPEG_PREFIX: /tmp/metacrate-openjpeg-${{ github.run_id }} + PKG_CONFIG_PATH: /tmp/metacrate-openjpeg-${{ github.run_id }}/lib/pkgconfig + LD_LIBRARY_PATH: /tmp/metacrate-openjpeg-${{ github.run_id }}/lib steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 @@ -56,6 +61,11 @@ jobs: - uses: dtolnay/rust-toolchain@stable with: components: clippy,rustfmt + - name: Install audited OpenJPEG 2.5.4 + run: | + sudo apt-get update + sudo apt-get install --yes build-essential cmake pkg-config + tools/install_openjpeg_2_5_4.sh "$OPENJPEG_PREFIX" - name: Audit milestone ownership and feature isolation run: python tools/check_milestone_06.py - name: Test native imaging and meshing crates diff --git a/.gitea/workflows/jpeg2000.yml b/.gitea/workflows/jpeg2000.yml index ada7771..be2aa00 100644 --- a/.gitea/workflows/jpeg2000.yml +++ b/.gitea/workflows/jpeg2000.yml @@ -10,6 +10,7 @@ on: - "crates/libremetaverse-types/**" - "crates/libremetaverse-imaging/**" - "crates/libremetaverse-openjpeg/**" + - "tools/install_openjpeg_2_5_4.sh" pull_request: paths: - ".gitea/workflows/jpeg2000.yml" @@ -19,16 +20,18 @@ on: - "crates/libremetaverse-types/**" - "crates/libremetaverse-imaging/**" - "crates/libremetaverse-openjpeg/**" + - "tools/install_openjpeg_2_5_4.sh" workflow_dispatch: jobs: linux: runs-on: ubuntu-latest env: - # Ubuntu 24.04 also ships an older libopenjp2.so.7. Ensure both - # pkg-config and the runtime loader select the audited 2.5.4 install. - PKG_CONFIG_PATH: /usr/local/lib/pkgconfig - LD_LIBRARY_PATH: /usr/local/lib + # Ubuntu also ships an older libopenjp2.so.7. Ensure both pkg-config and + # the runtime loader select this run's isolated, audited 2.5.4 install. + OPENJPEG_PREFIX: /tmp/metacrate-openjpeg-${{ github.run_id }} + PKG_CONFIG_PATH: /tmp/metacrate-openjpeg-${{ github.run_id }}/lib/pkgconfig + LD_LIBRARY_PATH: /tmp/metacrate-openjpeg-${{ github.run_id }}/lib steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable @@ -36,12 +39,7 @@ jobs: run: | sudo apt-get update sudo apt-get install --yes build-essential cmake pkg-config - git clone --branch v2.5.4 --depth 1 https://github.com/uclouvain/openjpeg.git /tmp/openjpeg-2.5.4 - cmake -S /tmp/openjpeg-2.5.4 -B /tmp/openjpeg-build -DBUILD_CODEC=OFF -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release - cmake --build /tmp/openjpeg-build --parallel - sudo cmake --install /tmp/openjpeg-build - sudo ldconfig - test "$(pkg-config --modversion libopenjp2)" = "2.5.4" + tools/install_openjpeg_2_5_4.sh "$OPENJPEG_PREFIX" - name: Build and test optional feature run: | cargo test -p libremetaverse-imaging --features jpeg2000 diff --git a/.gitea/workflows/rust-workspace.yml b/.gitea/workflows/rust-workspace.yml index 649c52f..410fc69 100644 --- a/.gitea/workflows/rust-workspace.yml +++ b/.gitea/workflows/rust-workspace.yml @@ -4,12 +4,14 @@ on: push: paths: - ".gitea/workflows/rust-workspace.yml" + - "tools/install_openjpeg_2_5_4.sh" - "**/*.rs" - "**/Cargo.toml" - "Cargo.lock" pull_request: paths: - ".gitea/workflows/rust-workspace.yml" + - "tools/install_openjpeg_2_5_4.sh" - "**/*.rs" - "**/Cargo.toml" - "Cargo.lock" @@ -18,11 +20,20 @@ on: jobs: compile: runs-on: ubuntu-latest + env: + OPENJPEG_PREFIX: /tmp/metacrate-openjpeg-${{ github.run_id }} + PKG_CONFIG_PATH: /tmp/metacrate-openjpeg-${{ github.run_id }}/lib/pkgconfig + LD_LIBRARY_PATH: /tmp/metacrate-openjpeg-${{ github.run_id }}/lib steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: components: rustfmt + - name: Install audited OpenJPEG 2.5.4 + run: | + sudo apt-get update + sudo apt-get install --yes build-essential cmake pkg-config + tools/install_openjpeg_2_5_4.sh "$OPENJPEG_PREFIX" - name: Check formatting run: cargo fmt --all -- --check - name: Audit native milestone 09 boundaries diff --git a/tools/install_openjpeg_2_5_4.sh b/tools/install_openjpeg_2_5_4.sh new file mode 100755 index 0000000..d38defc --- /dev/null +++ b/tools/install_openjpeg_2_5_4.sh @@ -0,0 +1,68 @@ +#!/bin/sh + +set -eu + +OPENJPEG_VERSION=2.5.4 +OPENJPEG_COMMIT=6c4a29b00211eb0430fa0e5e890f1ce5c80f409f + +if [ "$#" -ne 1 ] || [ -z "$1" ]; then + echo "usage: $0 INSTALL_PREFIX" >&2 + exit 2 +fi + +install_prefix=$1 +pkg_config_path="$install_prefix/lib/pkgconfig" +library_path="$install_prefix/lib" + +persist_actions_environment() { + if [ -z "${GITHUB_ENV:-}" ]; then + return + fi + + case ":${PKG_CONFIG_PATH:-}:" in + *":$pkg_config_path:"*) resolved_pkg_config_path=${PKG_CONFIG_PATH:-} ;; + *) resolved_pkg_config_path="$pkg_config_path${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" ;; + esac + case ":${LD_LIBRARY_PATH:-}:" in + *":$library_path:"*) resolved_library_path=${LD_LIBRARY_PATH:-} ;; + *) resolved_library_path="$library_path${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" ;; + esac + + printf 'PKG_CONFIG_PATH=%s\n' "$resolved_pkg_config_path" >>"$GITHUB_ENV" + printf 'LD_LIBRARY_PATH=%s\n' "$resolved_library_path" >>"$GITHUB_ENV" +} + +if [ -f "$pkg_config_path/libopenjp2.pc" ] && + PKG_CONFIG_PATH="$pkg_config_path" pkg-config --exact-version "$OPENJPEG_VERSION" libopenjp2 +then + persist_actions_environment + exit 0 +fi + +work_dir=$(mktemp -d "${TMPDIR:-/tmp}/metacrate-openjpeg.XXXXXX") +trap 'rm -rf "$work_dir"' EXIT HUP INT TERM + +source_dir="$work_dir/source" +build_dir="$work_dir/build" + +git clone --branch "v$OPENJPEG_VERSION" --depth 1 \ + https://github.com/uclouvain/openjpeg.git "$source_dir" + +actual_commit=$(git -C "$source_dir" rev-parse HEAD) +if [ "$actual_commit" != "$OPENJPEG_COMMIT" ]; then + echo "OpenJPEG v$OPENJPEG_VERSION resolved to unexpected commit $actual_commit" >&2 + exit 1 +fi + +cmake -S "$source_dir" -B "$build_dir" \ + -DBUILD_CODEC=OFF \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_TESTING=OFF \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_INSTALL_PREFIX="$install_prefix" +cmake --build "$build_dir" --parallel +cmake --install "$build_dir" + +PKG_CONFIG_PATH="$pkg_config_path" pkg-config --exact-version "$OPENJPEG_VERSION" libopenjp2 +persist_actions_environment