|
1 | 1 | #!/usr/bin/env bash |
2 | 2 | # Build the extension and run the test suite. |
3 | | -# Expected to run inside a datadog/dd-appsec-php-ci container from the repo root. |
| 3 | +# Expected to run inside a php-minimal (Alpine) container or Ubuntu from the repo root. |
| 4 | +# Env vars: |
| 5 | +# LIBARCHIVE_VERSION "system" (default) or a version tag like "v3.7.0". |
| 6 | +# "system" installs the distro package; a version tag |
| 7 | +# builds libarchive from source into .libarchive-cache/ |
| 8 | +# inside the workspace (cached by the CI workflow). |
4 | 9 | set -euo pipefail |
5 | 10 |
|
6 | | -# Install libarchive development headers if not already present. |
7 | | -if ! pkg-config --exists libarchive 2>/dev/null; then |
8 | | - apt-get update -qq |
9 | | - apt-get install -y -qq libarchive-dev |
| 11 | +LIBARCHIVE_VERSION="${LIBARCHIVE_VERSION:-system}" |
| 12 | + |
| 13 | +# ── Install / build libarchive ──────────────────────────────────────────────── |
| 14 | + |
| 15 | +if [ "$LIBARCHIVE_VERSION" = "system" ]; then |
| 16 | + if command -v apk >/dev/null 2>&1; then |
| 17 | + apk add --no-cache libarchive-dev |
| 18 | + else |
| 19 | + # Non-root Ubuntu runner: use sudo. |
| 20 | + _sudo="" |
| 21 | + [ "$(id -u)" != "0" ] && _sudo="sudo" |
| 22 | + $_sudo apt-get update -qq |
| 23 | + $_sudo apt-get install -y -qq libarchive-dev |
| 24 | + fi |
| 25 | + CONFIGURE_LIBARCHIVE="--with-libarchive" |
| 26 | +else |
| 27 | + # Build libarchive from source at the requested version. |
| 28 | + # The workflow caches ${GITHUB_WORKSPACE}/.libarchive-cache so subsequent |
| 29 | + # runs restore it and skip the build. |
| 30 | + LA_VERSION_NUM="${LIBARCHIVE_VERSION#v}" |
| 31 | + LA_PREFIX="${GITHUB_WORKSPACE}/.libarchive-cache" |
| 32 | + |
| 33 | + if [ ! -f "${LA_PREFIX}/lib/libarchive.so" ] && [ ! -f "${LA_PREFIX}/lib/libarchive.a" ]; then |
| 34 | + if command -v apk >/dev/null 2>&1; then |
| 35 | + apk add --no-cache cmake build-base curl zlib-dev bzip2-dev xz-dev zstd-dev lz4-dev openssl-dev |
| 36 | + else |
| 37 | + _sudo="" |
| 38 | + [ "$(id -u)" != "0" ] && _sudo="sudo" |
| 39 | + $_sudo apt-get update -qq |
| 40 | + $_sudo apt-get install -y -qq cmake build-essential curl zlib1g-dev libbz2-dev liblzma-dev libzstd-dev liblz4-dev libssl-dev |
| 41 | + fi |
| 42 | + |
| 43 | + BUILD_DIR="$(mktemp -d)" |
| 44 | + curl -fsSL "https://github.com/libarchive/libarchive/releases/download/${LIBARCHIVE_VERSION}/libarchive-${LA_VERSION_NUM}.tar.gz" \ |
| 45 | + | tar xz -C "$BUILD_DIR" |
| 46 | + cmake -S "${BUILD_DIR}/libarchive-${LA_VERSION_NUM}" \ |
| 47 | + -B "${BUILD_DIR}/build" \ |
| 48 | + -DCMAKE_INSTALL_PREFIX="${LA_PREFIX}" \ |
| 49 | + -DCMAKE_BUILD_TYPE=Release \ |
| 50 | + -DENABLE_TEST=OFF |
| 51 | + cmake --build "${BUILD_DIR}/build" -j"$(nproc)" |
| 52 | + cmake --install "${BUILD_DIR}/build" |
| 53 | + rm -rf "$BUILD_DIR" |
| 54 | + fi |
| 55 | + |
| 56 | + export LD_LIBRARY_PATH="${LA_PREFIX}/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" |
| 57 | + CONFIGURE_LIBARCHIVE="--with-libarchive=${LA_PREFIX}" |
10 | 58 | fi |
11 | 59 |
|
12 | | -# Clean up artifacts from any previous build so stale objects don't survive a |
13 | | -# PHP-version switch (safe in CI where the workspace is always fresh). |
| 60 | +# ── Build ───────────────────────────────────────────────────────────────────── |
| 61 | + |
| 62 | +# Clean up all generated files so stale objects from a previous PHP version or |
| 63 | +# build variant don't silently survive into this build. |
14 | 64 | if [ -f Makefile ]; then |
15 | 65 | make -f Makefile distclean |
16 | 66 | fi |
| 67 | +# Remove any leftover object files even if Makefile is gone. |
| 68 | +find . -name '*.lo' -o -name '*.o' | xargs rm -f 2>/dev/null || true |
| 69 | +find . -name '.libs' -type d | xargs rm -rf 2>/dev/null || true |
17 | 70 |
|
18 | 71 | phpize |
19 | | -./configure --with-php-config="$(which php-config)" --with-libarchive |
| 72 | +./configure --with-php-config="$(which php-config)" "$CONFIGURE_LIBARCHIVE" |
20 | 73 | make -f Makefile -j"$(nproc)" |
21 | 74 |
|
| 75 | +# ── Test ────────────────────────────────────────────────────────────────────── |
| 76 | + |
22 | 77 | # The generated Makefile silences and ignores errors on the `if` commands; |
23 | 78 | # undo that so test failures surface properly. |
24 | 79 | sed -i 's/-@if/@if/' Makefile |
|
0 commit comments