diff --git a/.github/workflows/build-and-test-windows-wheels.yml b/.github/workflows/build-and-test-windows-wheels.yml new file mode 100644 index 000000000..01d4f7551 --- /dev/null +++ b/.github/workflows/build-and-test-windows-wheels.yml @@ -0,0 +1,172 @@ +name: Build and test Python wheels for Windows and make PyPI release + +on: + workflow_dispatch: + push: + paths: + - '.github/workflows/build-and-test-windows-wheels.yml' + - 'include/**' + - 'scripts/**' + - 'src/**' + - 'CMakeLists.txt' + - 'setup.py' + - 'pyproject.toml' + branches: [master] + pull_request: + paths: + - '.github/workflows/**' + - 'include/**' + - 'scripts/**' + - 'src/**' + - 'tests/**' + - 'CMakeLists.txt' + - 'setup.py' + - 'pyproject.toml' + release: + types: [published] + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + # Set paths to dependencies here + BOOST_DIR: ${{ github.workspace }}\deps\boost + DXSDK_DIR: ${{ github.workspace }}\deps\DXSDK + OPENALDIR: ${{ github.workspace }}\deps\openal-soft + # Point to the correct generator and dependencies + VIZDOOM_WIN_DEPS_ROOT: ${{ github.workspace }}\deps + VIZDOOM_BUILD_GENERATOR_NAME: Visual Studio 17 2022 + +jobs: + build_and_test_wheels: + strategy: + matrix: + os: [windows-2022] + python-version: ['3.9', '3.10', '3.11', '3.12'] + fail-fast: false + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + # Gather all dependencies + - name: Set up Python ${{ matrix.python-version }} environment + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Python environment report + run: python -c "import sys; print(sys.version)" + + - name: Get deps repo + uses: actions/checkout@v4 + with: + repository: mwydmuch/ViZDoomWinDepBin + path: ${{ github.workspace }}\deps + + - name: Install boost + uses: MarkusJx/install-boost@v1.0.1 + id: install-boost + with: + # REQUIRED: Specify the required boost version + # A list of supported versions can be found here: + # https://github.com/actions/boost-versions/blob/main/versions-manifest.json + boost_version: 1.73.0 + # OPTIONAL: Specify a toolset on windows + toolset: msvc14.2 + # OPTIONAL: Specify a custom install location + boost_install_dir: ${{ github.workspace }}\deps + + - name: Download DXSDK + id: download-dxsdk + working-directory: ${{ github.workspace }}/deps + run: | + curl -L https://download.microsoft.com/download/a/e/7/ae743f1f-632b-4809-87a9-aa1bb3458e31/DXSDK_Jun10.exe -o _DX2010_.exe + 7z x _DX2010_.exe DXSDK/Include -o_DX2010_ + 7z x _DX2010_.exe DXSDK/Lib -o_DX2010_ + mv _DX2010_/DXSDK . + rm -fR _DX*_ _DX*_.exe + shell: bash + + - name: Report working directory structure (cmd) + run: | + dir . + dir deps + + - name: Report working directory structure (bash) + shell: bash + run: | + ls -la . + ls -la deps + + - name: Report env (bash) + shell: bash + env: + BOOST_ROOT: ${{ steps.install-boost.outputs.BOOST_ROOT }} + run: | + echo $BUILD_TYPE + echo $BOOST_DIR + echo $BOOST_ROOT + echo $DXSDK_DIR + echo $VIZDOOM_BUILD_GENERATOR_NAME + echo $VIZDOOM_WIN_DEPS_ROOT + + # Build + - name: Python environment report + run: python -c "import sys; print(sys.version)" + + - name: CMake report + run: cmake --version + + - name: Build + run: | + python -m pip install --upgrade pip + python -m pip install --upgrade numpy + python -m pip install --upgrade setuptools wheel twine + python setup.py bdist_wheel + + - name: Report built wheels (bash) + shell: bash + run: | + ls -l ./dist/*.whl + + # Test + - name: Install wheel (bash) + shell: bash + run: | + python -m pip install $(ls dist/vizdoom-*.whl)[test] + + - name: Test + run: | + python -m pytest tests + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + path: ./dist/*.whl + + upload_pypi: + name: Upload to PyPI + needs: [build_and_test_wheels] + runs-on: ubuntu-latest + environment: pypi + permissions: + id-token: write + if: github.event_name == 'release' && github.event.action == 'published' + steps: + - name: Download all dists + uses: actions/download-artifact@v3 + with: + # Unpacks default artifact into dist/ + # If `name: artifact` is omitted, the action will create extra parent dir + name: artifact + path: dist + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_API_TOKEN }} + # To test: + # with: + # repository_url: https://test.pypi.org/legacy/ diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index a8c3700b1..3a8d3be1e 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -3,7 +3,7 @@ name: Build and test on: push: paths: - - '.github/workflows/**' + - '.github/workflows/build-and-test.yml' - 'include/**' - 'scripts/**' - 'src/**' @@ -29,23 +29,29 @@ env: HOMEBREW_NO_INSTALL_CLEANUP: 1 jobs: - build: + build_and_test: strategy: matrix: - os: [ubuntu-20.04, ubuntu-22.04, macos-12] - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + os: [ubuntu-22.04, ubuntu-24.04, macos-13, macos-14] + python-version: ['3.9', '3.10', '3.11', '3.12'] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: recursive + - name: Report OS + run: | + echo ${{ matrix.os }} + echo ${{ runner.os }} + uname -p + - name: Install dependencies on Ubuntu if: runner.os == 'Linux' run: | - sudo apt update - sudo apt install -y cmake git libboost-all-dev libsdl2-dev libopenal-dev + sudo apt update + sudo apt install -y cmake git libboost-all-dev libsdl2-dev libopenal-dev - name: Apt report if: runner.os == 'Linux' diff --git a/.github/workflows/build-docs-dev.yml b/.github/workflows/build-docs-dev.yml index 4cdd4dd5c..741e0149f 100644 --- a/.github/workflows/build-docs-dev.yml +++ b/.github/workflows/build-docs-dev.yml @@ -13,7 +13,7 @@ jobs: env: SPHINX_GITHUB_CHANGELOG_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: recursive diff --git a/.github/workflows/build-docs-manual-version.yml b/.github/workflows/build-docs-manual-version.yml index 33bbff14f..75de00124 100644 --- a/.github/workflows/build-docs-manual-version.yml +++ b/.github/workflows/build-docs-manual-version.yml @@ -21,10 +21,10 @@ jobs: env: SPHINX_GITHUB_CHANGELOG_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 if: inputs.commit == '' - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 if: inputs.commit != '' with: ref: ${{ inputs.commit }} diff --git a/.github/workflows/build-docs-version.yml b/.github/workflows/build-docs-version.yml index ef0ee0037..187aec14c 100644 --- a/.github/workflows/build-docs-version.yml +++ b/.github/workflows/build-docs-version.yml @@ -12,7 +12,7 @@ jobs: env: SPHINX_GITHUB_CHANGELOG_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index d9213d33d..d0cd8b5cc 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: push: paths: - - '.github/workflows/**' + - '.github/workflows/build-wheels.yml' - 'include/**' - 'scripts/**' - 'src/**' @@ -21,29 +21,49 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-22.04, macos-11] + os: [ubuntu-22.04, macos-13, macos-14] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: recursive + - name: Report OS + run: | + echo ${{ matrix.os }} + echo ${{ runner.os }} + uname -p + - name: Set up QEMU if: runner.os == 'Linux' uses: docker/setup-qemu-action@v2 with: platforms: all - - name: Build wheels - uses: pypa/cibuildwheel@v2.16.5 + - name: Build manylinux wheels + if: matrix.os == 'ubuntu-22.04' + uses: pypa/cibuildwheel@v2.19.2 env: # Configure cibuildwheel to build native archs, and some emulated ones CIBW_ARCHS_LINUX: x86_64 aarch64 - CIBW_ARCHS_MACOS: x86_64 CIBW_BUILD_VERBOSITY: 3 CIBW_REPAIR_WHEEL_COMMAND_LINUX: > auditwheel show {wheel} && auditwheel repair -w {dest_dir} {wheel} + - name: Build macOS Intel wheels + if: matrix.os == 'macos-13' + uses: pypa/cibuildwheel@v2.19.2 + env: + CIBW_ARCHS_MACOS: x86_64 + CIBW_BUILD_VERBOSITY: 3 + + - name: Build macOS Apple Silicon wheels + if: matrix.os == 'macos-14' + uses: pypa/cibuildwheel@v2.19.2 + env: + CIBW_ARCHS_MACOS: arm64 + CIBW_BUILD_VERBOSITY: 3 + - name: Report built wheels run: | ls -l ./wheelhouse/*.whl @@ -57,7 +77,7 @@ jobs: name: Build source distribution runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: recursive diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index f79d0fc2a..6d3087eec 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -14,7 +14,7 @@ jobs: name: Pre-commit checks runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 - run: python -m pip install pre-commit - run: python -m pre_commit --version diff --git a/src/lib_python/CMakeLists.txt b/src/lib_python/CMakeLists.txt index 082eca535..5b95a9067 100644 --- a/src/lib_python/CMakeLists.txt +++ b/src/lib_python/CMakeLists.txt @@ -85,6 +85,17 @@ add_custom_target(assemble_package ALL COMMENT "Assembling Python package in ${VIZDOOM_PYTHON_OUTPUT_DIR}/vizdoom" ) +if(WIN32) # Copy DLLs for Windows + file(GLOB TXT_FILES "${VIZDOOM_OUTPUT_DIR}/*.dll") + + foreach(file ${TXT_FILES}) + add_custom_command( + TARGET assemble_package + COMMAND ${CMAKE_COMMAND} -E copy ${file} ${VIZDOOM_PYTHON_PACKAGE_DIR} + ) + endforeach() +endif() + set_target_properties(assemble_package PROPERTIES PROJECT_LABEL "Python package")