aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/ci.yml
blob: 95fa5af6d964cfc4240c4f3b57757890b6d2b794 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# SPDX-License-Identifier: 0BSD

#############################################################################
#
# Author: Jia Tan
#
#############################################################################

name: CI

on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

  # Allows running workflow manually
  workflow_dispatch:

jobs:
  POSIX:
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        build_system: [autotools, cmake]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 #v4.1.0

      ########################
      # Install Dependencies #
      ########################

      # Install Autotools on Linux
      - name: Install Dependencies
        if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'autotools' }}
        run: |
            sudo apt-get update
            sudo apt-get install -y autoconf automake build-essential po4a autopoint gcc-multilib doxygen musl-tools

      # Install Autotools on Mac
      - name: Install Dependencies
        if: ${{ matrix.os == 'macos-latest' && matrix.build_system == 'autotools' }}
        run: brew install autoconf automake libtool po4a doxygen

      # Install CMake on Linux
      - name: Install Dependencies
        if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'cmake' }}
        run: |
            sudo apt-get update
            sudo apt-get install -y build-essential cmake musl-tools

      # Install CMake on Mac
      - name: Install Dependencies
        if: ${{ matrix.os == 'macos-latest' && matrix.build_system == 'cmake' }}
        run: brew install cmake

      ##################
      # Build and Test #
      ##################

      # -b specifies the build system to use.
      # -p specifies the phase (build or test) to help narrow down an error
      #    if one occurs.
      #
      # The first two builds/tests are only run on Autotools Linux and
      # affect the CFLAGS. Resetting the CFLAGS requires clearing the
      # config cache between runs, so the tests that require CFLAGS are
      # done first.
      - name: Build 32-bit
        if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'autotools' }}
        run: ./build-aux/ci_build.sh -b autotools -p build -f "-m32"
      - name: Test 32-bit
        if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'autotools' }}
        run: |
            ./build-aux/ci_build.sh -b autotools -p test -f "-m32" -n 32_bit
            cd ../xz_build && make distclean

      # ifunc must be disabled for this test because __attribute__ ifunc is
      # incompatible with -fsanitize=address.
      #
      # The sandbox must also be disabled because it will prevent access to
      # the /proc/ filesystem on Linux, which is used by the sanitizer's
      # instrumentation.
      - name: Build with -fsanitize=address,undefined
        if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'autotools' }}
        run: ./build-aux/ci_build.sh -b autotools -p build -f "-fsanitize=address,undefined" -d ifunc,sandbox
      - name: Test with -fsanitize=address,undefined
        if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'autotools' }}
        run: |
            ./build-aux/ci_build.sh -b autotools -p test -f "-fsanitize=address,undefined" -d ifunc,sandbox
            cd ../xz_build && make distclean

      # musl libc has some slight differences compared to glibc, including
      # the lack of ifunc support. This tests if the ifunc detection
      # functions properly since musl-gcc can compile with ifunc support,
      # but will fail at runtime.
      - name: Build with musl libc
        if: ${{ matrix.os == 'ubuntu-latest'}}
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -p build -m "/usr/bin/musl-gcc"
      - name: Test with musl libc
        if: ${{ matrix.os == 'ubuntu-latest'}}
        run: |
            ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -p test -m "/usr/bin/musl-gcc"
      - name: Clean up musl libc run
        if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'autotools' }}
        run: cd ../xz_build && make distclean

      - name: Build with full features
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -p build
      - name: Test with full features
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -p test -n full_features

      - name: Build without encoders
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d encoders,shared -p build
      - name: Test without encoders
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d encoders,shared -p test -n no_encoders

      - name: Build without decoders
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d decoders,shared -p build
      - name: Test without decoders
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d decoders,shared -p test -n no_decoders

      - name: Build without threads
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d threads,shared -p build
      - name: Test without threads
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d threads,shared -p test -n no_threads

      - name: Build without BCJ filters
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d bcj,shared,nls -p build
      - name: Test without BCJ filters
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d bcj,shared,nls -p test -n no_bcj

      - name: Build without Delta filters
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d delta,shared,nls -p build
      - name: Test without Delta filters
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d delta,shared,nls -p test -n no_delta

      - name: Build without sha256 check
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -c crc32,crc64 -d shared,nls -p build
      - name: Test without sha256 check
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -c crc32,crc64 -d shared,nls -p test -n no_sha256

      - name: Build without crc64 check
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -c crc32,sha256 -d shared,nls -p build
      - name: Test without crc64 check
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -c crc32,sha256 -d shared,nls -p test -n no_crc64

      - name: Build small
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d small -p build
      - name: Test small
        run: ./build-aux/ci_build.sh -b ${{ matrix.build_system }} -d small -p test -n small

      # Attempt to upload the test logs as artifacts if any step has failed
      - uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 #v4.0.0
        if: ${{ failure() }}
        with:
          name: ${{ matrix.os }} ${{ matrix.build_system }} Test Logs
          path: build-aux/artifacts