Building GHDL in pipeline. #418
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Pipeline | ||
on: | ||
push: | ||
workflow_dispatch: | ||
schedule: | ||
# Every Friday at 22:00 - rerun pipeline to check for dependency-based issues | ||
- cron: '0 22 * * 5' | ||
jobs: | ||
UnitTestingParams: | ||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@dev | ||
with: | ||
name: pyEDAA.CLITool | ||
CompileUbuntu: | ||
name: Compile GHDL on Ubuntu 2024.04 (LTS) | ||
runs-on: "ubuntu-24.04" | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
backend: [mcode, llvm] | ||
defaults: | ||
run: | ||
shell: bash | ||
steps: | ||
- name: ⏬ Checkout repository | ||
uses: actions/checkout@v4 | ||
with: | ||
repository: ghdl/ghdl | ||
- name: 🔧 Install dependencies | ||
run: | | ||
[ '${{ matrix.backend }}' == 'llvm' ] && LLVM_ARGS='llvm clang' || unset LLVM_ARGS | ||
sudo apt-get update | ||
sudo apt-get install -y --no-install-recommends gcc g++ gnat $LLVM_ARGS | ||
- name: Prepare build environemnt | ||
run: | | ||
mkdir -p build/${{ matrix.backend }} | ||
./configure --help | ||
- name: ⚙ Configure | ||
run: | | ||
cd build/${{ matrix.backend }} | ||
[ '${{ matrix.backend }}' == 'llvm' ] && LLVM_ARGS='--with-llvm-config' || unset LLVM_ARGS | ||
NPROC=$(nproc) | ||
GNATMAKE="gnatmake -j$NPROC" \ | ||
MAKE="make -j$NPROC" \ | ||
../../configure --prefix=/opt/ghdl-${{ matrix.backend }} $LLVM_ARGS | ||
- name: 🔨 Make | ||
run: | | ||
cd build/${{ matrix.backend }} | ||
make | ||
- name: 📋 Install | ||
run: | | ||
cd build/${{ matrix.backend }} | ||
sudo make install | ||
- name: 📤 Upload 'GHDL' artifact | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: ghdl-ubuntu-24.04-x86_64-${{ matrix.backend }} | ||
path: /opt/ghdl-${{ matrix.backend }}/ | ||
if-no-files-found: error | ||
retention-days: 1 | ||
CompileMacOS: | ||
name: Compile GHDL on macOS 14.0 (aarch64) | ||
runs-on: macos-latest | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
backend: [llvm] # mcode | ||
env: | ||
GNAT_ARCH: "aarch64" | ||
GNAT_VERSION: "14.1.0-3" | ||
defaults: | ||
run: | ||
shell: bash | ||
steps: | ||
- name: ⏬ Checkout repository | ||
uses: actions/checkout@v4 | ||
with: | ||
repository: ghdl/ghdl | ||
- name: Install dependencies | ||
run: | | ||
brew install llvm | ||
echo "LLVM_BINARY_PATH=$(brew --prefix llvm)/bin" >> $GITHUB_ENV | ||
- name: Install GNAT | ||
run: | | ||
GNAT_NAME="gnat-${{ env.GNAT_ARCH }}-darwin-${{ env.GNAT_VERSION }}" | ||
GNAT_URL="https://github.com/alire-project/GNAT-FSF-builds/releases/download/gnat-${{ env.GNAT_VERSION }}/${GNAT_NAME}.tar.gz" | ||
echo "Downloading GNAT ${{ env.GNAT_VERSION }} (${{ env.GNAT_ARCH }}) from '$GNAT_URL'" | ||
wget -q --show-progress --progress=bar:force:noscroll -O GNAT.tar.gz "$GNAT_URL" | ||
test $? -ne 0 && echo -e "ERROR: Downloading '$GNAT_URL'" && exit 1 | ||
ls -lAh | ||
tar -zxf GNAT.tar.gz && rm GNAT.tar.gz | ||
test $? -ne 0 && echo -e "ERROR: Extracting 'GNAT.tar.gz'" && exit 1 | ||
mv ${GNAT_NAME} gnat | ||
echo "ls gnat" | ||
ls -lAh gnat | ||
echo "ls gnat/bin" | ||
ls -lAh gnat/bin | ||
./gnat/bin/gnatls -v | ||
echo "PWD: $(pwd)" | ||
ls -lAh $(pwd)/gnat | ||
ls -lAh $(pwd)/gnat/bin | ||
echo "GNAT_BINARY_PATH=$(pwd)/gnat/bin" >> $GITHUB_ENV | ||
- name: Prepare build environemnt | ||
run: | | ||
mkdir -p build/${{ matrix.backend }} | ||
echo $PATH | ||
echo "PATH=$GNAT_BINARY_PATH:$LLVM_BINARY_PATH:$PATH" >> $GITHUB_ENV | ||
- name: Check build environemnt | ||
run: | | ||
echo $PATH | ||
ls -lAh $(pwd) | ||
ls -lAh /Users/runner/work/pyEDAA.CLITool/pyEDAA.CLITool/gnat/bin | ||
echo "which gnat: $(which gnat) ($($(which gnat) --version))" | ||
echo "which gnatmake: $(which gnatmake) ($($(which gnatmake) --version))" | ||
echo "which llvm-config: $(which llvm-config) ($($(which llvm-config) --version))" | ||
- name: ⚙ Configure | ||
run: | | ||
cd build/${{ matrix.backend }} | ||
[ '${{ matrix.backend }}' == 'llvm' ] && LLVM_ARGS='--with-llvm-config' || unset LLVM_ARGS | ||
# Use static libs (including libzstd) and dead-strip (to avoid libz3) | ||
libzstd=$(brew --prefix zstd)/lib/libzstd.a | ||
export LLVM_LDFLAGS="$(llvm-config --link-static --libfiles --system-libs | sed -e s@-lzstd@$libzstd@) -Wl,-dead_strip,-dead_strip_dylibs" | ||
echo $LLVM_LDFLAGS | ||
# Use classic ld and not lld (which simply crashes) | ||
NPROC=$(sysctl -n hw.logicalcpu) | ||
GNATMAKE="gnatmake -j$NPROC" \ | ||
MAKE="make -j$NPROC" \ | ||
LDFLAGS=-Wl,-ld_classic \ | ||
../../configure --prefix=/opt/ghdl-${{ matrix.backend }} $LLVM_ARGS | ||
- name: 🔨 Make | ||
run: | | ||
cd build/${{ matrix.backend }} | ||
make | ||
- name: 📋 Install | ||
run: | | ||
cd build/${{ matrix.backend }} | ||
sudo make install | ||
- name: 📤 Upload 'GHDL' artifact | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: ghdl-macos-14.0-aarch64-${{ matrix.backend }} | ||
path: /opt/ghdl-${{ matrix.backend }}/ | ||
if-no-files-found: error | ||
retention-days: 1 | ||
CompileWindows: | ||
name: Compile GHDL on Windows Server | ||
runs-on: windows-latest | ||
env: | ||
msys2_packages: "make" | ||
common_packages: "gcc:p gcc-ada:p diffutils:p" | ||
mcode_packages: "" | ||
llvm_packages: "llvm:p clang:p" | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
runtime: [mingw64, ucrt64] | ||
backend: [mcode, llvm] | ||
defaults: | ||
run: | ||
shell: "msys2 {0}" | ||
steps: | ||
- name: ⏬ Checkout repository | ||
uses: actions/checkout@v4 | ||
with: | ||
repository: ghdl/ghdl | ||
- name: '🟦 Setup MSYS2 for ${{ matrix.runtime }}' | ||
uses: msys2/setup-msys2@v2 | ||
with: | ||
msystem: ${{ matrix.runtime }} | ||
update: true | ||
install: ${{ env.msys2_packages }} | ||
pacboy: "${{ env.common_packages }} ${{ env.mcode_packages }} ${{ env.llvm_packages }}" | ||
- name: Check build environemnt | ||
run: | | ||
echo "which gnat: $(which gnat) ($($(which gnat) --version))" | ||
echo "which gnatmake: $(which gnatmake) ($($(which gnatmake) --version))" | ||
echo "which llvm-config: $(which llvm-config) ($($(which llvm-config) --version))" | ||
- name: Prepare build environemnt | ||
run: | | ||
mkdir -p build/${{ matrix.backend }} | ||
mkdir -p install | ||
- name: ⚙ Configure | ||
run: | | ||
cd build/${{ matrix.backend }} | ||
[ '${{ matrix.backend }}' == 'llvm' ] && LLVM_ARGS='--with-llvm-config' || unset LLVM_ARGS | ||
NPROC=$(nproc) | ||
GNATMAKE="gnatmake -j$NPROC" \ | ||
MAKE="make -j$NPROC" \ | ||
../../configure --prefix=../../install/ghdl-${{ matrix.runtime }}-${{ matrix.backend }} $LLVM_ARGS | ||
- name: 🔨 Make | ||
run: | | ||
cd build/${{ matrix.backend }} | ||
make | ||
- name: 📋 Install | ||
run: | | ||
cd build/${{ matrix.backend }} | ||
make install | ||
- name: Debug | ||
run: | | ||
ls -lAh ./install | ||
ls -lAh ./install/ghdl-${{ matrix.runtime }}-${{ matrix.backend }} | ||
ls -lAh ./install/ghdl-${{ matrix.runtime }}-${{ matrix.backend }}/bin | ||
- name: 📤 Upload 'GHDL' artifact | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: ghdl-windows-${{ matrix.runtime }}-${{ matrix.backend }} | ||
path: ./install/ghdl-${{ matrix.runtime }}-${{ matrix.backend }}/ | ||
if-no-files-found: error | ||
retention-days: 1 | ||
UnitTesting: | ||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
# - CompileUbuntu | ||
- CompileMacOS | ||
- CompileWindows | ||
with: | ||
jobs: ${{ needs.UnitTestingParams.outputs.python_jobs }} | ||
apt: ghdl-mcode | ||
brew: --cask ghdl | ||
pacboy: ghdl | ||
ubuntu_before_script: | | ||
which ghdl | ||
ghdl version | ||
echo "GHDL_PREFIX=/usr/lib/x86_64-linux-gnu/ >> $GITHUB_ENV" | ||
echo "GHDL_PREFIX=/usr/lib/x86_64-linux-gnu/" >> $GITHUB_ENV | ||
macos_arm_before_script: | | ||
which ghdl | ||
ghdl version | ||
echo $(brew --prefix llvm@15) | ||
export DYLD_LIBRARY_PATH=$(brew --prefix llvm@15)/lib | ||
echo -$DYLD_LIBRARY_PATH- | ||
echo "DYLD_LIBRARY_PATH=$(brew --prefix llvm@15)/lib" >> $GITHUB_ENV | ||
echo "GHDL_PREFIX=$(realpath $(dirname $(which ghdl))/../lib/ghdl) >> $GITHUB_ENV" | ||
echo "GHDL_PREFIX=$(realpath $(dirname $(which ghdl))/../lib/ghdl)" >> $GITHUB_ENV | ||
ls -lAh "$(realpath $(dirname $(which ghdl))/../lib)" | ||
echo "----" | ||
ls $(brew --prefix llvm@15)/lib | ||
mingw64_before_script: | | ||
which ghdl | ||
ghdl version | ||
echo "GHDL_PREFIX=$(realpath $(dirname $(which ghdl))/../lib/ghdl) >> $GITHUB_ENV" | ||
echo "GHDL_PREFIX=$(realpath $(dirname $(which ghdl))/../lib/ghdl)" >> $GITHUB_ENV | ||
# ls -lAh "$(realpath $(dirname $(which ghdl))/../lib)" | ||
ucrt64_before_script: | | ||
which ghdl | ||
ghdl version | ||
echo "GHDL_PREFIX=$(realpath $(dirname $(which ghdl))/../lib/ghdl) >> $GITHUB_ENV" | ||
echo "GHDL_PREFIX=$(realpath $(dirname $(which ghdl))/../lib/ghdl)" >> $GITHUB_ENV | ||
# ls -lAh "$(realpath $(dirname $(which ghdl))/../lib)" | ||
# ubuntu_before_script: sudo install -m 755 tests/mock/ghdl /usr/local/bin | ||
requirements: "-r tests/unit/requirements.txt" | ||
unittest_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }} | ||
coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }} | ||
StaticTypeCheck: | ||
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
with: | ||
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} | ||
commands: | | ||
touch pyEDAA/__init__.py | ||
mypy --html-report htmlmypy -p pyEDAA.CLITool | ||
html_report: 'htmlmypy' | ||
html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }} | ||
DocCoverage: | ||
uses: pyTooling/Actions/.github/workflows/CheckDocumentation.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
with: | ||
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} | ||
directory: pyEDAA/CLITool | ||
# fail_below: 70 | ||
ConfigParams: | ||
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@dev | ||
needs: | ||
- DocCoverage | ||
Package: | ||
uses: pyTooling/Actions/.github/workflows/Package.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
- UnitTesting | ||
with: | ||
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} | ||
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }} | ||
PublishCoverageResults: | ||
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
- UnitTesting | ||
with: | ||
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }} | ||
coverage_html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }} | ||
secrets: | ||
codacy_token: ${{ secrets.CODACY_PROJECT_TOKEN }} | ||
PublishTestResults: | ||
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
- UnitTesting | ||
with: | ||
additional_merge_args: '"--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit" --render=tree' | ||
merged_junit_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }} | ||
# VerifyDocs: | ||
# uses: pyTooling/Actions/.github/workflows/VerifyDocs.yml@dev | ||
# needs: | ||
# - UnitTestingParams | ||
# with: | ||
# python_version: ${{ needs.UnitTestingParams.outputs.python_version }} | ||
Documentation: | ||
uses: pyTooling/Actions/.github/workflows/SphinxDocumentation.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
- ConfigParams | ||
- PublishTestResults | ||
- PublishCoverageResults | ||
# - VerifyDocs | ||
with: | ||
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} | ||
coverage_report_json_directory: ${{ needs.ConfigParams.outputs.coverage_report_json_directory }} | ||
unittest_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }} | ||
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }} | ||
html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }} | ||
latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }} | ||
IntermediateCleanUp: | ||
uses: pyTooling/Actions/.github/workflows/IntermediateCleanUp.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
- PublishCoverageResults | ||
- PublishTestResults | ||
- Documentation | ||
with: | ||
sqlite_coverage_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}- | ||
xml_unittest_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}- | ||
PDFDocumentation: | ||
uses: pyTooling/Actions/.github/workflows/LaTeXDocumentation.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
- Documentation | ||
with: | ||
document: pyEDAA.CLITool | ||
latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }} | ||
pdf_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_pdf }} | ||
PublishToGitHubPages: | ||
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
- Documentation | ||
# - PDFDocumentation | ||
- PublishCoverageResults | ||
- StaticTypeCheck | ||
with: | ||
doc: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }} | ||
# coverage: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }} | ||
typing: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }} | ||
ReleasePage: | ||
uses: pyTooling/Actions/.github/workflows/Release.yml@dev | ||
if: startsWith(github.ref, 'refs/tags') | ||
needs: | ||
- PublishToGitHubPages | ||
PublishOnPyPI: | ||
uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@dev | ||
if: startsWith(github.ref, 'refs/tags') | ||
needs: | ||
- UnitTestingParams | ||
- ReleasePage | ||
with: | ||
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} | ||
requirements: -r dist/requirements.txt | ||
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }} | ||
secrets: | ||
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} | ||
ArtifactCleanUp: | ||
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@dev | ||
needs: | ||
- UnitTestingParams | ||
- UnitTesting | ||
- StaticTypeCheck | ||
- Documentation | ||
# - PDFDocumentation | ||
- PublishTestResults | ||
- PublishCoverageResults | ||
- PublishToGitHubPages | ||
with: | ||
package: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }} | ||
remaining: | | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}-* | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_html }}-* | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}-* | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}-* | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}-* | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}-* | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }} | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_html }} | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }} | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }} | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }} | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }} | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }} | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }} | ||
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }} | ||
# ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_pdf }} |