Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wheel building with scikit build core #3087

Open
wants to merge 119 commits into
base: develop
Choose a base branch
from

Conversation

shimwell
Copy link
Member

@shimwell shimwell commented Jul 19, 2024

Description

Just making this PR to show a bit of progress with the production of wheels using scikit build core. Tagging @hassec as he made the OpenMCExtension part of this PR.

Running pip install . in the root folder of this repo and this will compile openmc and build a wheel and then install the python package and openmc executable from the wheel with default cmake args.

It is also possible to pass in cmake args via the command line in the same line as the pip install command.

you can also run pip install . --no-clean This will do the same but it won't delete the wheel afterwards. This allows you to inspect the wheel and manually install from the wheel. The path to the wheel is printed to the terminal and will be in your /tmp folder

I've added some if(SKBUILD) statements to the CMakeLists.txt to help insure the new commands only run if the process is being driven by Scikit build core and therefore this preserves the current behavior when someone wants to build the executable with cmake

I can follow up this PR to include ciwheelbuilder to make wheels for different OS versions

Fixes # (issue)

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 15) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@shimwell
Copy link
Member Author

shimwell commented Jul 19, 2024

for anyone interested in wheels that contain DAGMC, Double Down, Embree and Moab options in the OpenMC executable then

I have that working on this branch, clone or checkout that branch
https://github.com/shimwell/openmc/tree/adding_dagmc_to_scikit_build_core
then run the script
bash pre_wheel_install_dagmc_embree_dd_moab.sh
then run
pip install . --no-clean
and your wheel will be in a sub directory of the /tmp folder (full path is printed to terminal)

@shimwell
Copy link
Member Author

shimwell commented Jul 23, 2024

just to note a new pip version is needed to pass in cmake arguments via the command line, if you get this error then upgrade pip (I'm using version 24.1.2)

pip install . --config-settings=cmake.args=-DCMAKE_BUILD_TYPE=RELEASE
>>> no such option: --config-settings

solve with

python -m pip install --upgrade pip

@shimwell
Copy link
Member Author

shimwell commented Jul 26, 2024

nice the docs on readthedocs are now working, it needed a bit of tweaking as they now installing the package with this scikit build core method.

tools/ci/gha-install.py Outdated Show resolved Hide resolved
tools/ci/gha-install.py Outdated Show resolved Hide resolved
openmc/__init__.py Outdated Show resolved Hide resolved
tools/ci/gha-script.sh Outdated Show resolved Hide resolved
@jon-proximafusion
Copy link
Contributor

Just solved a couple of conflicts to keep this branch up to date

Comment on lines +51 to +57
- name: Publish package to PyPI
if: success()
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: |
twine upload wheelhouse/*.whl
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can use the more modern trusted-publishers method and avoid the need to generate repo tokens
https://docs.pypi.org/trusted-publishers/

Suggested change
- name: Publish package to PyPI
if: success()
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: |
twine upload wheelhouse/*.whl
- name: Publish a Python distribution to PyPI
uses: pypa/gh-action-pypi-publish@release/v1

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ack

Comment on lines +47 to +49
package-dir: openmc
output-dir: wheelhouse
config-file: "{package}/pyproject.toml"
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the config-file does not need setting if the package dir is not set to openmc

Suggested change
package-dir: openmc
output-dir: wheelhouse
config-file: "{package}/pyproject.toml"
package-dir: .
output-dir: wheelhouse

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure, but in my case, I found that it was failing. I followed the guidelines provided by cibuildwheel.

@shimwell
Copy link
Member Author

shimwell commented Feb 5, 2025

python package wheel can be built and tested on this PR using these commands from this branch with python 3.12, I can't get python 3.11 to work

# build manylinux image
docker build -t openmc -f tools/ci/manylinux.dockerfile .

docker build --no-cache --build-arg Python_ABI=cp312-cp312 -t openmc_wheel:python3.12 -f tools/ci/manylinux.dockerfile .

copy out the wheels
Create a container from the built image
Copy the wheel files from the container to the wheelhouse folder on host machine
Remove the container
Create a container from the built image
Copy the wheel files from the container to the wheelhouse folder on host machine
Remove the container

docker create --name openmc_wheel_container_3.12 openmc_wheel:python3.12
mkdir wheelhouse
docker cp openmc_wheel_container_3.12:/root/openmc/dist/. wheelhouse
docker rm openmc_wheel_container_3.12

docker image for testing resulting wheel called wheeltest.Dockerfile

FROM ubuntu:22.04
RUN apt upgrade -y
RUN apt update -y
RUN apt install libmpich-dev libhdf5-serial-dev libhdf5-mpich-dev libhdf5-hl-100 libhdf5-dev -y
RUN apt install -y python3.12 python3-pip -y
COPY wheelhouse/openmc-0.15.1.dev0-cp312-cp312-manylinux_2_28_x86_64.whl .
RUN python3.11 -m pip install openmc-0.15.1.dev0-cp312-cp312-manylinux_2_28_x86_64.whl
RUN python3.11 -c "import openmc.lib"

docker build -f wheeltest.Dockerfile --build-arg python_version=3.12 .

Co-authored-by: Jon Shimwell <jon@proximafusion.com>
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
@ahnaf-tahmid-chowdhury
Copy link
Contributor

RUN python3.11 -m pip install openmc-0.15.1.dev0-cp312-cp312-manylinux_2_28_x86_64.whl

How is Python 3.11 able to install a package built for Python 3.12!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants