name: Test on: push: pull_request: workflow_dispatch: env: CI: true DOCKER_BUILDKIT: 1 jobs: # # Doc # gnatdoc: name: '📚 gnatdoc' runs-on: ubuntu-latest steps: - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '📚 Run gnatdoc' run: | docker run --rm -i -v $(pwd):/src -w /src ghdl/debug:base <<'EOF' #!/usr/bin/env sh ./configure --enable-werror && make && make install gnatdoc -P./ghdl EOF - name: '📤 Upload artifact: gnatdoc' uses: actions/upload-artifact@v2 with: name: gnatdoc path: gnatdoc doc: needs: gnatdoc name: '📓 Docs' runs-on: ubuntu-latest steps: - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '⛴ Build ghdl/doc' run: | docker build -t ghdl/doc . -f- <<-EOF FROM ghdl/build:doc COPY . /opt/ghdl RUN cd /opt/ghdl && ./configure --enable-werror && make && make install EOF - name: '📥 Download artifact: gnatdoc' uses: actions/download-artifact@v2 with: name: gnatdoc path: public/gnatdoc - name: '📓 BuildTheDocs (BTD)' uses: buildthedocs/btd@v0 with: token: ${{ github.token }} skip-deploy: ${{ github.event_name == 'pull_request' }} #- run: nroff -man doc/_build/man/ghdl.1 - name: '📤 Upload artifact: HTML, LaTeX and man' uses: actions/upload-artifact@v2 with: name: doc path: | doc/_build/html doc/_build/latex doc/_build/man # # pyGHDL Bindings, Formatting and Wheel # pyGHDL: name: '🐍 pyGHDL' runs-on: ubuntu-latest steps: - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '🐍 Setup Python' uses: actions/setup-python@v2 with: python-version: '3.10' - name: '🔧 Install dependencies' run: | sudo apt update -qq sudo apt install -y gnat python -m pip install --upgrade pip python -m pip install black wheel pyTooling - name: '🚧 Update Python bindings' run: ./scripts/update_py_bindings.sh - name: '🚦 Check if Python bindings changed' run: | git diff --stat echo "NOTE: Bindings can be updated by executing ./scripts/update_py_bindings.sh (see previous step)" git diff --exit-code - name: '🚦 Check if python follows code formatting standards' run: python -m black --check pyGHDL - name: 🔨 Build Python package (source distribution) run: python setup.py sdist - name: 🔨 Build Python package (binary distribution - wheel) run: python setup.py bdist_wheel - name: '📤 Upload artifact: pyGHDL' uses: actions/upload-artifact@v2 with: name: pyGHDL path: dist/ if-no-files-found: error # # GPL # gpl: name: '🚧🚦🐧 GPL mcode' runs-on: ubuntu-latest steps: - name: '🧰 Checkout' uses: actions/checkout@v2 - run: TASK=bullseye+mcode ./scripts/ci-run.sh -c --gplcompat # # GNU/Linux # lin: name: '🚧🚦🐧 Ubuntu ${{ matrix.os }} ${{ matrix.backend }}' runs-on: ubuntu-${{ matrix.os }}.04 strategy: fail-fast: false matrix: include: - { os: 18, backend: mcode } - { os: 20, backend: mcode } - { os: 18, backend: llvm-5.0 } - { os: 20, backend: llvm-10 } - { os: 18, backend: gcc-8.3.0 } - { os: 20, backend: gcc-9.3.0 } steps: - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '🛳 Build and test GHDL in containers' run: | TASK=ubuntu${{ matrix.os }}+${{ matrix.backend }} ./scripts/ci-run.sh -c mv ghdl-*-ubuntu${{ matrix.os }}-*.tgz ghdl-gha-ubuntu-${{ matrix.os }}.04-$(echo ${{ matrix.backend }} | sed 's#-.*##g').tgz - name: '📤 Upload artifact: package' uses: actions/upload-artifact@v2 with: name: ubuntu${{ matrix.os }}-${{ matrix.backend }} path: ghdl-gha-ubuntu-*.tgz if-no-files-found: error # # MacOS # osx: name: '🚧🚦🍎 macOS ${{ matrix.os }} ${{ matrix.backend }}' runs-on: 'macOS-${{ matrix.os }}' strategy: fail-fast: false matrix: os: - '11' - '12' backend: - mcode - llvm steps: - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '💾 Cache gnat' id: cache-gnat uses: actions/cache@v2 with: path: gnat key: ${{ runner.os }}-gnat # Although we cache this, we let the script run to check if the cache is valid (without conditions) - name: '⚙ Dependencies (brew)' run: ./scripts/macosx/install-ada.sh - name: '🚧 Build and 🚦 Test GHDL' run: | PATH=$PWD/gnat/bin:$PATH:/usr/local/Cellar/llvm@13/13.0.1/bin/ ./scripts/ci-run.sh -c mv ghdl-*.tgz ghdl-macos-${{ matrix.os }}-${{ matrix.backend }}.tgz env: TASK: macosx+${{ matrix.backend }} GITHUB_OS: ${{ runner.os }} - name: '📤 Upload artifact: package' uses: actions/upload-artifact@v2 with: name: macos${{ matrix.os }}-${{ matrix.backend }} path: ghdl-macos-${{ matrix.os }}-${{ matrix.backend }}.tgz if-no-files-found: error # # Windows MSYS2 Build # win-msys2-build-package: name: '🚧${{ matrix.icon }} ${{ matrix.sys }} ${{ matrix.pkg }}' runs-on: windows-latest strategy: fail-fast: false matrix: include: # - {icon: '🟪', pkg: 'llvm', sys: 'MINGW32' } ! not yet functional - {icon: '🟦', pkg: 'llvm', sys: 'MINGW64' } - {icon: '🟨', pkg: 'llvm', sys: 'UCRT64' } #! experimental - {icon: '🟪', pkg: 'mcode', sys: 'MINGW32' } - {icon: '🟦', pkg: 'mcode', sys: 'MINGW64' } #! simulation with mcode is not yet supported on win64 - {icon: '🟨', pkg: 'mcode', sys: 'UCRT64' } #! experimental; simulation with mcode is not yet supported on win64 env: MINGW_ARCH: ${{ matrix.sys }} defaults: run: shell: msys2 {0} steps: - name: '${{ matrix.icon }} Setup MSYS2' uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.sys }} update: true install: base-devel git pacboy: toolchain:p - name: '⚙ git config' run: git config --global core.autocrlf input shell: bash - name: '🧰 Checkout' uses: actions/checkout@v2 with: # The command 'git describe' (used for version) needs the history. fetch-depth: 0 - name: '🚧 Build package' run: | cd scripts/msys2-${{ matrix.pkg }} makepkg-mingw --noconfirm --noprogressbar -sCLf for item in src pkg; do tar czf msys2-${{ matrix.pkg }}."$item".tar.gz "$item" done - name: '📤 Upload artifact: builddir' uses: actions/upload-artifact@v2 with: name: ${{ matrix.sys }}-${{ matrix.pkg }}-builddir path: | scripts/msys2-${{ matrix.pkg }}/msys2-${{ matrix.pkg }}.src.tar.gz scripts/msys2-${{ matrix.pkg }}/msys2-${{ matrix.pkg }}.pkg.tar.gz - name: '📤 Upload artifact: package' uses: actions/upload-artifact@v2 with: name: ${{ matrix.sys }}-${{ matrix.pkg }} path: scripts/msys2-${{ matrix.pkg }}/mingw-*ghdl*.pkg.tar.zst if-no-files-found: error # # Windows MSYS2 Test # win-msys2-test: name: '🚦${{ matrix.sys.icon }} ${{ matrix.sys.sys }} ${{ matrix.sys.pkg }} ${{ matrix.suite }}' runs-on: windows-latest needs: - win-msys2-build-package strategy: fail-fast: false matrix: sys: # - {icon: '🟪', pkg: 'llvm', sys: 'MINGW32' } ! not yet functional - {icon: '🟦', pkg: 'llvm', sys: 'MINGW64' } - {icon: '🟨', pkg: 'llvm', sys: 'UCRT64' } #! experimental - {icon: '🟪', pkg: 'mcode', sys: 'MINGW32' } # - {icon: '🟦', pkg: 'mcode', sys: 'MINGW64' } ! simulation with mcode is not yet supported on win64 # - {icon: '🟨', pkg: 'mcode', sys: 'UCRT64' } ! experimental; simulation with mcode is not yet supported on win64 suite: - 'sanity pyunit vpi vhpi' - 'gna' - 'vests' - 'synth' defaults: run: shell: msys2 {0} steps: - name: '${{ matrix.sys.icon }} Setup MSYS2' uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.sys.sys }} update: true pacboy: > diffutils:p gcc:p python-pip:p python-setuptools:p - name: '⚙ git config' run: git config --global core.autocrlf input shell: bash - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '📥 Download artifact: package' uses: actions/download-artifact@v2 with: path: artifact name: ${{ matrix.sys.sys }}-${{ matrix.sys.pkg }} - name: '🛠 Install package and 🐍 Python dependencies' run: | pacman --noconfirm -U artifact/mingw-w64-*-ghdl-${{ matrix.sys.pkg }}-*.zst pip3 install -r testsuite/requirements.txt - name: '🚦 Test package' run: GHDL=ghdl ./testsuite/testsuite.sh ${{ matrix.suite }} # # Windows Generate Standalone ZipFile # win-generate-standalone-zip: name: '🚧🥡${{ matrix.icon }} ${{ matrix.sys }} mcode' runs-on: windows-latest needs: - win-msys2-build-package strategy: fail-fast: false matrix: include: - {icon: '🟪', sys: 'MINGW32' } - {icon: '🟦', sys: 'MINGW64' } #! simulation with mcode is not yet supported on win64 - {icon: '🟨', sys: 'UCRT64' } #! experimental; simulation with mcode is not yet supported on win64 defaults: run: shell: msys2 {0} steps: - name: '${{ matrix.icon }} Setup MSYS2' uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.sys }} update: true install: >- tree zstd zip tar - name: '⚙ git config' run: git config --global core.autocrlf input shell: bash - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '📥 Download artifact: package' uses: actions/download-artifact@v2 with: path: artifact name: ${{ matrix.sys }}-mcode - name: '🛠 Install package' run: pacman --noconfirm -U artifact/mingw-w64-*-ghdl-mcode-*.zst - name: '🥡 Generate standalone zipfile' run: | _zipdir='${{ matrix.sys }}-mcode-standalone' mkdir -p "${_zipdir}"-extract tar xf artifact/mingw-w64-*-ghdl-mcode-*.zst -C "${_zipdir}"-extract cd "${_zipdir}-extract/${{ matrix.sys }}"/bin ../../../scripts/msys2-mcode/GetStandaloneDeps.sh cd ../../.. mv "${_zipdir}"-extract/${{ matrix.sys }} "${_zipdir}" tree "${_zipdir}" zip "${_zipdir}".zip -r "${_zipdir}" - name: '📤 Upload artifact: zipfile' uses: actions/upload-artifact@v2 with: name: ${{ matrix.sys }}-mcode-standalone path: ${{ matrix.sys }}-mcode-standalone.zip # # Windows CPython pyGHDL Test with MSYS2 installation # win-cpython-msys2: name: '🚦🐍${{ matrix.icon }} ${{ matrix.sys }} ${{ matrix.pkg }}' runs-on: windows-latest needs: - win-msys2-build-package strategy: fail-fast: false matrix: include: # - {icon: '🟪', pkg: 'llvm', sys: 'MINGW32', pyarch: x86 }, ! not yet functional - {icon: '🟦', pkg: 'llvm', sys: 'MINGW64', pyarch: x64 } - {icon: '🟨', pkg: 'llvm', sys: 'UCRT64', pyarch: x64 } #! experimental - {icon: '🟪', pkg: 'mcode', sys: 'MINGW32', pyarch: x86 } - {icon: '🟦', pkg: 'mcode', sys: 'MINGW64', pyarch: x64 } #! simulation with mcode is not yet supported on win64 - {icon: '🟨', pkg: 'mcode', sys: 'UCRT64', pyarch: x64 } #! experimental; simulation with mcode is not yet supported on win64 defaults: run: shell: pwsh steps: - name: '${{ matrix.icon }} Setup MSYS2' uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.sys }} update: true - name: '⚙ git config' run: git config --global core.autocrlf input - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '📥 Download artifact: package' uses: actions/download-artifact@v2 with: path: artifact name: ${{ matrix.sys }}-${{ matrix.pkg }} - name: '🛠 Install package' shell: msys2 {0} run: | pacman --noconfirm -U artifact/mingw-w64-*-ghdl-${{ matrix.pkg }}-*.zst - name: '🛠 Set envvars' run: | $GHDL = (& msys2 -c 'cygpath -w /') + '${{ matrix.sys }}\bin\ghdl.exe' $GHDL_HASH = (& $GHDL version hash) echo "GHDL_HASH=$GHDL_HASH" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append $GHDL_PREFIX = (& msys2 -c 'cygpath -w /') + '${{ matrix.sys }}\lib\ghdl\' echo "GHDL_PREFIX=$GHDL_PREFIX" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - name: '🐍 Setup Python' uses: actions/setup-python@v2 with: python-version: '3.10' architecture: ${{ matrix.pyarch }} - name: '🐍 Install Python dependencies' run: pip3 install -r testsuite/requirements.txt - name: '🚦 Test installation of pyGHDL through pip' run: pip install ("git+https://github.com/ghdl/ghdl.git@" + $env:GHDL_HASH) - name: '🚦 Test pyGHDL entrypoints' run: | ghdl-dom help ghdl-ls --help - name: '🚦 Test pyunit testsuite' run: | cd testsuite python3 -m pytest -vsrA pyunit # # Windows CPython pyGHDL Test with standalone zipfile and pyGHDL wheel # win-cpython-standalone: name: '🚦🐍🥡${{ matrix.icon }} ${{ matrix.sys }} ${{ matrix.pkg }}' runs-on: windows-latest needs: - win-generate-standalone-zip - pyGHDL strategy: fail-fast: false matrix: include: # - {icon: '🟪', pkg: 'llvm', sys: 'MINGW32', pyarch: x86 }, ! not yet functional # - {icon: '🟦', pkg: 'llvm', sys: 'MINGW64', pyarch: x64 } # - {icon: '🟨', pkg: 'llvm', sys: 'UCRT64', pyarch: x64 } #! experimental # - {icon: '🟪', pkg: 'mcode', sys: 'MINGW32', pyarch: x86 } - {icon: '🟦', pkg: 'mcode', sys: 'MINGW64', pyarch: x64 } #! simulation with mcode is not yet supported on win64 - {icon: '🟨', pkg: 'mcode', sys: 'UCRT64', pyarch: x64 } #! experimental; simulation with mcode is not yet supported on win64 defaults: run: shell: pwsh steps: - name: '⚙ git config' run: git config --global core.autocrlf input - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '📥 Download artifact: package' uses: actions/download-artifact@v2 with: path: artifact name: ${{ matrix.sys }}-${{ matrix.pkg }}-standalone - name: '⚙ Extract package' run: | unzip artifact\${{ matrix.sys }}-${{ matrix.pkg }}-standalone.zip mv '${{ matrix.sys }}-${{ matrix.pkg }}-standalone\' GHDL-standalone - name: '🛠 Set envvars' run: | $GHDL = (pwd).Path + '\GHDL-standalone\bin\ghdl.exe' $GHDL_HASH = (& $GHDL version hash) echo "GHDL_HASH=$GHDL_HASH" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append $GHDL_PREFIX = (pwd).Path + '\GHDL-standalone\lib\ghdl' echo "GHDL_PREFIX=$GHDL_PREFIX" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - name: '🐍 Setup Python' uses: actions/setup-python@v2 with: python-version: '3.10' architecture: ${{ matrix.pyarch }} - name: '📥 Download artifact: pyGHDL' uses: actions/download-artifact@v2 with: name: pyGHDL - name: '🐍 Install pyGHDL' run: | python -m pip install --upgrade pip python -m pip install wheel (& ls *.whl) python -m pip install -r testsuite/requirements.txt - name: '🚦 Test pyGHDL entrypoints' run: | ghdl-dom help ghdl-ls --help - name: '🚦 Test pyunit testsuite' run: | cd testsuite python3 -m pytest -vsrA pyunit # # Release # Release: name: '📦 Release' runs-on: ubuntu-latest needs: - doc - lin - osx - win-msys2-test - win-generate-standalone-zip - win-cpython-msys2 - win-cpython-standalone if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master' || contains(github.ref, 'refs/tags/')) steps: - name: '📥 Download artifacts' if: "!contains(github.ref, 'refs/tags/')" uses: actions/download-artifact@v2 with: path: artifacts # Do not upload assets to tagged releases - name: Set list of files for uploading id: files shell: python run: | print('None' if '${{ github.ref }}'.startswith('refs/tags/') else'::set-output name=list::**/*.zst **/*.tgz **/*-standalone.zip **/man/ghdl.1' ) # Tagged: create a pre-release or a release (semver) # Untagged: update the assets of pre-release 'nightly' - uses: pyTooling/Actions/releaser@r0 with: token: ${{ secrets.GITHUB_TOKEN }} tag: 'nightly' files: ${{ steps.files.outputs.list }} - name: '🔔 Trigger ghdl/docker' run: | curl -X POST https://api.github.com/repos/ghdl/docker/dispatches \ -H 'Content-Type: application/json' \ -H 'Accept: application/vnd.github.everest-preview+json' \ -H "Authorization: token ${{ secrets.GHDL_BOT }}" \ --data '{"event_type": "ghdl"}' # # Coverage (MINGW64) # coverage: name: '📈 Coverage' runs-on: windows-latest needs: - win-msys2-build-package defaults: run: shell: msys2 {0} steps: - name: '🟪 Setup MSYS2' uses: msys2/setup-msys2@v2 with: msystem: MINGW64 update: true pacboy: > python-pip:p python-setuptools:p - name: '⚙ git config' run: git config --global core.autocrlf input shell: bash - name: '🧰 Checkout' uses: actions/checkout@v2 - name: '📥 Download artifact: package' uses: actions/download-artifact@v2 with: path: artifact name: MINGW64-llvm - name: '🛠 Install package and 🐍 Python dependencies' run: | pacman --noconfirm -U artifact/mingw-w64-*-ghdl-llvm-*.zst pip3 install -r testsuite/requirements.txt - name: '🚦 Run tests to generate coverage report' run: PYTHONPATH=$(pwd) python3 -m pytest -rA --cov=.. --cov-config=.coveragerc testsuite/pyunit - name: Generate XML coverage report if: always() run: coverage xml - name: '📤 Upload artifact: coverage report' if: always() uses: actions/upload-artifact@v2 with: name: coverage path: coverage.xml # # Coverage Publish (Ubuntu) # coverage-publish: name: '📮 Publish coverage report' runs-on: ubuntu-latest needs: - coverage if: always() && github.repository == 'ghdl/ghdl' && github.event_name != 'pull_request' steps: - name: '📥 Download artifact: coverage report' uses: actions/download-artifact@v2 with: path: . name: coverage - name: CodeCov uses: codecov/codecov-action@v1 with: file: coverage.xml flags: unittests - name: Codacy uses: codacy/codacy-coverage-reporter-action@master with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: coverage.xml #--- # TODO: # - Re-package a MINGW/MSYS2 package to provide a 'standalone' tarball/zipfile. # - https://github.com/ghdl/ghdl/issues/318#issuecomment-286246287 # # - Add GNAT GPL 32-bit build job with mcode backend