xref: /libuv/.github/workflows/CI-unix.yml (revision d05744e3)
1name: CI-unix
2
3on:
4  pull_request:
5    paths:
6      - '**'
7      - '!docs/**'
8      - '!src/win/**'
9      - '!.**'
10      - '.github/workflows/CI-unix.yml'
11  push:
12    branches:
13      - v[0-9].*
14      - master
15
16jobs:
17  build-linux:
18    runs-on: ubuntu-latest
19    steps:
20      - uses: actions/checkout@v4
21      - name: configure
22        run: |
23          ./autogen.sh
24          mkdir build
25          (cd build && ../configure)
26      - name: distcheck
27        run: |
28          make -C build distcheck
29
30  build-android:
31    runs-on: ubuntu-latest
32    env:
33      ANDROID_AVD_HOME: /root/.android/avd
34    steps:
35      - uses: actions/checkout@v4
36      - name: Envinfo
37        run: npx envinfo
38      - name: Enable KVM
39        run: |
40          echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
41          sudo udevadm control --reload-rules
42          sudo udevadm trigger --name-match=kvm
43      - name: Build and Test
44        uses: reactivecircus/android-emulator-runner@v2
45        with:
46          api-level: 24
47          arch: x86_64
48          target: google_apis
49          ram-size: 2048M
50          emulator-options: -no-audio -no-window -gpu off -no-boot-anim -netdelay none -netspeed full -writable-system -no-snapshot-save -no-snapshot-load -no-snapshot
51          disable-animations: true
52          script: |
53            echo "::group::Configure"
54            cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI="x86_64" -DANDROID_PLATFORM=android-24
55            echo "::endgroup::"
56
57            echo "::group::Build"
58            cmake --build build
59
60            ## Correct some ld bugs that cause problems with libuv tests
61            wget "https://github.com/termux/termux-elf-cleaner/releases/download/v2.2.1/termux-elf-cleaner" -P build
62            chmod a+x build/termux-elf-cleaner
63            build/termux-elf-cleaner --api-level 24 ./build/uv_run_tests
64            build/termux-elf-cleaner --api-level 24 ./build/uv_run_tests_a
65
66            adb shell "su 0 setenforce 0" # to allow some syscalls like link, chmod, etc.
67
68            ## Push the build and test fixtures to the device
69            adb push build /data/local/tmp
70            adb shell mkdir /data/local/tmp/build/test
71            adb push test/fixtures /data/local/tmp/build/test
72            echo "::endgroup::"
73
74            ## Run the tests
75            file build/uv_run_tests_a
76            adb shell "cd /data/local/tmp/build && env UV_TEST_TIMEOUT_MULTIPLIER=5 ./uv_run_tests_a"
77
78  build-macos:
79    runs-on: ${{ matrix.os }}
80    strategy:
81      fail-fast: false
82      matrix:
83        os: [macos-13, macos-14]
84    steps:
85      - uses: actions/checkout@v4
86      - name: Envinfo
87        run: npx envinfo
88      - name: Disable Firewall
89        run: |
90          /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
91          sudo defaults write /Library/Preferences/com.apple.alf globalstate -int 0
92          /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
93      - name: Setup
94        run: |
95          brew install ninja automake libtool
96      - name: Configure
97        run: |
98          mkdir build
99          cd build
100          cmake .. -DBUILD_TESTING=ON -G Ninja
101      - name: Build
102        run: |
103          cmake --build build
104          ls -lh
105      - name: platform_output
106        run: |
107          ./build/uv_run_tests platform_output
108      - name: platform_output_a
109        run: |
110          ./build/uv_run_tests_a platform_output
111      - name: Test
112        run: |
113          cd build && ctest -V
114      - name: Autotools configure
115        if: always()
116        run: |
117          ./autogen.sh
118          mkdir build-auto
119          (cd build-auto && ../configure)
120          make -C build-auto -j4
121
122  build-ios:
123    runs-on: ${{ matrix.os }}
124    strategy:
125      fail-fast: false
126      matrix:
127        os: [macos-13, macos-14]
128    steps:
129      - uses: actions/checkout@v4
130      - name: Configure
131        run: |
132          mkdir build-ios
133          cd build-ios
134          cmake .. -GXcode -DCMAKE_SYSTEM_NAME:STRING=iOS -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED:BOOL=NO -DCMAKE_CONFIGURATION_TYPES:STRING=Release
135      - name: Build
136        run: |
137          cmake --build build-ios
138          ls -lh build-ios
139
140  build-cross-qemu:
141    runs-on: ubuntu-latest
142    name: build-cross-qemu-${{ matrix.config.target }}
143
144    strategy:
145      fail-fast: false
146      matrix:
147        config:
148          - {target: arm,     toolchain: gcc-arm-linux-gnueabi,     cc: arm-linux-gnueabi-gcc,      qemu: qemu-arm-static     }
149          - {target: armhf,   toolchain: gcc-arm-linux-gnueabihf,   cc: arm-linux-gnueabihf-gcc,    qemu: qemu-arm-static     }
150          - {target: aarch64, toolchain: gcc-aarch64-linux-gnu,     cc: aarch64-linux-gnu-gcc,      qemu: qemu-aarch64-static }
151          - {target: riscv64, toolchain: gcc-riscv64-linux-gnu,     cc: riscv64-linux-gnu-gcc,      qemu: qemu-riscv64-static }
152          - {target: ppc,     toolchain: gcc-powerpc-linux-gnu,     cc: powerpc-linux-gnu-gcc,      qemu: qemu-ppc-static     }
153          - {target: ppc64,   toolchain: gcc-powerpc64-linux-gnu,   cc: powerpc64-linux-gnu-gcc,    qemu: qemu-ppc64-static   }
154          - {target: ppc64le, toolchain: gcc-powerpc64le-linux-gnu, cc: powerpc64le-linux-gnu-gcc,  qemu: qemu-ppc64le-static }
155          - {target: s390x,   toolchain: gcc-s390x-linux-gnu,       cc: s390x-linux-gnu-gcc,        qemu: qemu-s390x-static   }
156          - {target: mips,    toolchain: gcc-mips-linux-gnu,          cc: mips-linux-gnu-gcc,         qemu: qemu-mips-static     }
157          - {target: mips64,  toolchain: gcc-mips64-linux-gnuabi64,   cc: mips64-linux-gnuabi64-gcc,  qemu: qemu-mips64-static   }
158          - {target: mipsel,  toolchain: gcc-mipsel-linux-gnu,        cc: mipsel-linux-gnu-gcc,       qemu: qemu-mipsel-static   }
159          - {target: mips64el,toolchain: gcc-mips64el-linux-gnuabi64, cc: mips64el-linux-gnuabi64-gcc,qemu: qemu-mips64el-static }
160          - {target: arm (u64 slots),     toolchain: gcc-arm-linux-gnueabi,     cc: arm-linux-gnueabi-gcc,      qemu: qemu-arm-static}
161          - {target: aarch64 (u64 slots), toolchain: gcc-aarch64-linux-gnu,     cc: aarch64-linux-gnu-gcc,      qemu: qemu-aarch64-static}
162          - {target: ppc (u64 slots),     toolchain: gcc-powerpc-linux-gnu,     cc: powerpc-linux-gnu-gcc,      qemu: qemu-ppc-static}
163          - {target: ppc64 (u64 slots),   toolchain: gcc-powerpc64-linux-gnu,   cc: powerpc64-linux-gnu-gcc,    qemu: qemu-ppc64-static}
164
165    steps:
166      - uses: actions/checkout@v4
167      - name: Install QEMU
168        # this ensure install latest qemu on ubuntu, apt get version is old
169        env:
170          QEMU_SRC: "http://archive.ubuntu.com/ubuntu/pool/universe/q/qemu"
171          QEMU_VER: "qemu-user-static_7\\.2+dfsg-.*_amd64.deb$"
172        run: |
173          DEB=`curl -s $QEMU_SRC/ | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2 | grep $QEMU_VER | tail -1`
174          wget $QEMU_SRC/$DEB
175          sudo dpkg -i $DEB
176      - name: Install ${{ matrix.config.toolchain }}
177        run: |
178          sudo apt update
179          sudo apt install ${{ matrix.config.toolchain }} -y
180      - name: Configure with ${{ matrix.config.cc }}
181        run: |
182          mkdir build
183          cd build
184          cmake .. -DBUILD_TESTING=ON -DQEMU=ON -DCMAKE_C_COMPILER=${{ matrix.config.cc }}
185      - name: Build
186        run: |
187          cmake --build build
188          ls -lh build
189      - name: Test
190        run: |
191          ${{ matrix.config.qemu }} build/uv_run_tests_a
192