name: linux_build # Run CI on push, PR, and weekly. on: push: pull_request: schedule: - cron: "0 0 * * 0 " # weekly # Environment variables env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) BUILD_TYPE: Release MAKEFLAGS: "-j8" DOCKER_REPO: ${{ secrets.DOCKER_REPO }} # (Boolean) Setting this value to True, will force linux tet always IGNORE_DOCKER_TEST: ${{ secrets.IGNORE_DOCKER_TEST }} REPO_OWNER: ${{ github.repository_owner }} # Multiple job to tests jobs: change_detect: name: "Detect code changes" runs-on: ubuntu-18.04 outputs: # this is output as string, see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs source_modified: ${{ steps.changes.outputs.status_code == '1' }} force_upload: false sha_short: ${{ steps.changes.outputs.sha_short }} docker_repo: ${{ steps.changes.outputs.docker_repo }} steps: - name: Cancel previous uses: styfle/cancel-workflow-action@0.9.1 with: access_token: ${{ github.token }} - name: Checkout OpenFPGA repo uses: actions/checkout@v2 with: fetch-depth: 0 submodules: true - name: Check for source code changes id: changes run: | git diff origin/master HEAD --name-status -- . ':!openfpga_flow' ':!docs' if git diff origin/master HEAD --name-status --exit-code -- . ':!openfpga_flow' ':!docs'; then echo "::set-output name=status_code::0" else echo "::set-output name=status_code::$?" fi if [[ (${GITHUB_REF} == 'refs/heads/master') || -n "${IGNORE_DOCKER_TEST}" ]]; then echo "Current branch is master forcing source_modified" echo "::set-output name=status_code::1" fi if [[ -n "${DOCKER_REPO}" ]]; then echo "name=docker_repo::$REPO_OWNER" echo "::set-output name=docker_repo::$REPO_OWNER" else echo "name=docker_repo::lnis-uofu" echo "::set-output name=docker_repo::lnis-uofu" fi echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" # Test the compilation compatibility linux_build: needs: change_detect if: ${{ fromJSON(needs.change_detect.outputs.source_modified) }} name: ${{ matrix.config.name }} runs-on: ubuntu-18.04 # Note: dependencies are installed in the container. See details about dependency list in docker/Dockerfile.master # Comment the line out when base image is built again #container: ghcr.io/${{ needs.change_detect.outputs.docker_repo }}/openfpga-build-${{ matrix.config.cc}} # Branch on different OS and settings strategy: fail-fast: false matrix: config: - name: "Build Compatibility: GCC-7 (Ubuntu 18.04)" cc: gcc-7 cxx: g++-7 - name: "Build Compatibility: GCC-8 (Ubuntu 18.04)" cc: gcc-8 cxx: g++-8 - name: "Build Compatibility: GCC-9 (Ubuntu 18.04)" cc: gcc-9 cxx: g++-9 - name: "Build Compatibility: GCC-10 (Ubuntu 18.04)" cc: gcc-10 cxx: g++-10 - name: "Build Compatibility: GCC-11 (Ubuntu 18.04)" cc: gcc-11 cxx: g++-11 - name: "Build Compatibility: Clang-6 (Ubuntu 18.04)" cc: clang-6.0 cxx: clang++-6.0 - name: "Build Compatibility: Clang-7 (Ubuntu 18.04)" cc: clang-7 cxx: clang++-7 - name: "Build Compatibility: Clang-8 (Ubuntu 18.04)" cc: clang-8 cxx: clang++-8 - name: "Build Compatibility: Clang-10 (Ubuntu 18.04)" cc: clang-10 cxx: clang++-10 # Define the steps to run the build job env: CC: ${{ matrix.config.cc }} CXX: ${{ matrix.config.cxx }} steps: - name: Cancel previous uses: styfle/cancel-workflow-action@0.9.1 with: access_token: ${{ github.token }} - name: Checkout OpenFPGA repo uses: actions/checkout@v2 with: submodules: true - name: Install dependencies run: ./.github/workflows/install_dependencies_build.sh - name: Dump tool versions run: | cmake --version ${CC} --version ${CXX} --version - uses: hendrikmuhs/ccache-action@v1 - name: Build shell: bash run: | make all BUILD_TYPE=$BUILD_TYPE # Check the cache size and see if it is over the limit - name: Check ccache size run: ccache -s - name: Upload artifact uses: actions/upload-artifact@v2 if: ${{ matrix.config.cc == 'gcc-8'}} with: name: openfpga path: | build/vtr-verilog-to-routing/abc/abc build/vtr-verilog-to-routing/abc/libabc.a build/vtr-verilog-to-routing/ace2/ace build/vtr-verilog-to-routing/vpr/libvpr.a build/vtr-verilog-to-routing/vpr/vpr build/openfpga/libopenfpga.a build/openfpga/openfpga yosys/install/share yosys/install/bin openfpga_flow openfpga.sh linux_build_opt: needs: change_detect if: ${{ fromJSON(needs.change_detect.outputs.source_modified) }} name: ${{ matrix.config.name }} runs-on: ubuntu-20.04 # Note: dependencies are installed in the container. See details about dependency list in docker/Dockerfile.master # Comment the line out when base image is built again #container: ghcr.io/${{ needs.change_detect.outputs.docker_repo }}/openfpga-build-${{ matrix.config.cc}} # Branch on different OS and settings strategy: fail-fast: false matrix: config: - name: "Build w/o Yosys (Ubuntu 20.04)" cc: gcc-9 cxx: g++-9 cmake_flags: "-DOPENFPGA_WITH_YOSYS=OFF" - name: "Build w/o Yosys plugin (Ubuntu 20.04)" cc: gcc-9 cxx: g++-9 cmake_flags: "-DOPENFPGA_WITH_YOSYS_PLUGIN=OFF" - name: "Build w/o test (Ubuntu 20.04)" cc: gcc-9 cxx: g++-9 cmake_flags: "-DOPENFPGA_WITH_TEST=OFF" # Define the steps to run the build job env: CC: ${{ matrix.config.cc }} CXX: ${{ matrix.config.cxx }} steps: - name: Cancel previous uses: styfle/cancel-workflow-action@0.9.1 with: access_token: ${{ github.token }} - name: Checkout OpenFPGA repo uses: actions/checkout@v2 with: submodules: true - name: Install dependencies run: ./.github/workflows/install_dependencies_build.sh - name: Dump tool versions run: | cmake --version ${CC} --version ${CXX} --version - uses: hendrikmuhs/ccache-action@v1 - name: Build shell: bash run: | make all BUILD_TYPE=$BUILD_TYPE CMAKE_FLAGS="${{ matrix.config.cmake_flags }}" docker_distribution: name: Build docker image for distribution runs-on: ubuntu-latest needs: [linux_build, change_detect] steps: - name: Cancel previous uses: styfle/cancel-workflow-action@0.9.1 with: access_token: ${{ github.token }} - name: Checkout OpenFPGA repo uses: actions/checkout@v2 - name: Download a built artifacts uses: actions/download-artifact@v2 with: name: openfpga - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to GitHub Container Registry if: ${{ (github.ref == 'refs/heads/master' && (env.DOCKER_REPO)) || (needs.change_detect.outputs.force_upload == true) }} uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.CR_PAT }} - name: Build and push master image uses: docker/build-push-action@v2 with: context: . file: ./docker/Dockerfile.master push: ${{ (github.ref == 'refs/heads/master' && (env.DOCKER_REPO)) || needs.change_detect.outputs.force_upload }} tags: | ghcr.io/${{ needs.change_detect.outputs.docker_repo }}/openfpga-master:latest ghcr.io/${{ needs.change_detect.outputs.docker_repo }}/openfpga-master:${{ needs.change_detect.outputs.sha_short }} linux_regression_tests: name: linux_regression_tests runs-on: ubuntu-18.04 needs: [linux_build, change_detect] container: ghcr.io/${{ needs.change_detect.outputs.docker_repo }}/openfpga-env strategy: fail-fast: false matrix: config: - name: basic_reg_yosys_only_test - name: basic_reg_test - name: fpga_verilog_reg_test - name: fpga_bitstream_reg_test - name: fpga_sdc_reg_test - name: fpga_spice_reg_test - name: micro_benchmark_reg_test - name: quicklogic_reg_test - name: vtr_benchmark_reg_test - name: iwls_benchmark_reg_test steps: - name: Cancel previous uses: styfle/cancel-workflow-action@0.9.1 with: access_token: ${{ github.token }} - name: Checkout OpenFPGA repo uses: actions/checkout@v2 - name: Download a built artifacts uses: actions/download-artifact@v2 with: name: openfpga - name: chmod run: | chmod +x build/vtr-verilog-to-routing/abc/abc chmod +x build/vtr-verilog-to-routing/ace2/ace chmod +x build/vtr-verilog-to-routing/vpr/vpr chmod +x build/openfpga/openfpga chmod +x yosys/install/bin/yosys chmod +x yosys/install/bin/yosys-abc chmod +x yosys/install/bin/yosys-config chmod +x yosys/install/bin/yosys-filterlib chmod +x yosys/install/bin/yosys-smtbmc - name: ${{matrix.config.name}}_GCC-8_(Ubuntu 18.04) shell: bash run: source openfpga.sh && source openfpga_flow/regression_test_scripts/${{matrix.config.name}}.sh --debug --show_thread_logs - name: Upload artifact uses: actions/upload-artifact@v2 if: ${{ failure() }} with: name: failed_${{matrix.config.name}}_regression_log retention-days: 1 path: | openfpga_flow/**/*.log docker_regression_tests: needs: change_detect if: ${{ !fromJSON(needs.change_detect.outputs.source_modified) }} name: docker_regression_tests runs-on: ubuntu-18.04 container: image: ghcr.io/${{ needs.change_detect.outputs.docker_repo }}/openfpga-master:latest options: --user root --workdir /home/openfpga_user strategy: fail-fast: false matrix: config: - name: basic_reg_yosys_only_test - name: basic_reg_test - name: fpga_verilog_reg_test - name: fpga_bitstream_reg_test - name: fpga_sdc_reg_test - name: fpga_spice_reg_test - name: micro_benchmark_reg_test - name: quicklogic_reg_test - name: vtr_benchmark_reg_test - name: iwls_benchmark_reg_test steps: - name: Cancel previous uses: styfle/cancel-workflow-action@0.9.1 with: access_token: ${{ github.token }} - name: Checkout OpenFPGA repo uses: actions/checkout@v2 with: submodules: true - name: ${{matrix.config.name}}_GCC-8_(Ubuntu 18.04) shell: bash run: | bash .github/workflows/install_dependencies_run.sh ${PYTHON_EXEC} -m pip install -r requirements.txt rsync -am --exclude='openfpga_flow/**' /opt/openfpga/. . unset OPENFPGA_PATH source openfpga.sh && source openfpga_flow/regression_test_scripts/${{matrix.config.name}}.sh --debug --show_thread_logs - name: Upload artifact uses: actions/upload-artifact@v2 if: ${{ failure() }} with: name: failed_${{matrix.config.name}}_regression_log retention-days: 1 path: openfpga_flow/**/*.log