diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml new file mode 100644 index 00000000..c361c0bc --- /dev/null +++ b/.github/workflows/ci-cd.yml @@ -0,0 +1,229 @@ +# This starter workflow is for a CMake project running on multiple platforms. There is a different starter workflow if you just want a single platform. +# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-single-platform.yml +name: Multi-platform Python/C++ build/test + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +concurrency: + group: ${{ github.repository }}-${{ github.event.number || github.head_ref || github.sha }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + build_and_test: + name: Build/Test ${{ matrix.os }}-${{ matrix.build_type }}-py${{ matrix.python-version }} + runs-on: ${{ matrix.os }} + + strategy: + # Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. + # Consider changing this to true when your workflow is stable. + fail-fast: false + + # Set up a matrix to run the following 3 configurations: + # 1. + # 2. + # 3. + # + # To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list. + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + python-version: ['3.13'] + build_type: [RelWithDebInfo] + c_compiler: [clang, cl] + include: + - os: windows-latest + c_compiler: cl + cpp_compiler: cl + - os: ubuntu-latest + c_compiler: clang + cpp_compiler: clang++ + - os: macos-latest + c_compiler: clang + cpp_compiler: clang++ + exclude: + - os: windows-latest + c_compiler: gcc + - os: windows-latest + c_compiler: clang + - os: ubuntu-latest + c_compiler: cl + - os: ubuntu-latest + c_compiler: gcc + - os: macos-latest + c_compiler: gcc + - os: macos-latest + c_compiler: cl + + env: + ALLURE_RESULTS_PATH: build/allure-results + COVERAGE_REPORT_PATH: build/python-coverage + + steps: + - uses: actions/checkout@v4 + + - name: "[C++] Ccache for gh actions" + uses: hendrikmuhs/ccache-action@v1.2.14 + with: + key: ${{ github.job }}-${{ matrix.os }} # Eg. "some_build-ubuntu-latest" + + - name: "Set reusable strings" + # Turn repeated input strings (such as the build output directory) into step outputs. + # These step outputs can be used throughout the workflow file. + id: strings + shell: bash + run: | + echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT" + + - name: "[C++] Cache CMake dependency source code" + uses: actions/cache@v4 + env: + cache-name: cache-cmake-dependency-sources + with: + # CMake cache is at ${{github.workspace}}/build/_deps but we only will cache folders ending in '-src' to cache source code + path: ${{github.workspace}}/build/_deps/*-src + # Cache hash is dependent on CMakeLists files anywhere as these can change what's in the cache, as well as cmake modules files + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + # it's acceptable to reuse caches for different CMakeLists content if exact match is not available and unlike build caches, we + # don't need to restrict these by OS or compiler as it's only source code that's being cached + restore-keys: | + ${{ env.cache-name }}- + + - name: "[C++] Cache CMake dependency build objects" + uses: actions/cache@v4 + env: + cache-name: cache-cmake-dependency-builds + with: + # CMake cache is at ${{github.workspace}}/build/_deps but we only care about the folders ending in -build or -subbuild + path: | + ${{github.workspace}}/build/_deps/*-build + ${{github.workspace}}/build/_deps/*-subbuild + # Cache hash is dependent on CMakeLists files anywhere as these can change what's in the cache, as well as cmake modules files + key: ${{ env.cache-name }}-${{ matrix.os }}-${{ matrix.cxx }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + # it's acceptable to reuse caches for different CMakeLists content if exact match is not available + # as long as the OS and Compiler match exactly + restore-keys: | + ${{ env.cache-name }}-${{ matrix.os }}-${{ matrix.cxx }}- + + - name: "[C++] Configure CMake" + # Configure CMake in a 'build' subdirectory. + # `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: > + cmake + -B ${{ steps.strings.outputs.build-output-dir }} + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} + -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} + -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} + -DCMAKE_C_COMPILER_LAUNCHER=ccache + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + -S ${{ github.workspace }} + + - name: "[C++] Build" + # Build your program with the given configuration. + # Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator). + run: > + cmake + --build ${{ steps.strings.outputs.build-output-dir }} + --config ${{ matrix.build_type }} + + - name: "[C++] Test" + continue-on-error: true + working-directory: ${{ steps.strings.outputs.build-output-dir }} + # Execute tests defined by the CMake configuration. + # Note that --build-config is needed because the default Windows generator is a multi-config generator (Visual Studio generator). + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest --build-config ${{ matrix.build_type }} + + - name: "[C++] Generate PB Tech (Windows)" + if: ${{ matrix.os == 'windows-latest' }} + run: build\${{matrix.build_type}}\gen_tech_pb.exe + working-directory: ${{github.workspace}} + + - name: "[C++] Generate PB Tech (Unix)" + if: ${{ matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' }} + run: build/gen_tech_pb + working-directory: ${{github.workspace}} + + - name: "[Python] Setup python ${{ matrix.python-version }}" + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: "[Python] Install Poetry" + uses: snok/install-poetry@v1 + with: + virtualenvs-create: true + virtualenvs-in-project: true + virtualenvs-path: .venv + installer-parallel: true + + - name: "[Python] Load cached venv" + id: cached-poetry-dependencies + uses: actions/cache@v4 + with: + path: .venv + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} + + - name: "[Python] Install dependencies" + run: poetry install --no-interaction --no-root + shell: bash # NOTE: required for windows poetry calls + + - name: "[Python] Install project" + run: poetry install --no-interaction + shell: bash # NOTE: required for windows poetry calls + + - name: "[Python] Install project" + run: poetry install --no-interaction + shell: bash # NOTE: required for windows poetry calls + + - name: "[Python] Build wheel and source archives" + run: poetry build --output dist + shell: bash # NOTE: required for windows poetry calls + + - name: "[Python] Store dist artifact" + uses: actions/upload-artifact@v4 + with: + name: python-dist-${{ matrix.os }}_py${{ matrix.python-version }} + path: dist + retention-days: 7 + if-no-files-found: error + + - name: "[Python] Run Unit tests" + run: > + poetry run coverage run -m pytest -m "not slow" + --alluredir ${{ env.ALLURE_RESULTS_PATH }} + --color no + shell: bash # NOTE: required for windows poetry calls + + - name: "[Python] Create coverage report" + if: success() || failure() + run: poetry run coverage html --directory ${{ env.COVERAGE_REPORT_PATH }} + shell: bash # NOTE: required for windows poetry calls + + # - name: "Print listing of build dir" + # if: success() || failure() + # run: find ${{github.workspace}}/build -path ${{github.workspace}}/build/_deps -prune -o -print + # shell: bash # NOTE: required for windows + + - name: "[Python] Store coverage results" + if: success() || failure() + uses: actions/upload-artifact@v4 + with: + name: upload-python-coverage-report-${{ matrix.os }}_py${{ matrix.python-version }} + path: ${{ env.COVERAGE_REPORT_PATH }} + retention-days: 1 + if-no-files-found: error + + - name: "[Python] Store allure test results" + if: success() || failure() + uses: actions/upload-artifact@v4 + with: + name: upload-python-allure-report-${{ matrix.os }}_py${{ matrix.python-version }} + path: ${{ env.ALLURE_RESULTS_PATH }} + retention-days: 1 + if-no-files-found: error + diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml deleted file mode 100644 index 89462e4f..00000000 --- a/.github/workflows/cmake-multi-platform.yml +++ /dev/null @@ -1,92 +0,0 @@ -# This starter workflow is for a CMake project running on multiple platforms. There is a different starter workflow if you just want a single platform. -# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-single-platform.yml -name: CMake on multiple platforms - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - build: - runs-on: ${{ matrix.os }} - - strategy: - # Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable. - fail-fast: false - - # Set up a matrix to run the following 3 configurations: - # 1. - # 2. - # 3. - # - # To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list. - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - build_type: [RelWithDebInfo] - c_compiler: [clang, cl] - include: - - os: windows-latest - c_compiler: cl - cpp_compiler: cl - - os: ubuntu-latest - c_compiler: clang - cpp_compiler: clang++ - - os: macos-latest - c_compiler: clang - cpp_compiler: clang++ - exclude: - - os: windows-latest - c_compiler: gcc - - os: windows-latest - c_compiler: clang - - os: ubuntu-latest - c_compiler: cl - - os: ubuntu-latest - c_compiler: gcc - - os: macos-latest - c_compiler: gcc - - os: macos-latest - c_compiler: cl - - steps: - - uses: actions/checkout@v4 - - - name: "[C++] Ccache for gh actions" - uses: hendrikmuhs/ccache-action@v1.2.14 - with: - key: ${{ github.job }}-${{ matrix.os }} # Eg. "some_build-ubuntu-latest" - - - name: "Set reusable strings" - # Turn repeated input strings (such as the build output directory) into step outputs. - # These step outputs can be used throughout the workflow file. - id: strings - shell: bash - run: | - echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT" - - - name: "[C++] Configure CMake" - # Configure CMake in a 'build' subdirectory. - # `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. - # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type - run: > - cmake -B ${{ steps.strings.outputs.build-output-dir }} - -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} - -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} - -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} - -DCMAKE_C_COMPILER_LAUNCHER=ccache - -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - -S ${{ github.workspace }} - - - name: "[C++] Build" - # Build your program with the given configuration. - # Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator). - run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }} - - - name: "[C++] Test" - working-directory: ${{ steps.strings.outputs.build-output-dir }} - # Execute tests defined by the CMake configuration. - # Note that --build-config is needed because the default Windows generator is a multi-config generator (Visual Studio generator). - # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: ctest --build-config ${{ matrix.build_type }} diff --git a/pyproject.toml b/pyproject.toml index f51ceabb..957e35a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,6 +4,7 @@ version = "0.1.0" description = "Parasitic Extraction Tool for KLayout" authors = ["Martin Köhler "] homepage = "https://github.com/martinjankoehler/klayout-pex" +repository = "https://github.com/martinjankoehler/klayout-pex.git" license = "GPL-3.0-or-later" readme = "README.md" keywords = ["electronic", "pex", "parasitic", "extraction", "vlsi", "eda", "ic", "spice", @@ -38,6 +39,9 @@ include = [ "build/*.json" ] +[tool.poetry.urls] +"Bug Tracker" = "https://github.com/martinjankoehler/klayout-pex/issues" + [tool.poetry.scripts] kpex = 'kpex.__main__:main'