name: Build and run tests on: pull_request: branches: - master push: branches: - master jobs: pre_job: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: paths_ignore: '["**/README.md", "docs/**", "guidelines/**"]' # cancel previous builds if a new commit is pushed cancel_others: 'true' # only run on push *or* pull_request, not both concurrent_skipping: 'same_content_newer' test-compile: name: Compiler testing runs-on: ${{ matrix.os }} needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' env: CC: ${{ matrix.compiler }} CXX: ${{ matrix.compiler }} CXXSTD: ${{ matrix.cpp_std }} strategy: matrix: os: - ubuntu-20.04 compiler: - 'clang-12' - 'gcc-11' cpp_std: - 'c++11' - 'c++14' - 'c++17' - 'c++20' include: # Add os_name - os: ubuntu-20.04 os_name: focal # macOS builds - os: macos-13 compiler: 'clang' cpp_std: 'c++11' - os: macos-13 compiler: 'clang' cpp_std: 'c++17' # Limited testing for older compilers - os: ubuntu-20.04 os_name: focal compiler: 'clang-11' cpp_std: 'c++11' - os: ubuntu-20.04 os_name: focal compiler: 'gcc-10' cpp_std: 'c++11' fail-fast: false steps: - name: Install Linux Dependencies if: runner.os == 'Linux' shell: bash run: | sudo apt-get update sudo apt-get install gperf build-essential bison flex libreadline-dev gawk tcl-dev libffi-dev git graphviz xdot pkg-config python python3 libboost-system-dev libboost-python-dev libboost-filesystem-dev zlib1g-dev - name: Install macOS Dependencies if: runner.os == 'macOS' run: | brew install bison flex gawk libffi pkg-config bash - name: Setup GCC if: startsWith(matrix.compiler, 'gcc') shell: bash run: | CXX=${CC/#gcc/g++} sudo apt-add-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install $CC $CXX echo "CXX=$CXX" >> $GITHUB_ENV echo "CXXFLAGS=-Wp,-D_GLIBCXX_ASSERTIONS" >> $GITHUB_ENV - name: Setup Clang if: startsWith(matrix.compiler, 'clang') && (matrix.compiler != 'clang') shell: bash run: | wget https://apt.llvm.org/llvm-snapshot.gpg.key sudo apt-key add llvm-snapshot.gpg.key rm llvm-snapshot.gpg.key sudo apt-add-repository "deb https://apt.llvm.org/${{ matrix.os_name }}/ llvm-toolchain-${{ matrix.os_name }} main" sudo apt-get update CXX=${CC/#clang/clang++} sudo apt-get install $CC $CXX echo "CXX=$CXX" >> $GITHUB_ENV - name: Linux runtime environment if: runner.os == 'Linux' shell: bash run: | echo "${{ github.workspace }}/.local/bin" >> $GITHUB_PATH echo "procs=$(nproc)" >> $GITHUB_ENV - name: macOS runtime environment if: runner.os == 'macOS' shell: bash run: | echo "${{ github.workspace }}/.local/bin" >> $GITHUB_PATH echo "$(brew --prefix bison)/bin" >> $GITHUB_PATH echo "$(brew --prefix flex)/bin" >> $GITHUB_PATH echo "procs=$(sysctl -n hw.ncpu)" >> $GITHUB_ENV - name: Tool versions shell: bash run: | $CC --version $CXX --version - name: Checkout Yosys uses: actions/checkout@v4 with: submodules: true - name: Build shell: bash run: | make config-${CC%%-*} make -j$procs CXXSTD=$CXXSTD CC=$CC CXX=$CXX LD=$CC build-yosys: name: Reusable build runs-on: ${{ matrix.os }} env: CC: clang strategy: matrix: os: [ubuntu-20.04, macos-13] fail-fast: false steps: - name: Install Linux Dependencies if: runner.os == 'Linux' shell: bash run: | sudo apt-get update sudo apt-get install gperf build-essential bison flex libreadline-dev gawk tcl-dev libffi-dev git graphviz xdot pkg-config python python3 libboost-system-dev libboost-python-dev libboost-filesystem-dev zlib1g-dev - name: Install macOS Dependencies if: runner.os == 'macOS' run: | brew install bison flex gawk libffi pkg-config bash - name: Linux runtime environment if: runner.os == 'Linux' shell: bash run: | echo "${{ github.workspace }}/.local/bin" >> $GITHUB_PATH echo "procs=$(nproc)" >> $GITHUB_ENV - name: macOS runtime environment if: runner.os == 'macOS' shell: bash run: | echo "${{ github.workspace }}/.local/bin" >> $GITHUB_PATH echo "$(brew --prefix bison)/bin" >> $GITHUB_PATH echo "$(brew --prefix flex)/bin" >> $GITHUB_PATH echo "procs=$(sysctl -n hw.ncpu)" >> $GITHUB_ENV - name: Checkout Yosys uses: actions/checkout@v4 - name: Build shell: bash run: | mkdir build cd build make -f ../Makefile config-$CC make -f ../Makefile -j$procs - name: Log yosys-config output run: | ./yosys-config || true - name: Log yosys-config output run: | ./yosys-config || true - name: Compress build shell: bash run: | cd build tar -cvf ../build.tar share/ yosys yosys-* - name: Store build artifact uses: actions/upload-artifact@v4 with: name: build-${{ matrix.os }} path: build.tar retention-days: 1 test-yosys: name: Run tests needs: build-yosys runs-on: ${{ matrix.os }} env: CC: clang strategy: matrix: os: [ubuntu-20.04, macos-13] steps: - name: Install Linux Dependencies if: runner.os == 'Linux' shell: bash run: | sudo apt-get update sudo apt-get install gperf build-essential bison flex libreadline-dev gawk tcl-dev libffi-dev git graphviz xdot pkg-config python python3 libboost-system-dev libboost-python-dev libboost-filesystem-dev zlib1g-dev - name: Install macOS Dependencies if: runner.os == 'macOS' run: | brew install bison flex gawk libffi pkg-config bash - name: Linux runtime environment if: runner.os == 'Linux' shell: bash run: | echo "${{ github.workspace }}/.local/bin" >> $GITHUB_PATH echo "procs=$(nproc)" >> $GITHUB_ENV - name: macOS runtime environment if: runner.os == 'macOS' shell: bash run: | echo "${{ github.workspace }}/.local/bin" >> $GITHUB_PATH echo "$(brew --prefix bison)/bin" >> $GITHUB_PATH echo "$(brew --prefix flex)/bin" >> $GITHUB_PATH echo "procs=$(sysctl -n hw.ncpu)" >> $GITHUB_ENV - name: Checkout Yosys uses: actions/checkout@v4 - name: Get iverilog shell: bash run: | git clone https://github.com/steveicarus/iverilog.git cd iverilog git checkout 192b6aec96fde982e6ddcb28b346d5893aa8e874 echo "IVERILOG_GIT=$(git rev-parse HEAD)" >> $GITHUB_ENV - name: Cache iverilog id: cache-iverilog uses: actions/cache@v4 with: path: .local/ key: ${{ matrix.os }}-${{ env.IVERILOG_GIT }} - name: Build iverilog if: steps.cache-iverilog.outputs.cache-hit != 'true' shell: bash run: | mkdir -p ${{ github.workspace }}/.local/ cd iverilog autoconf CC=gcc CXX=g++ ./configure --prefix=${{ github.workspace }}/.local make -j$procs make install - name: Download build artifact uses: actions/download-artifact@v4 with: name: build-${{ matrix.os }} - name: Uncompress build shell: bash run: tar -xvf build.tar - name: Run tests shell: bash run: | make -j$procs test TARGETS= EXTRA_TARGETS= CONFIG=$CC - name: Report errors if: ${{ failure() }} shell: bash run: | find tests/**/*.err -print -exec cat {} \;