github: improve CI build
authorÁlvaro Fernández Rojas <[email protected]>
Sun, 12 Oct 2025 18:55:48 +0000 (20:55 +0200)
committerÁlvaro Fernández Rojas <[email protected]>
Tue, 21 Oct 2025 13:05:25 +0000 (15:05 +0200)
Add Github CI supporting different architectures and libubox build options.
Add summary with binary sizes.
Upload binaries as artifacts.
Add OpenWrt formalities.

Signed-off-by: Álvaro Fernández Rojas <[email protected]>
.github/workflows/build-libubox.yml [deleted file]
.github/workflows/ci.yml [new file with mode: 0644]
.github/workflows/formal.yml [new file with mode: 0644]
.github/workflows/scripts/ci_helpers.sh [new file with mode: 0644]

diff --git a/.github/workflows/build-libubox.yml b/.github/workflows/build-libubox.yml
deleted file mode 100644 (file)
index e45287a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-name: Build libubox
-
-on:
-  push:
-  pull_request:
-
-jobs:
-  build-backports:
-    name: Build libubox
-    runs-on: ubuntu-latest
-
-    steps:
-      - name: Install Dependencies
-        run: |
-          sudo apt update && sudo apt install cmake make gcc pkg-config python3 libjson-c-dev lua5.1 liblua5.1-0-dev
-
-      - name: Checkout
-        uses: actions/checkout@v4
-
-      - name: Install libubox
-        run: |
-          cmake -DBUILD_EXAMPLES=OFF -DUNIT_TESTING=ON
-          make
-          sudo make install
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644 (file)
index 0000000..208ad2d
--- /dev/null
@@ -0,0 +1,158 @@
+name: libubox
+
+on:
+  push:
+  pull_request:
+
+env:
+  LUA_VERSION: 5.1.5
+
+jobs:
+  build:
+    name: Build ${{ matrix.arch }}
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - arch: aarch64
+            gcc: /usr/bin/aarch64-linux-gnu-gcc
+            packages: gcc-aarch64-linux-gnu
+          - arch: arm
+            gcc: /usr/bin/arm-linux-gnueabi-gcc
+            packages: gcc-arm-linux-gnueabi
+          - arch: mips
+            gcc: /usr/bin/mips-linux-gnu-gcc
+            packages: gcc-mips-linux-gnu
+          - arch: x86_64
+            gcc: /usr/bin/x86_64-linux-gnu-gcc
+            packages: gcc-x86-64-linux-gnu
+    outputs:
+      size-aarch64-basic-a: ${{ steps.basic.outputs.size_aarch64_a }}
+      size-aarch64-basic-so: ${{ steps.basic.outputs.size_aarch64_so }}
+      size-aarch64-full-a: ${{ steps.full.outputs.size_aarch64_a }}
+      size-aarch64-full-so: ${{ steps.full.outputs.size_aarch64_so }}
+      size-arm-basic-a: ${{ steps.basic.outputs.size_arm_a }}
+      size-arm-basic-so: ${{ steps.basic.outputs.size_arm_so }}
+      size-arm-full-a: ${{ steps.full.outputs.size_arm_a }}
+      size-arm-full-so: ${{ steps.full.outputs.size_arm_so }}
+      size-mips-basic-a: ${{ steps.basic.outputs.size_mips_a }}
+      size-mips-basic-so: ${{ steps.basic.outputs.size_mips_so }}
+      size-mips-full-a: ${{ steps.full.outputs.size_mips_a }}
+      size-mips-full-so: ${{ steps.full.outputs.size_mips_so }}
+      size-x86_64-basic-a: ${{ steps.basic.outputs.size_x86_64_a }}
+      size-x86_64-basic-so: ${{ steps.basic.outputs.size_x86_64_so }}
+      size-x86_64-full-a: ${{ steps.full.outputs.size_x86_64_a }}
+      size-x86_64-full-so: ${{ steps.full.outputs.size_x86_64_so }}
+    steps:
+      - name: Checkout libubox
+        uses: actions/checkout@v5
+
+      - name: Checkout json-c
+        uses: actions/checkout@v5
+        with:
+          repository: json-c/json-c
+          path: depends/json-c
+
+      - name: Install dependencies
+        run: |
+          sudo apt install ${{ matrix.packages }}
+
+      - name: Prepare build
+        run: |
+          mkdir -p ${GITHUB_WORKSPACE}/build
+
+      - name: Build json-c
+        working-directory: depends/json-c
+        run: |
+          cmake \
+            -DCMAKE_C_COMPILER=${{ matrix.gcc }} \
+            -DCMAKE_PREFIX_PATH=${GITHUB_WORKSPACE}/build \
+            -DBUILD_SHARED_LIBS=OFF -DDISABLE_EXTRA_LIBS=ON  \
+            --install-prefix ${GITHUB_WORKSPACE}/build
+          make
+          make install
+
+      - name: Build lua
+        run: |
+          mkdir -p depends/lua
+          wget -qO- https://www.lua.org/ftp/lua-${{ env.LUA_VERSION }}.tar.gz | \
+            tar zxvf - -C depends/lua --strip-components=1
+          sed -i '/#define LUA_USE_READLINE/d' depends/lua/src/luaconf.h
+          sed -i 's/ -lreadline -lhistory -lncurses//g' depends/lua/src/Makefile
+          make -C depends/lua linux install \
+            CC=${{ matrix.gcc }} \
+            INSTALL_TOP=${GITHUB_WORKSPACE}/build
+
+      - id: basic
+        name: Build libubox (basic)
+        env:
+          BUILD_DIR: build/libubox-basic
+        run: |
+          cmake \
+            -DCMAKE_C_COMPILER=${{ matrix.gcc }} \
+            -DCMAKE_PREFIX_PATH=${GITHUB_WORKSPACE}/build \
+            -DBUILD_LUA=OFF -DBUILD_EXAMPLES=OFF \
+            -B $BUILD_DIR
+          make -C $BUILD_DIR
+          echo "size_${{ matrix.arch }}_a=$( find $BUILD_DIR -type f -name libubox.a -printf '%s' )" >> $GITHUB_OUTPUT
+          echo "size_${{ matrix.arch }}_so=$( find $BUILD_DIR -type f -name libubox.so -printf '%s' )" >> $GITHUB_OUTPUT
+
+      - id: full
+        name: Build libubox (full)
+        env:
+          BUILD_DIR: build/libubox-full
+        run: |
+          cmake \
+            -DCMAKE_C_COMPILER=${{ matrix.gcc }} \
+            -DCMAKE_PREFIX_PATH=${GITHUB_WORKSPACE}/build \
+            -DBUILD_LUA=ON -DBUILD_EXAMPLES=ON \
+            -DLUAPATH=${GITHUB_WORKSPACE}/build/lib/lua \
+            -B $BUILD_DIR
+          make -C $BUILD_DIR
+          echo "size_${{ matrix.arch }}_a=$( find $BUILD_DIR -type f -name libubox.a -printf '%s' )" >> $GITHUB_OUTPUT
+          echo "size_${{ matrix.arch }}_so=$( find $BUILD_DIR -type f -name libubox.so -printf '%s' )" >> $GITHUB_OUTPUT
+
+      - name: Upload binaries
+        uses: actions/upload-artifact@v4
+        with:
+          name: libubox-${{ matrix.arch }}-binaries
+          path: |
+            build/libubox-*/libubox.a
+            build/libubox-*/libubox.so
+          if-no-files-found: error
+
+  summary:
+    name: Sizes
+    needs: [build]
+    runs-on: ubuntu-latest
+    steps:
+      - name: Sizes summary
+        env:
+          size_aarch64_basic_a: ${{needs.build.outputs.size-aarch64-basic-a}}
+          size_aarch64_basic_so: ${{needs.build.outputs.size-aarch64-basic-so}}
+          size_aarch64_full_a: ${{needs.build.outputs.size-aarch64-full-a}}
+          size_aarch64_full_so: ${{needs.build.outputs.size-aarch64-full-so}}
+          size_arm_basic_a: ${{needs.build.outputs.size-arm-basic-a}}
+          size_arm_basic_so: ${{needs.build.outputs.size-arm-basic-so}}
+          size_arm_full_a: ${{needs.build.outputs.size-arm-full-a}}
+          size_arm_full_so: ${{needs.build.outputs.size-arm-full-so}}
+          size_mips_basic_a: ${{needs.build.outputs.size-mips-basic-a}}
+          size_mips_basic_so: ${{needs.build.outputs.size-mips-basic-so}}
+          size_mips_full_a: ${{needs.build.outputs.size-mips-full-a}}
+          size_mips_full_so: ${{needs.build.outputs.size-mips-full-so}}
+          size_x86_64_basic_a: ${{needs.build.outputs.size-x86_64-basic-a}}
+          size_x86_64_basic_so: ${{needs.build.outputs.size-x86_64-basic-so}}
+          size_x86_64_full_a: ${{needs.build.outputs.size-x86_64-full-a}}
+          size_x86_64_full_so: ${{needs.build.outputs.size-x86_64-full-so}}
+        run: |
+          echo "### ${GITHUB_WORKFLOW} sizes :floppy_disk:" >> $GITHUB_STEP_SUMMARY
+          echo "| libubox.a | aarch64 | arm | mips | x86_64 |" >> $GITHUB_STEP_SUMMARY
+          echo "| :---: | :---: | :---: | :---: | :---: |" >> $GITHUB_STEP_SUMMARY
+          echo "| basic | ${size_aarch64_basic_a} | ${size_arm_basic_a} | ${size_mips_basic_a} | ${size_x86_64_basic_a} |" >> $GITHUB_STEP_SUMMARY
+          echo "| full | ${size_aarch64_full_a} | ${size_arm_full_a} | ${size_mips_full_a} | ${size_x86_64_full_a} |" >> $GITHUB_STEP_SUMMARY
+          echo "" >> $GITHUB_STEP_SUMMARY
+          echo "| libubox.so | aarch64 | arm | mips | x86_64 |" >> $GITHUB_STEP_SUMMARY
+          echo "| :---: | :---: | :---: | :---: | :---: |" >> $GITHUB_STEP_SUMMARY
+          echo "| basic | ${size_aarch64_basic_so} | ${size_arm_basic_so} | ${size_mips_basic_so} | ${size_x86_64_basic_so} |" >> $GITHUB_STEP_SUMMARY
+          echo "| full | ${size_aarch64_full_so} | ${size_arm_full_so} | ${size_mips_full_so} | ${size_x86_64_full_so} |" >> $GITHUB_STEP_SUMMARY
diff --git a/.github/workflows/formal.yml b/.github/workflows/formal.yml
new file mode 100644 (file)
index 0000000..081129d
--- /dev/null
@@ -0,0 +1,12 @@
+name: Test Formalities
+
+on:
+  pull_request:
+
+permissions:
+  contents: read
+
+jobs:
+  build:
+    name: Test Formalities
+    uses: openwrt/actions-shared-workflows/.github/workflows/formal.yml@main
diff --git a/.github/workflows/scripts/ci_helpers.sh b/.github/workflows/scripts/ci_helpers.sh
new file mode 100644 (file)
index 0000000..2f9daf8
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+color_out() {
+       printf "\e[0;$1m%s\e[0;0m\n" "$2"
+}
+
+success() {
+       color_out 32 "$1"
+}
+
+info() {
+       color_out 36 "$1"
+}
+
+err() {
+       color_out 31 "$1"
+}
+
+warn() {
+       color_out 33 "$1"
+}
+
+err_die() {
+       err "$1"
+       exit 1
+}