Compile gtsam python for windows
parent
3f32b0a50f
commit
2971d9e74e
|
@ -65,14 +65,13 @@ function build()
|
||||||
# Set to 2 cores so that Actions does not error out during resource provisioning.
|
# Set to 2 cores so that Actions does not error out during resource provisioning.
|
||||||
cmake --build build -j2
|
cmake --build build -j2
|
||||||
|
|
||||||
$PYTHON -m pip install --user build/python
|
cmake --build build --target python-install
|
||||||
}
|
}
|
||||||
|
|
||||||
function test()
|
function test()
|
||||||
{
|
{
|
||||||
cd $GITHUB_WORKSPACE/python/gtsam/tests
|
cmake --build build --target python-test
|
||||||
$PYTHON -m unittest discover -v
|
cmake --build build --target python-test-unstable
|
||||||
cd $GITHUB_WORKSPACE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# select between build or test
|
# select between build or test
|
||||||
|
|
|
@ -18,9 +18,11 @@ jobs:
|
||||||
CTEST_PARALLEL_LEVEL: 2
|
CTEST_PARALLEL_LEVEL: 2
|
||||||
CMAKE_BUILD_TYPE: ${{ matrix.build_type }}
|
CMAKE_BUILD_TYPE: ${{ matrix.build_type }}
|
||||||
PYTHON_VERSION: ${{ matrix.python_version }}
|
PYTHON_VERSION: ${{ matrix.python_version }}
|
||||||
|
BOOST_VERSION: 1.72.0
|
||||||
|
BOOST_EXE: boost_1_72_0-msvc-14.2
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
# Github Actions requires a single row to be added to the build matrix.
|
# Github Actions requires a single row to be added to the build matrix.
|
||||||
# See https://help.github.com/en/articles/workflow-syntax-for-github-actions.
|
# See https://help.github.com/en/articles/workflow-syntax-for-github-actions.
|
||||||
|
@ -30,6 +32,7 @@ jobs:
|
||||||
ubuntu-20.04-gcc-9-tbb,
|
ubuntu-20.04-gcc-9-tbb,
|
||||||
ubuntu-20.04-clang-9,
|
ubuntu-20.04-clang-9,
|
||||||
macOS-11-xcode-13.4.1,
|
macOS-11-xcode-13.4.1,
|
||||||
|
windows-2019-msbuild,
|
||||||
]
|
]
|
||||||
|
|
||||||
build_type: [Release]
|
build_type: [Release]
|
||||||
|
@ -56,6 +59,10 @@ jobs:
|
||||||
compiler: xcode
|
compiler: xcode
|
||||||
version: "13.4.1"
|
version: "13.4.1"
|
||||||
|
|
||||||
|
- name: windows-2019-msbuild
|
||||||
|
os: windows-2019
|
||||||
|
platform: 64
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
@ -97,29 +104,71 @@ jobs:
|
||||||
echo "CC=clang" >> $GITHUB_ENV
|
echo "CC=clang" >> $GITHUB_ENV
|
||||||
echo "CXX=clang++" >> $GITHUB_ENV
|
echo "CXX=clang++" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Setup msbuild (Windows)
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with:
|
||||||
|
arch: x${{matrix.platform}}
|
||||||
|
|
||||||
|
- name: Setup python (Windows)
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python_version }}
|
||||||
|
|
||||||
|
- name: Install ninja (Windows)
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
choco install ninja
|
||||||
|
ninja --version
|
||||||
|
where ninja
|
||||||
|
|
||||||
|
- name: Install Boost (Windows)
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
# Snippet from: https://github.com/actions/virtual-environments/issues/2667
|
||||||
|
$BOOST_PATH = "C:\hostedtoolcache\windows\Boost\$env:BOOST_VERSION\x86_64"
|
||||||
|
|
||||||
|
# Use the prebuilt binary for Windows
|
||||||
|
$Url = "https://sourceforge.net/projects/boost/files/boost-binaries/$env:BOOST_VERSION/$env:BOOST_EXE-${{matrix.platform}}.exe"
|
||||||
|
(New-Object System.Net.WebClient).DownloadFile($Url, "$env:TEMP\boost.exe")
|
||||||
|
Start-Process -Wait -FilePath "$env:TEMP\boost.exe" "/SILENT","/SP-","/SUPPRESSMSGBOXES","/DIR=$BOOST_PATH"
|
||||||
|
|
||||||
|
# Set the BOOST_ROOT variable
|
||||||
|
echo "BOOST_ROOT=$BOOST_PATH" >> $env:GITHUB_ENV
|
||||||
|
|
||||||
- name: Set GTSAM_WITH_TBB Flag
|
- name: Set GTSAM_WITH_TBB Flag
|
||||||
if: matrix.flag == 'tbb'
|
if: matrix.flag == 'tbb'
|
||||||
run: |
|
run: |
|
||||||
echo "GTSAM_WITH_TBB=ON" >> $GITHUB_ENV
|
echo "GTSAM_WITH_TBB=ON" >> $GITHUB_ENV
|
||||||
echo "GTSAM Uses TBB"
|
echo "GTSAM Uses TBB"
|
||||||
|
|
||||||
- name: Set Swap Space
|
- name: Set Swap Space (Linux)
|
||||||
if: runner.os == 'Linux'
|
if: runner.os == 'Linux'
|
||||||
uses: pierotofy/set-swap-space@master
|
uses: pierotofy/set-swap-space@master
|
||||||
with:
|
with:
|
||||||
swap-size-gb: 6
|
swap-size-gb: 6
|
||||||
|
|
||||||
- name: Install System Dependencies
|
- name: Install System Dependencies (Linux, macOS)
|
||||||
|
if: runner.os != 'Windows'
|
||||||
run: |
|
run: |
|
||||||
bash .github/scripts/python.sh -d
|
bash .github/scripts/python.sh -d
|
||||||
|
|
||||||
- name: Install Python Dependencies
|
- name: Install Python Dependencies
|
||||||
|
shell: bash
|
||||||
run: python$PYTHON_VERSION -m pip install -r python/dev_requirements.txt
|
run: python$PYTHON_VERSION -m pip install -r python/dev_requirements.txt
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
bash .github/scripts/python.sh -b
|
bash .github/scripts/python.sh -b
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
|
# Disable running tests for windows because some of them are failing.
|
||||||
|
# Remove this condition when you want to run tests on windows CI.
|
||||||
|
if: runner.os != 'Windows'
|
||||||
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
bash .github/scripts/python.sh -t
|
bash .github/scripts/python.sh -t
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
#include <gtsam/dllexport.h>
|
||||||
|
|
||||||
namespace gtsam {
|
namespace gtsam {
|
||||||
/**
|
/**
|
||||||
* For Python __str__().
|
* For Python __str__().
|
||||||
|
@ -11,7 +13,7 @@ namespace gtsam {
|
||||||
* of an object when it prints to cout.
|
* of an object when it prints to cout.
|
||||||
* https://stackoverflow.com/questions/5419356/redirect-stdout-stderr-to-a-string
|
* https://stackoverflow.com/questions/5419356/redirect-stdout-stderr-to-a-string
|
||||||
*/
|
*/
|
||||||
struct RedirectCout {
|
struct GTSAM_EXPORT RedirectCout {
|
||||||
/// constructor -- redirect stdout buffer to a stringstream buffer
|
/// constructor -- redirect stdout buffer to a stringstream buffer
|
||||||
RedirectCout() : ssBuffer_(), coutBuffer_(std::cout.rdbuf(ssBuffer_.rdbuf())) {}
|
RedirectCout() : ssBuffer_(), coutBuffer_(std::cout.rdbuf(ssBuffer_.rdbuf())) {}
|
||||||
|
|
||||||
|
|
|
@ -126,12 +126,12 @@ inline std::vector<DiscreteValues> cartesianProduct(const DiscreteKeys& keys) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Free version of markdown.
|
/// Free version of markdown.
|
||||||
std::string markdown(const DiscreteValues& values,
|
std::string GTSAM_EXPORT markdown(const DiscreteValues& values,
|
||||||
const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
||||||
const DiscreteValues::Names& names = {});
|
const DiscreteValues::Names& names = {});
|
||||||
|
|
||||||
/// Free version of html.
|
/// Free version of html.
|
||||||
std::string html(const DiscreteValues& values,
|
std::string GTSAM_EXPORT html(const DiscreteValues& values,
|
||||||
const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
||||||
const DiscreteValues::Names& names = {});
|
const DiscreteValues::Names& names = {});
|
||||||
|
|
||||||
|
|
|
@ -396,7 +396,7 @@ class GTSAM_EXPORT Rot3 : public LieGroup<Rot3, 3> {
|
||||||
Matrix3 AdjointMap() const { return matrix(); }
|
Matrix3 AdjointMap() const { return matrix(); }
|
||||||
|
|
||||||
// Chart at origin, depends on compile-time flag ROT3_DEFAULT_COORDINATES_MODE
|
// Chart at origin, depends on compile-time flag ROT3_DEFAULT_COORDINATES_MODE
|
||||||
struct ChartAtOrigin {
|
struct GTSAM_EXPORT ChartAtOrigin {
|
||||||
static Rot3 Retract(const Vector3& v, ChartJacobian H = {});
|
static Rot3 Retract(const Vector3& v, ChartJacobian H = {});
|
||||||
static Vector3 Local(const Rot3& r, ChartJacobian H = {});
|
static Vector3 Local(const Rot3& r, ChartJacobian H = {});
|
||||||
};
|
};
|
||||||
|
|
|
@ -42,7 +42,7 @@ using CustomErrorFunction = std::function<Vector(const CustomFactor &, const Val
|
||||||
*
|
*
|
||||||
* This factor is mainly for creating a custom factor in Python.
|
* This factor is mainly for creating a custom factor in Python.
|
||||||
*/
|
*/
|
||||||
class CustomFactor: public NoiseModelFactor {
|
class GTSAM_EXPORT CustomFactor: public NoiseModelFactor {
|
||||||
protected:
|
protected:
|
||||||
CustomErrorFunction error_function_;
|
CustomErrorFunction error_function_;
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ using MatchIndicesMap = std::map<IndexPair, CorrespondenceIndices>;
|
||||||
* correspondence indices, from each image.
|
* correspondence indices, from each image.
|
||||||
* @param Length-N list of keypoints, for N images/cameras.
|
* @param Length-N list of keypoints, for N images/cameras.
|
||||||
*/
|
*/
|
||||||
std::vector<SfmTrack2d> tracksFromPairwiseMatches(
|
std::vector<SfmTrack2d> GTSAM_EXPORT tracksFromPairwiseMatches(
|
||||||
const MatchIndicesMap& matches, const KeypointsVector& keypoints,
|
const MatchIndicesMap& matches, const KeypointsVector& keypoints,
|
||||||
bool verbose = false);
|
bool verbose = false);
|
||||||
|
|
||||||
|
|
|
@ -94,6 +94,14 @@ set(interface_headers
|
||||||
set(GTSAM_PYTHON_TARGET gtsam_py)
|
set(GTSAM_PYTHON_TARGET gtsam_py)
|
||||||
set(GTSAM_PYTHON_UNSTABLE_TARGET gtsam_unstable_py)
|
set(GTSAM_PYTHON_UNSTABLE_TARGET gtsam_unstable_py)
|
||||||
|
|
||||||
|
set(GTSAM_OUTPUT_NAME "gtsam")
|
||||||
|
set(GTSAM_UNSTABLE_OUTPUT_NAME "gtsam_unstable")
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
set(GTSAM_OUTPUT_NAME "gtsam_py")
|
||||||
|
set(GTSAM_UNSTABLE_OUTPUT_NAME "gtsam_unstable_py")
|
||||||
|
endif()
|
||||||
|
|
||||||
pybind_wrap(${GTSAM_PYTHON_TARGET} # target
|
pybind_wrap(${GTSAM_PYTHON_TARGET} # target
|
||||||
"${interface_headers}" # interface_headers
|
"${interface_headers}" # interface_headers
|
||||||
"gtsam.cpp" # generated_cpp
|
"gtsam.cpp" # generated_cpp
|
||||||
|
@ -109,12 +117,30 @@ pybind_wrap(${GTSAM_PYTHON_TARGET} # target
|
||||||
set_target_properties(${GTSAM_PYTHON_TARGET} PROPERTIES
|
set_target_properties(${GTSAM_PYTHON_TARGET} PROPERTIES
|
||||||
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
|
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
|
||||||
INSTALL_RPATH_USE_LINK_PATH TRUE
|
INSTALL_RPATH_USE_LINK_PATH TRUE
|
||||||
OUTPUT_NAME "gtsam"
|
OUTPUT_NAME "${GTSAM_OUTPUT_NAME}"
|
||||||
LIBRARY_OUTPUT_DIRECTORY "${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam"
|
LIBRARY_OUTPUT_DIRECTORY "${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam"
|
||||||
DEBUG_POSTFIX "" # Otherwise you will have a wrong name
|
DEBUG_POSTFIX "" # Otherwise you will have a wrong name
|
||||||
RELWITHDEBINFO_POSTFIX "" # Otherwise you will have a wrong name
|
RELWITHDEBINFO_POSTFIX "" # Otherwise you will have a wrong name
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
set_target_properties(${GTSAM_PYTHON_TARGET} PROPERTIES
|
||||||
|
SUFFIX ".pyd"
|
||||||
|
)
|
||||||
|
ADD_CUSTOM_COMMAND(TARGET ${GTSAM_PYTHON_TARGET} POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
"${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam/${GTSAM_OUTPUT_NAME}.pyd"
|
||||||
|
"${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam/gtsam.pyd"
|
||||||
|
)
|
||||||
|
ADD_CUSTOM_COMMAND(TARGET ${GTSAM_PYTHON_TARGET} POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
"$<TARGET_FILE:gtsam>;$<TARGET_RUNTIME_DLLS:gtsam>"
|
||||||
|
"${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam/"
|
||||||
|
COMMAND_EXPAND_LISTS
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Set the path for the GTSAM python module
|
# Set the path for the GTSAM python module
|
||||||
set(GTSAM_MODULE_PATH ${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam)
|
set(GTSAM_MODULE_PATH ${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam)
|
||||||
|
|
||||||
|
@ -188,7 +214,7 @@ if(GTSAM_UNSTABLE_BUILD_PYTHON)
|
||||||
set_target_properties(${GTSAM_PYTHON_UNSTABLE_TARGET} PROPERTIES
|
set_target_properties(${GTSAM_PYTHON_UNSTABLE_TARGET} PROPERTIES
|
||||||
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
|
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
|
||||||
INSTALL_RPATH_USE_LINK_PATH TRUE
|
INSTALL_RPATH_USE_LINK_PATH TRUE
|
||||||
OUTPUT_NAME "gtsam_unstable"
|
OUTPUT_NAME "${GTSAM_UNSTABLE_OUTPUT_NAME}"
|
||||||
LIBRARY_OUTPUT_DIRECTORY "${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam_unstable"
|
LIBRARY_OUTPUT_DIRECTORY "${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam_unstable"
|
||||||
DEBUG_POSTFIX "" # Otherwise you will have a wrong name
|
DEBUG_POSTFIX "" # Otherwise you will have a wrong name
|
||||||
RELWITHDEBINFO_POSTFIX "" # Otherwise you will have a wrong name
|
RELWITHDEBINFO_POSTFIX "" # Otherwise you will have a wrong name
|
||||||
|
@ -208,13 +234,39 @@ if(GTSAM_UNSTABLE_BUILD_PYTHON)
|
||||||
|
|
||||||
# Add gtsam_unstable to the install target
|
# Add gtsam_unstable to the install target
|
||||||
list(APPEND GTSAM_PYTHON_DEPENDENCIES ${GTSAM_PYTHON_UNSTABLE_TARGET})
|
list(APPEND GTSAM_PYTHON_DEPENDENCIES ${GTSAM_PYTHON_UNSTABLE_TARGET})
|
||||||
|
if(WIN32)
|
||||||
|
set_target_properties(${GTSAM_PYTHON_UNSTABLE_TARGET} PROPERTIES
|
||||||
|
SUFFIX ".pyd"
|
||||||
|
)
|
||||||
|
ADD_CUSTOM_COMMAND(TARGET ${GTSAM_PYTHON_UNSTABLE_TARGET} POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
"${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam_unstable/${GTSAM_UNSTABLE_OUTPUT_NAME}.pyd"
|
||||||
|
"${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam_unstable/gtsam_unstable.pyd"
|
||||||
|
)
|
||||||
|
ADD_CUSTOM_COMMAND(TARGET ${GTSAM_PYTHON_UNSTABLE_TARGET} POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
"$<TARGET_FILE:gtsam_unstable>;$<TARGET_RUNTIME_DLLS:gtsam_unstable>"
|
||||||
|
"${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam_unstable/"
|
||||||
|
COMMAND_EXPAND_LISTS
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
# Custom make command to run all GTSAM_UNSTABLE Python tests
|
||||||
|
add_custom_target(
|
||||||
|
python-test-unstable
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_COMMAND} -E env # add package to python path so no need to install
|
||||||
|
"PYTHONPATH=${GTSAM_PYTHON_BUILD_DIRECTORY}/$ENV{PYTHONPATH}"
|
||||||
|
${PYTHON_EXECUTABLE} -m unittest discover -v -s .
|
||||||
|
DEPENDS ${GTSAM_PYTHON_DEPENDENCIES} ${GTSAM_PYTHON_TEST_FILES}
|
||||||
|
WORKING_DIRECTORY "${GTSAM_PYTHON_BUILD_DIRECTORY}/gtsam_unstable/tests"
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Add custom target so we can install with `make python-install`
|
# Add custom target so we can install with `make python-install`
|
||||||
set(GTSAM_PYTHON_INSTALL_TARGET python-install)
|
set(GTSAM_PYTHON_INSTALL_TARGET python-install)
|
||||||
add_custom_target(${GTSAM_PYTHON_INSTALL_TARGET}
|
add_custom_target(${GTSAM_PYTHON_INSTALL_TARGET}
|
||||||
COMMAND ${PYTHON_EXECUTABLE} -m pip install .
|
COMMAND ${PYTHON_EXECUTABLE} -m pip install --user .
|
||||||
DEPENDS ${GTSAM_PYTHON_DEPENDENCIES}
|
DEPENDS ${GTSAM_PYTHON_DEPENDENCIES}
|
||||||
WORKING_DIRECTORY ${GTSAM_PYTHON_BUILD_DIRECTORY})
|
WORKING_DIRECTORY ${GTSAM_PYTHON_BUILD_DIRECTORY})
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,8 @@ print("PACKAGES: ", packages)
|
||||||
package_data = {
|
package_data = {
|
||||||
'': [
|
'': [
|
||||||
"./*.so",
|
"./*.so",
|
||||||
"./*.dll"
|
"./*.dll",
|
||||||
|
"./*.pyd",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue