Skip to content

Commit 7530fc4

Browse files
Merge pull request #1 from samrensenhouse/github_action_wheels
GitHub action wheels
2 parents f492d41 + bef8fe2 commit 7530fc4

3 files changed

Lines changed: 185 additions & 100 deletions

File tree

.github/workflows/build-wheels.yml

Lines changed: 100 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,38 @@
1-
name: Build Wheels
1+
name: Build wheels
22

3-
on: [push, pull_request]
3+
on:
4+
workflow_dispatch:
45

56
jobs:
6-
build_toolkit_wheels:
7-
name: Build MacOS python 3.8
8-
runs-on: macos-10.15
9-
defaults:
10-
run:
11-
working-directory: ./owa-epanet
7+
build_wheels:
8+
name: Build wheel for cp${{ matrix.python }}-${{ matrix.platform_id }}
9+
runs-on: ubuntu-latest
10+
strategy:
11+
fail-fast: false
12+
matrix:
13+
os: [ windows-latest, ubuntu-latest, macos-latest ]
14+
python: [ 36, 37, 38, 39, 310]
15+
bitness: [ 32, 64 ]
16+
include:
17+
# Run 32 and 64 bit version in parallel for Linux and Windows
18+
- os: windows-latest
19+
bitness: 64
20+
platform_id: win_amd64
21+
- os: windows-latest
22+
bitness: 32
23+
platform_id: win32
24+
- os: ubuntu-latest
25+
bitness: 64
26+
platform_id: manylinux_x86_64
27+
- os: macos-latest
28+
bitness: 64
29+
platform_id: macosx_x86_64
30+
exclude:
31+
- os: macos-latest
32+
bitness: 32
33+
# This build was broken on OpenMP so is excluded for now
34+
- os: ubuntu-latest
35+
bitness: 32
1236

1337
steps:
1438
- name: Checkout repo
@@ -18,24 +42,79 @@ jobs:
1842

1943
- name: Install Python
2044
uses: actions/setup-python@v2
45+
46+
- uses: ilammy/msvc-dev-cmd@v1
47+
if: startsWith(matrix.os, 'windows')
48+
49+
- name: Install cibuildwheel
50+
run: python -m pip install cibuildwheel==2.2.0a1
51+
52+
- name: Build wheels
53+
run: python -m cibuildwheel --output-dir wheelhouse owa-epanet
54+
env:
55+
CIBW_BUILD: cp${{ matrix.python }}-${{ matrix.platform_id }}
56+
CIBW_BEFORE_ALL_LINUX: git submodule update --init && yum install swig -y
57+
CIBW_BEFORE_ALL_WINDOWS: git submodule update && choco install swig
58+
CIBW_BEFORE_ALL_MACOS: git submodule update && brew install swig ninja libomp
59+
CIBW_BEFORE_BUILD: pip install scikit-build==0.11.1 cmake==3.18.4
60+
CIBW_BUILD_VERBOSITY: 1
61+
CIBW_TEST_COMMAND: pytest {package}
62+
CIBW_BEFORE_TEST: pip install scikit-build==0.11.1 cmake==3.18.4
63+
CIBW_TEST_REQUIRES: pytest
64+
65+
- name: Store artifacts
66+
uses: actions/upload-artifact@v2
2167
with:
22-
python-version: 3.8
68+
path: ./wheelhouse/*.whl
69+
70+
71+
build_sdist:
72+
name: Build source distribution
73+
runs-on: ubuntu-latest
74+
steps:
75+
- uses: actions/checkout@v2
76+
with:
77+
submodules: true
2378

24-
- name: Install required system packages
25-
run: brew install swig
79+
# Had issues with not all files being pulled and this somehow resolved it
80+
- name: Fix submodules
81+
run: |
82+
cd owa-epanet
83+
rm -rf EPANET
84+
git submodule update
85+
86+
- uses: actions/setup-python@v2
87+
name: Install Python
88+
with:
89+
python-version: '3.8'
2690

27-
- name: Build wheel
91+
- name: Install dependencies
2892
run: |
29-
pip install scikit-build
30-
python setup.py bdist_wheel
93+
sudo apt update
94+
sudo apt install swig -y
95+
pip install scikit-build==0.11.1 cmake==3.18.4
3196
32-
- name: Test wheel
97+
- name: Build sdist
3398
run: |
34-
pip install pytest
35-
pip install --no-index --find-links=./dist owa-epanet
36-
pytest
99+
cd owa-epanet
100+
python setup.py sdist
37101
38-
- name: Upload artifacts
39-
uses: actions/upload-artifact@v2
102+
- uses: actions/upload-artifact@v2
103+
with:
104+
path: owa-epanet/dist/*.tar.gz
105+
106+
upload_pypi:
107+
needs: [ build_wheels, build_sdist ]
108+
runs-on: ubuntu-latest
109+
110+
steps:
111+
- uses: actions/download-artifact@v2
112+
with:
113+
name: artifact
114+
path: owa-epanet/dist
115+
116+
- uses: pypa/gh-action-pypi-publish@v1.4.2
40117
with:
41-
path: owa-epanet/dist/*.whl
118+
user: __token__
119+
password: ${{ secrets.PYPI_API_TOKEN }}
120+
repository_url: https://test.pypi.org/legacy/

owa-epanet/CMakeLists.txt

Lines changed: 80 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,103 @@
11
cmake_minimum_required(VERSION 3.8)
22

3-
project(OWA-EPANET)
3+
project(owa-epanet)
44

55
if(SKBUILD)
66
message(STATUS "The project is built using scikit-build")
77
endif()
88

9-
find_package(PythonLibs 3 REQUIRED)
10-
find_package(PythonInterp ${PYTHONLIBS_VERSION_STRING} REQUIRED)
11-
# If find_package() has difficulty finding the appropriate python
12-
# directories and libraries (especially in Windows with multiple
13-
# versions of python) set them manually as in the next three lines
14-
# below (and comment out the above two find_package() lines):
15-
# set(PYTHON_EXECUTABLE "c:/python/python38/python.exe")
16-
# set(PYTHON_INCLUDE_PATH "c:/python/python38/include")
17-
# set(PYTHON_LIBRARIES "c:/python/python38/libs/python38.lib")
9+
# Setup python
10+
if(NOT MSVC)
11+
find_package (Python3 ${PYTHON_VERSION_STRING} COMPONENTS Interpreter Development.Module EXACT REQUIRED)
12+
else()
13+
find_package (Python3 ${PYTHON_VERSION_STRING} COMPONENTS Interpreter Development EXACT REQUIRED)
14+
endif()
1815

16+
# Setup swig
1917
find_package(SWIG REQUIRED)
18+
cmake_policy(SET CMP0078 NEW)
19+
cmake_policy(SET CMP0086 NEW)
2020
include(${SWIG_USE_FILE})
2121
set(CMAKE_SWIG_FLAGS -py3)
2222

2323
message("PYTHONLIBS_VERSION_STRING: ${PYTHONLIBS_VERSION_STRING}")
2424
message("CMAKE_SWIG_FLAGS: ${CMAKE_SWIG_FLAGS}")
2525

26-
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
27-
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
28-
INCLUDE_DIRECTORIES(EPANET/include)
29-
INCLUDE_DIRECTORIES(EPANET/src/outfile/include)
30-
31-
SET(CMAKE_SWIG_FLAGS "")
32-
33-
SET_SOURCE_FILES_PROPERTIES(toolkit.i PROPERTIES CPLUSPLUS ON)
34-
SET_SOURCE_FILES_PROPERTIES(toolkit.i PROPERTIES SWIG_FLAGS "-includeall")
35-
36-
37-
# build the EPANET library
26+
# Build the EPANET library
3827
ADD_SUBDIRECTORY(EPANET)
3928

40-
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
41-
42-
SWIG_ADD_LIBRARY( toolkit LANGUAGE python SOURCES wrapper/toolkit.i )
43-
set_property(SOURCE toolkit.i PROPERTY USE_LIBRARY_INCLUDE_DIRECTORIES TRUE)
44-
set_property(TARGET epanet2 PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE)
45-
SWIG_LINK_LIBRARIES(toolkit epanet2)
29+
# Set up rpath on MacOS and Linux
30+
if(APPLE)
31+
set(PACKAGE_RPATH "@loader_path")
32+
else()
33+
set(PACKAGE_RPATH "$ORIGIN")
34+
endif()
4635

47-
SWIG_LINK_LIBRARIES(toolkit ${PYTHON_LIBRARIES})
48-
set_property(TARGET _toolkit PROPERTY INSTALL_RPATH "$ORIGIN")
4936

50-
#SWIG_ADD_LIBRARY( output LANGUAGE python SOURCES wrapper/output.i )
51-
#SET_PROPERTY( SOURCE output.i PROPERTY USE_LIBRARY_INCLUDE_DIRECTORIES TRUE )
52-
#SET_PROPERTY( TARGET epanet-output PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE )
53-
#SWIG_LINK_LIBRARIES( output epanet-output)
54-
#SWIG_LINK_LIBRARIES( output ${PYTHON_LIBRARIES} )
55-
#SET_PROPERTY( TARGET _output PROPERTY INSTALL_RPATH "$ORIGIN" )
37+
# Include files for swig
38+
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
39+
INCLUDE_DIRECTORIES(EPANET/include)
40+
INCLUDE_DIRECTORIES(EPANET/src/outfile/include)
5641

57-
IF (APPLE)
58-
set_target_properties(_toolkit PROPERTIES INSTALL_RPATH "@loader_path")
59-
ENDIF (APPLE)
6042

61-
install(TARGETS _toolkit LIBRARY DESTINATION packages/epanet)
43+
# Allow target_include_directories to be used later
44+
set_property(SOURCE wrapper/toolkit.i
45+
PROPERTY
46+
USE_TARGET_INCLUDE_DIRECTORIES TRUE
47+
)
48+
set_property(TARGET epanet2
49+
PROPERTY
50+
USE_TARGET_INCLUDE_DIRECTORIES TRUE
51+
)
52+
53+
# Create cmake target
54+
swig_add_library(toolkit
55+
TYPE
56+
MODULE
57+
LANGUAGE
58+
python
59+
SOURCES
60+
wrapper/toolkit.i
61+
)
62+
63+
target_include_directories(toolkit
64+
PUBLIC
65+
${Python3_INCLUDE_DIRS}
66+
)
67+
68+
target_link_options(toolkit
69+
PUBLIC
70+
$<$<BOOL:${APPLE}>:-undefined dynamic_lookup>
71+
)
72+
73+
74+
75+
swig_link_libraries(toolkit
76+
PUBLIC
77+
$<$<BOOL:$<C_COMPILER_ID:MSVC>>:Python3::Module>
78+
epanet2
79+
)
80+
81+
set_target_properties(toolkit
82+
PROPERTIES
83+
SWIG_COMPILE_DEFINITIONS EXPORT_OUT_API
84+
MACOSX_RPATH TRUE
85+
SKIP_BUILD_RPATH FALSE
86+
BUILD_WITH_INSTALL_RPATH FALSE
87+
INSTALL_RPATH "${PACKAGE_RPATH}"
88+
INSTALL_RPATH_USE_LINK_PATH TRUE
89+
)
90+
91+
install(TARGETS toolkit LIBRARY DESTINATION packages/epanet)
6292

6393
add_custom_command(
64-
TARGET _toolkit POST_BUILD
65-
COMMAND ${CMAKE_COMMAND} -E copy
66-
${CMAKE_CURRENT_BINARY_DIR}/toolkit.py
67-
${CMAKE_CURRENT_BINARY_DIR}/../../../packages/epanet/toolkit.py)
68-
69-
IF(WIN32)
70-
add_custom_command(
71-
TARGET _toolkit POST_BUILD
72-
COMMAND ${CMAKE_COMMAND} -E copy
73-
${CMAKE_CURRENT_BINARY_DIR}/lib/_toolkit.pyd
74-
${CMAKE_CURRENT_BINARY_DIR}/../../../packages/epanet/_toolkit.pyd)
75-
add_custom_command(
76-
TARGET _toolkit POST_BUILD
77-
COMMAND ${CMAKE_COMMAND} -E copy
78-
${CMAKE_CURRENT_BINARY_DIR}/bin/epanet2.dll
79-
${CMAKE_CURRENT_BINARY_DIR}/../../../packages/epanet/epanet2.dll)
80-
ELSE(True)
81-
add_custom_command(
82-
TARGET _toolkit POST_BUILD
83-
COMMAND ${CMAKE_COMMAND} -E copy
84-
${CMAKE_CURRENT_BINARY_DIR}/lib/libepanet2.*
85-
${CMAKE_CURRENT_BINARY_DIR}/../../../packages/epanet/)
86-
ENDIF(WIN32)
87-
88-
89-
90-
#add_custom_command(
91-
# TARGET _toolkit POST_BUILD
92-
# COMMAND ${CMAKE_COMMAND} -E copy
93-
# ${CMAKE_CURRENT_BINARY_DIR}/output.py
94-
# ${CMAKE_CURRENT_BINARY_DIR}/../../../packages/epanet/output.py)
95-
96-
#add_custom_command(
97-
# TARGET _toolkit POST_BUILD
98-
# COMMAND ${CMAKE_COMMAND} -E copy
99-
# ${CMAKE_CURRENT_BINARY_DIR}/lib/libepanet-output.*
100-
# ${CMAKE_CURRENT_BINARY_DIR}/../../../packages/epanet/)
94+
TARGET toolkit
95+
POST_BUILD
96+
COMMAND ${CMAKE_COMMAND} -E copy
97+
"${CMAKE_CURRENT_BINARY_DIR}/toolkit.py"
98+
$<$<BOOL:${WIN32}>:${CMAKE_CURRENT_BINARY_DIR}/_toolkit.pyd>
99+
$<$<BOOL:${WIN32}>:${CMAKE_CURRENT_BINARY_DIR}/bin/epanet2.dll>
100+
$<$<NOT:$<BOOL:${WIN32}>>:${CMAKE_CURRENT_BINARY_DIR}/lib/libepanet2.*>
101+
${CMAKE_SOURCE_DIR}/packages/epanet
102+
)
103+

owa-epanet/test/test_owa_epanet.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,9 @@ def test_water_age_sim():
236236
en.closeQ(ph=epanet_proj)
237237
en.closeH(ph=epanet_proj)
238238
en.close(ph=epanet_proj)
239-
assert age_list[26] == [1.0, 2.2141675704376946, 12.939125434025273, 24.44152992466322, 13.174235412569542,
240-
24.441519659540887, 15.679376648181817, 21.97064181429266, 19.048343501261524, 1.0]
239+
assert age_list[26] == pytest.approx(
240+
[1.0, 2.2141675704376946, 12.939125434025273, 24.44152992466322, 13.174235412569542,
241+
24.441519659540887, 15.679376648181817, 21.97064181429266, 19.048343501261524, 1.0])
241242
clean_dir()
242243

243244

@@ -324,6 +325,7 @@ def test_setnodevalue():
324325
assert tank_level_list ==[121.0]
325326
clean_dir()
326327

328+
327329
def test_setcurve():
328330
def make_array(values):
329331
dbl_arr = en.doubleArray(len(values))
@@ -341,6 +343,7 @@ def make_array(values):
341343
count = en.getcurvelen(ph=epanet_proj, index=curve_index)
342344
assert count == 5
343345

346+
344347
def test_coords():
345348
epanet_proj = en.createproject()
346349
en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out')

0 commit comments

Comments
 (0)