Skip to content

Commit 956129f

Browse files
Add Python Restore Packages Script for Windows (#41)
* Add Python Restore Script * Resolve comments
1 parent 42f2a60 commit 956129f

File tree

6 files changed

+124
-32
lines changed

6 files changed

+124
-32
lines changed

language-extensions/python/README.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,21 @@ Note that the Python Extension released in the current repository works with Pyt
1212
## Building
1313

1414
### Windows
15-
Installing needed packages from respective sources.
15+
There are two alternatives to building this project.
16+
17+
A. Using the [**restore-packages.cmd**](build/windows/restore-packages.cmd) script
18+
19+
1. Modify the following as appropriate
20+
- `PYTHON_VERSION` on line 8 in [**restore-packages.cmd**](build/windows/restore-packages.cmd)
21+
- `BOOST_VERSION` on line 14 in [**restore-packages.cmd**](build/windows/restore-packages.cmd)
22+
- `DEFAULT_PYTHONHOME` on line 18 in [**build-python-extension.cmd**](build/windows/build-python-extension.cmd)
23+
- `DEFAULT_BOOST_ROOT` on line 16 in [**build-python-extension.cmd**](build/windows/build-python-extension.cmd)
24+
25+
1. Run [**restore-packages.cmd**](build/windows/restore-packages.cmd)
26+
27+
1. Continue on **Step 7** below.
28+
29+
B. Installing needed packages from respective sources.
1630

1731
1. Install [CMake for Windows](https://cmake.org/download/) and [Python](https://www.python.org/downloads/release/python-379/).
1832

language-extensions/python/build/windows/build-python-extension.cmd

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ SET PYTHONEXTENSION_WORKING_DIR=%ENL_ROOT%\build-output\pythonextension\windows
1111
IF EXIST %PYTHONEXTENSION_WORKING_DIR% (RMDIR /s /q %PYTHONEXTENSION_WORKING_DIR%)
1212
MKDIR %PYTHONEXTENSION_WORKING_DIR%
1313

14-
SET DEFAULT_BOOST_ROOT=%PACKAGES_ROOT%\External-Boost.master.Boost.1.69.0.1457
15-
SET DEFAULT_BOOST_PYTHON_ROOT=%DEFAULT_BOOST_ROOT%\windows\lib
16-
SET DEFAULT_PYTHONHOME=%PACKAGES_ROOT%\Python310
14+
SET BOOST_VERSION=1.79.0
15+
SET BOOST_VERSION_IN_UNDERSCORE=1_79_0
16+
SET DEFAULT_BOOST_ROOT=%PACKAGES_ROOT%\boost_%BOOST_VERSION_IN_UNDERSCORE%
17+
SET DEFAULT_BOOST_PYTHON_ROOT=%DEFAULT_BOOST_ROOT%\stage\lib
18+
SET DEFAULT_PYTHONHOME=C:\Python310
1719
SET DEFAULT_CMAKE_ROOT=%PACKAGES_ROOT%\CMake-win64.3.15.5
1820

1921
REM Find boost, python, and cmake paths from user, or set to default for tests.
20-
REM
22+
REM
2123
SET ENVVAR_NOT_FOUND=203
2224

2325
IF "%BOOST_ROOT%" == "" (
@@ -120,7 +122,7 @@ REM Copy DLL, LIB, etc files out of debug/debug and release/release into the bui
120122
REM
121123
copy %BUILD_OUTPUT%\%CMAKE_CONFIGURATION%\* %BUILD_OUTPUT%\
122124

123-
REM This will create the Python extension package with unsigned binaries, this is used for local development and non-release builds.
125+
REM This will create the Python extension package with unsigned binaries, this is used for local development and non-release builds.
124126
REM Release builds will call create-python-extension-zip.cmd after the binaries have been signed and this will be included in the zip
125127
REM
126128
IF /I %CMAKE_CONFIGURATION%==debug (
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
SET ENL_ROOT=%~dp0..\..\..\..
2+
CALL %ENL_ROOT%\restore-packages.cmd
3+
4+
SET PACKAGES_ROOT=%ENL_ROOT%\packages
5+
6+
REM Specify the Python version to be downloaded and installed
7+
REM
8+
SET PYTHON_VERSION=3.10.2
9+
SET PYTHON_VERSION_MAJOR_MINOR=3.10
10+
SET PYTHON_VERSION_NO_DOT=310
11+
12+
REM Specify the Boost version to be downloaded and installed
13+
REM
14+
SET BOOST_VERSION=1.79.0
15+
SET BOOST_VERSION_IN_UNDERSCORE=1_79_0
16+
17+
REM Download and install Python from the official Python website
18+
REM
19+
SET PYTHON_DOWNLOAD_URL="https://www.python.org/ftp/python/%PYTHON_VERSION%/python-%PYTHON_VERSION%-amd64.exe"
20+
SET PYTHON_INSTALLATION_PATH=C:\Python%PYTHON_VERSION_NO_DOT%
21+
22+
SET "PYTHON_INSTALLATION_PATH_DOUBLE_SLASH=%PYTHON_INSTALLATION_PATH:\=\\%"
23+
24+
REM Download the Python installer using curl
25+
REM
26+
curl %PYTHON_DOWNLOAD_URL% -o "python-%PYTHON_VERSION%.exe"
27+
28+
REM Run the installer in quiet mode, install for all users, prepend Python to PATH, and specify installation directory
29+
REM
30+
"python-%PYTHON_VERSION%.exe" /quiet InstallAllUsers=1 PrependPath=1 TargetDir="%PYTHON_INSTALLATION_PATH%"
31+
32+
REM Set the PYTHONHOME and PYTHONPATH for the build session
33+
REM
34+
SET PYTHONHOME=%PYTHON_INSTALLATION_PATH%
35+
SET PYTHONPATH=%PYTHON_INSTALLATION_PATH%
36+
37+
REM Download and install pip
38+
REM
39+
curl -sS https://bootstrap.pypa.io/get-pip.py |"%PYTHON_INSTALLATION_PATH%\python.exe"
40+
41+
REM Install numpy and pandas
42+
REM
43+
"%PYTHON_INSTALLATION_PATH%\python.exe" -m pip install pandas numpy
44+
45+
REM Remove the Python installer which is no longer needed
46+
REM
47+
del "python-%PYTHON_VERSION%.exe"
48+
49+
REM Download the specified version of Boost from SourceForge
50+
REM Extract the downloaded Boost zip file to the packages directory
51+
REM Remove the Boost zip file
52+
REM Navigate to the extracted Boost directory
53+
REM
54+
curl -L -o boost_%BOOST_VERSION_IN_UNDERSCORE%.zip https://sourceforge.net/projects/boost/files/boost/%BOOST_VERSION%/boost_%BOOST_VERSION_IN_UNDERSCORE%.zip/download
55+
powershell -NoProfile -ExecutionPolicy Unrestricted -Command "Expand-Archive -Force -Path 'boost_%BOOST_VERSION_IN_UNDERSCORE%.zip' -DestinationPath '%PACKAGES_ROOT%'"
56+
del boost_%BOOST_VERSION_IN_UNDERSCORE%.zip
57+
pushd %PACKAGES_ROOT%\boost_%BOOST_VERSION_IN_UNDERSCORE%
58+
59+
REM Create a Boost user-config.jam configuration file for building Boost.Python
60+
REM
61+
echo using python : %PYTHON_VERSION_MAJOR_MINOR% : "%PYTHON_INSTALLATION_PATH_DOUBLE_SLASH%\\python" : "%PYTHON_INSTALLATION_PATH_DOUBLE_SLASH%\\include" : "%PYTHON_INSTALLATION_PATH_DOUBLE_SLASH%\\libs" ; > user-config.jam
62+
63+
REM Run Boost's bootstrap script and build Boost.Python with the created configuration
64+
REM
65+
CALL bootstrap.bat
66+
b2.exe -j12 --with-python --user-config="%PACKAGES_ROOT%\boost_%BOOST_VERSION_IN_UNDERSCORE%\user-config.jam" --debug-configuration -d0
67+
68+
REM If building in pipeline, set the PYTHONHOME here to overwrite the existing PYTHONHOME
69+
REM
70+
if NOT "%BUILD_BUILDID%"=="" (
71+
setx PYTHONHOME "%PYTHON_INSTALLATION_PATH%"
72+
)
73+
74+
popd

language-extensions/python/src/CMakeLists.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,14 @@ elseif(${PLATFORM} STREQUAL windows)
8181
set(COMPILE_OPTIONS ${COMPILE_OPTIONS} /MDd)
8282
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Zi")
8383
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /DEBUG:FULL /OPT:REF /OPT:ICF")
84-
find_library(BOOST_PYTHON_LIB libboost_python${PYTHON_VERSION_NO_DOT}-vc140-mt-gd-x64-1_69 ${BOOST_PYTHON_ROOT})
85-
find_library(BOOST_NUMPY_LIB libboost_numpy${PYTHON_VERSION_NO_DOT}-vc140-mt-gd-x64-1_69 ${BOOST_PYTHON_ROOT})
84+
find_library(BOOST_PYTHON_LIB libboost_python${PYTHON_VERSION_NO_DOT}-vc142-mt-gd-x64-1_79 ${BOOST_PYTHON_ROOT})
85+
find_library(BOOST_NUMPY_LIB libboost_numpy${PYTHON_VERSION_NO_DOT}-vc142-mt-gd-x64-1_79 ${BOOST_PYTHON_ROOT})
8686
else()
8787
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
8888
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG:FULL /OPT:REF /OPT:ICF")
8989
set(COMPILE_OPTIONS ${COMPILE_OPTIONS} /MD)
90-
find_library(BOOST_PYTHON_LIB libboost_python${PYTHON_VERSION_NO_DOT}-vc140-mt-x64-1_69 ${BOOST_PYTHON_ROOT})
91-
find_library(BOOST_NUMPY_LIB libboost_numpy${PYTHON_VERSION_NO_DOT}-vc140-mt-x64-1_69 ${BOOST_PYTHON_ROOT})
90+
find_library(BOOST_PYTHON_LIB libboost_python${PYTHON_VERSION_NO_DOT}-vc142-mt-x64-1_79 ${BOOST_PYTHON_ROOT})
91+
find_library(BOOST_NUMPY_LIB libboost_numpy${PYTHON_VERSION_NO_DOT}-vc142-mt-x64-1_79 ${BOOST_PYTHON_ROOT})
9292
endif()
9393

9494
target_compile_options(PythonExtension PRIVATE ${COMPILE_OPTIONS})
@@ -98,7 +98,7 @@ elseif(${PLATFORM} STREQUAL windows)
9898
target_compile_definitions(PythonExtension PRIVATE WIN_EXPORT)
9999

100100
file(TO_CMAKE_PATH ${PYTHONHOME}/include PYTHON_INCLUDE)
101-
file(TO_CMAKE_PATH ${BOOST_ROOT}/include BOOST_INCLUDE)
101+
file(TO_CMAKE_PATH ${BOOST_ROOT} BOOST_INCLUDE)
102102

103103
set(ADDITIONAL_INCLUDES ${PYTHON_INCLUDE} ${BOOST_INCLUDE})
104104
endif()

language-extensions/python/test/build/windows/build-pythonextension-test.cmd

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ SET PYTHONEXTENSION_TEST_WORKING_DIR=%ENL_ROOT%\build-output\pythonextension-tes
1212
RMDIR /s /q %PYTHONEXTENSION_TEST_WORKING_DIR%
1313
MKDIR %PYTHONEXTENSION_TEST_WORKING_DIR%
1414

15-
SET DEFAULT_BOOST_ROOT=%PACKAGES_ROOT%\External-Boost.master.Boost.1.69.0.1457
16-
SET DEFAULT_BOOST_PYTHON_ROOT=%DEFAULT_BOOST_ROOT%\windows\lib
17-
SET DEFAULT_PYTHONHOME=%PACKAGES_ROOT%\Python310
15+
SET BOOST_VERSION=1.79.0
16+
SET BOOST_VERSION_IN_UNDERSCORE=1_79_0
17+
SET DEFAULT_BOOST_ROOT=%PACKAGES_ROOT%\boost_%BOOST_VERSION_IN_UNDERSCORE%
18+
SET DEFAULT_BOOST_PYTHON_ROOT=%DEFAULT_BOOST_ROOT%\stage\lib
19+
SET DEFAULT_PYTHONHOME=C:\Python310
1820
SET DEFAULT_CMAKE_ROOT=%PACKAGES_ROOT%\CMake-win64.3.15.5
1921

2022
REM Find boost, python, and cmake paths from user, or set to default for tests.
21-
REM
23+
REM
2224
SET ENVVAR_NOT_FOUND=203
2325

2426
IF "%BOOST_ROOT%" == "" (

language-extensions/python/test/src/CMakeLists.txt

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,27 +32,27 @@ add_executable(pythonextension-test
3232
${PYTHONEXTENSION_TEST_SOURCE_FILES}
3333
)
3434

35-
if (${PLATFORM} STREQUAL linux)
35+
if (${PLATFORM} STREQUAL linux)
3636
target_compile_options(pythonextension-test PRIVATE -Wall -Wextra -g -O2 -fPIC -Werror -std=c++17 -Wno-unused-parameter -fshort-wchar)
3737
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,'$ORIGIN:${CMAKE_INSTALL_PREFIX}' -Wl,--no-as-needed -Wl,--export-dynamic")
38-
38+
3939
set(USR_LIB_PATH /usr/local/lib)
4040
set(PYTHON_LIB_PATH ${PYTHONHOME}/lib/python${PYTHON_VERSION}/config-${PYTHON_VERSION}-x86_64-linux-gnu)
41-
41+
4242
find_library(PYTHON_LIB python${PYTHON_VERSION} ${PYTHON_LIB_PATH})
4343
find_library(BOOST_PYTHON_LIB boost_python${PYTHON_VERSION_NO_DOT} ${BOOST_PYTHON_ROOT})
4444
find_library(BOOST_NUMPY_LIB boost_numpy${PYTHON_VERSION_NO_DOT} ${BOOST_PYTHON_ROOT})
4545

4646
file(TO_CMAKE_PATH ${INCLUDE_ROOT}/python${PYTHON_VERSION} PYTHON_INCLUDE)
4747
file(TO_CMAKE_PATH ${INCLUDE_ROOT}/boost BOOST_INCLUDE)
48-
48+
4949
set(ADDITIONAL_INCLUDES ${PYTHON_INCLUDE} ${BOOST_INCLUDE})
5050

5151
find_library(DL dl ${USR_LIB_PATH})
52-
52+
5353
set(THREADS_PREFER_PTHREAD_FLAG ON)
5454
find_package(Threads REQUIRED)
55-
55+
5656
target_link_libraries(pythonextension-test
5757
${DL}
5858
Threads::Threads
@@ -62,13 +62,13 @@ if (${PLATFORM} STREQUAL linux)
6262
file(TO_CMAKE_PATH ${ENL_ROOT}/build-output/googletest/${PLATFORM} GTEST_HOME)
6363
file(TO_CMAKE_PATH ${GTEST_HOME}/googletest-src/googletest/include GTEST_INCLUDE_DIR)
6464
file(TO_CMAKE_PATH ${GTEST_HOME}/lib/libgtest.a GTEST_LIB)
65-
65+
6666
elseif(${PLATFORM} STREQUAL windows)
6767
add_definitions(-DWIN_EXPORT -D_WIN64 -D_WINDOWS -D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING)
6868
set(COMPILE_OPTIONS /std:c++17)
69-
69+
7070
find_library(PYTHON_LIB python${PYTHON_VERSION_NO_DOT} ${PYTHONHOME}/libs)
71-
71+
7272

7373
file(TO_CMAKE_PATH ${ENL_ROOT}/packages/Microsoft.googletest.v140.windesktop.msvcstl.dyn.rt-dyn.1.8.1.3 GTEST_HOME)
7474
file(TO_CMAKE_PATH ${GTEST_HOME}/build/native/include GTEST_INCLUDE_DIR)
@@ -78,24 +78,24 @@ elseif(${PLATFORM} STREQUAL windows)
7878
#
7979
if (${CMAKE_CONFIGURATION} STREQUAL debug)
8080
set(COMPILE_OPTIONS ${COMPILE_OPTIONS} /MDd)
81-
find_library(BOOST_PYTHON_LIB libboost_python${PYTHON_VERSION_NO_DOT}-vc140-mt-gd-x64-1_69 ${BOOST_PYTHON_ROOT})
82-
find_library(BOOST_NUMPY_LIB libboost_numpy${PYTHON_VERSION_NO_DOT}-vc140-mt-gd-x64-1_69 ${BOOST_PYTHON_ROOT})
81+
find_library(BOOST_PYTHON_LIB libboost_python${PYTHON_VERSION_NO_DOT}-vc142-mt-gd-x64-1_79 ${BOOST_PYTHON_ROOT})
82+
find_library(BOOST_NUMPY_LIB libboost_numpy${PYTHON_VERSION_NO_DOT}-vc142-mt-gd-x64-1_79 ${BOOST_PYTHON_ROOT})
8383
find_library(GTEST_LIB gtestd ${GTEST_LIB_PATH})
8484
else()
8585
set(COMPILE_OPTIONS ${COMPILE_OPTIONS} /MD)
86-
find_library(BOOST_PYTHON_LIB libboost_python${PYTHON_VERSION_NO_DOT}-vc140-mt-x64-1_69 ${BOOST_PYTHON_ROOT})
87-
find_library(BOOST_NUMPY_LIB libboost_numpy${PYTHON_VERSION_NO_DOT}-vc140-mt-x64-1_69 ${BOOST_PYTHON_ROOT})
86+
find_library(BOOST_PYTHON_LIB libboost_python${PYTHON_VERSION_NO_DOT}-vc142-mt-x64-1_79 ${BOOST_PYTHON_ROOT})
87+
find_library(BOOST_NUMPY_LIB libboost_numpy${PYTHON_VERSION_NO_DOT}-vc142-mt-x64-1_79 ${BOOST_PYTHON_ROOT})
8888
find_library(GTEST_LIB gtest ${GTEST_LIB_PATH})
8989
endif()
90-
90+
9191
target_compile_options(pythonextension-test PRIVATE ${COMPILE_OPTIONS})
9292

9393
# Set the DLLEXPORT variable to export symbols
9494
#
9595
target_compile_definitions(pythonextension-test PRIVATE ${COMPILE_OPTIONS})
9696

9797
file(TO_CMAKE_PATH ${PYTHONHOME}/include PYTHON_INCLUDE)
98-
file(TO_CMAKE_PATH ${BOOST_ROOT}/include BOOST_INCLUDE)
98+
file(TO_CMAKE_PATH ${BOOST_ROOT} BOOST_INCLUDE)
9999

100100
set(ADDITIONAL_INCLUDES ${PYTHON_INCLUDE} ${BOOST_INCLUDE})
101101
endif()
@@ -123,13 +123,13 @@ endif()
123123
target_link_libraries(pythonextension-test
124124
${GTEST_LIB}
125125
${PYTHONEXTENSION_LIB}
126-
${PYTHON_LIB}
126+
${PYTHON_LIB}
127127
${BOOST_PYTHON_LIB}
128128
${BOOST_NUMPY_LIB}
129129
)
130130

131131
target_include_directories(pythonextension-test
132-
PRIVATE ${ADDITIONAL_INCLUDES}
132+
PRIVATE ${ADDITIONAL_INCLUDES}
133133
)
134134

135135
install(TARGETS pythonextension-test DESTINATION ${PYTHONEXTENSION_TEST_INSTALL_DIR})

0 commit comments

Comments
 (0)