1name: build
2
3on: [push, pull_request]
4
5jobs:
6  build:
7    runs-on: ${{ matrix.os }}
8
9    strategy:
10      matrix:
11        os: [ubuntu-20.04, macos-10.15]
12        compiler: [gcc, clang]
13        buildtool: [autotools, cmake]
14        openssl: [openssl1, openssl3]
15
16    steps:
17    - uses: actions/checkout@v2
18    - name: Linux setup
19      if: runner.os == 'Linux'
20      run: |
21        sudo apt-get install \
22          g++-10 \
23          clang-10 \
24          autoconf \
25          automake \
26          autotools-dev \
27          libtool \
28          pkg-config \
29          libcunit1-dev \
30          libssl-dev \
31          libev-dev \
32          cmake \
33          cmake-data
34    - name: MacOS setup
35      if: runner.os == 'macOS'
36      run: |
37        brew install libev cunit autoconf automake pkg-config libtool
38    - name: Setup clang (Linux)
39      if: runner.os == 'Linux' && matrix.compiler == 'clang'
40      run: |
41        echo 'CC=clang-10' >> $GITHUB_ENV
42        echo 'CXX=clang++-10' >> $GITHUB_ENV
43    - name: Setup clang (MacOS)
44      if: runner.os == 'macOS' && matrix.compiler == 'clang'
45      run: |
46        echo 'CC=clang' >> $GITHUB_ENV
47        echo 'CXX=clang++' >> $GITHUB_ENV
48    - name: Setup gcc
49      if: runner.os == 'Linux' && matrix.compiler == 'gcc'
50      run: |
51        echo 'CC=gcc-10' >> $GITHUB_ENV
52        echo 'CXX=g++-10' >> $GITHUB_ENV
53    - name: Build OpenSSL v1.1.1
54      if: matrix.openssl == 'openssl1'
55      run: |
56        ./ci/build_openssl1.sh
57    - name: Build OpenSSL v3.0.0
58      if: matrix.openssl == 'openssl3'
59      run: |
60        ./ci/build_openssl3.sh
61    - name: Build GnuTLS
62      run: |
63        ./ci/build_gnutls.sh
64    - name: Build BoringSSL
65      run: |
66        ./ci/build_boringssl.sh
67    - name: Build nghttp3
68      run: |
69        ./ci/build_nghttp3.sh
70    - name: Setup environment variables
71      run: |
72        PKG_CONFIG_PATH="$PWD/openssl/build/lib/pkgconfig:$PWD/openssl/build/lib64/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/gnutls-3.7.2/build/lib/pkgconfig:$PWD/nettle-3.6/build/lib64/pkgconfig"
73        LDFLAGS="$EXTRA_LDFLAGS -Wl,-rpath,$PWD/openssl/build/lib -Wl,-rpath,$PWD/openssl/build/lib64 -Wl,-rpath,$PWD/nettle-3.6/build/lib64"
74        BORINGSSL_CFLAGS="-I$PWD/boringssl/include/"
75        BORINGSSL_LIBS="-L$PWD/boringssl/build/ssl -lssl -L$PWD/boringssl/build/crypto -lcrypto"
76
77        echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV
78        echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
79        echo 'BORINGSSL_CFLAGS='"$BORINGSSL_CFLAGS" >> $GITHUB_ENV
80        echo 'BORINGSSL_LIBS='"$BORINGSSL_LIBS" >> $GITHUB_ENV
81    - name: Enable ASAN
82      if: runner.os == 'Linux'
83      run: |
84        asanflags="-fsanitize=address,undefined -fno-sanitize-recover=undefined"
85
86        LDFLAGS="$LDFLAGS $asanflags"
87        CFLAGS="$CFLAGS $asanflags -g3"
88        CXXFLAGS="$CXXFLAGS $asanflags -g3"
89
90        echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
91        echo 'CFLAGS='"$CFLAGS" >> $GITHUB_ENV
92        echo 'CXXFLAGS='"$CXXFLAGS" >> $GITHUB_ENV
93    - name: BoringSSL pthread requirement
94      if: runner.os == 'Linux'
95      run: |
96        BORINGSSL_LIBS="$BORINGSSL_LIBS -pthread"
97
98        echo 'BORINGSSL_LIBS='"$BORINGSSL_LIBS" >> $GITHUB_ENV
99    - name: Configure autotools
100      if: matrix.buildtool == 'autotools'
101      run: |
102        autoreconf -i && \
103        ./configure --enable-werror \
104          --with-openssl --with-gnutls --with-boringssl
105    - name: Configure cmake
106      if: matrix.buildtool == 'cmake'
107      run: |
108        cmake $CMAKE_OPTS \
109          -DBORINGSSL_LIBRARIES="$BORINGSSL_LIBS" \
110          -DBORINGSSL_INCLUDE_DIR="$PWD/boringssl/include/" .
111    - name: Build ngtcp2
112      run: |
113        make
114        make check
115    - name: Integration test
116      run: |
117        ./ci/gen-certificate.sh
118        NETTLE_PATH=$PWD/nettle-3.6/build/lib64
119        for client in client gtlsclient bsslclient; do
120          for server in server gtlsserver bsslserver; do
121            echo "# $client - $server"
122            LD_LIBRARY_PATH=$NETTLE_PATH ./examples/$server localhost 4433 cert/server.key cert/server.crt &
123            LD_LIBRARY_PATH=$NETTLE_PATH ./examples/$client localhost 4433 https://localhost/ --exit-on-first-stream-close
124            killall -INT $server
125            sleep 1
126          done
127        done
128
129  build-windows:
130    runs-on: windows-latest
131
132    steps:
133    - uses: actions/checkout@v2
134    - name: Configure cmake
135      run: |
136        mkdir build
137        cd build
138        cmake ..
139    - name: Build ngtcp2
140      run: |
141        cmake --build build
142