Used python.in to generate setup.py

Also fixed cmake stuff to copy library to correct location
Minor improvements of cmake
Automatic install of python package
release/4.3a0
dellaert 2016-01-24 15:28:16 -08:00
parent 4c44ddc4e6
commit fb8a62dd1d
3 changed files with 28 additions and 45 deletions

View File

@ -1,4 +1,3 @@
# Guard to avoid breaking this code in ccmake if by accident GTSAM_PYTHON_VERSION is set to an empty string
if(GTSAM_PYTHON_VERSION STREQUAL "")
set(GTSAM_PYTHON_VERSION "Default" CACHE STRING "Target python version for GTSAM python module. Use 'Default' to chose the default version" FORCE)
@ -18,6 +17,18 @@ if(NOT (${GTSAM_PYTHON_VERSION} MATCHES ${GTSAM_LAST_PYTHON_VERSION}))
set(GTSAM_LAST_PYTHON_VERSION ${GTSAM_PYTHON_VERSION} CACHE STRING "Updating python version used in the last build" FORCE)
endif()
if(GTSAM_PYTHON_VERSION STREQUAL "Default")
# Search the default version.
find_package(PythonInterp)
find_package(PythonLibs)
else()
find_package(PythonInterp ${GTSAM_PYTHON_VERSION})
find_package(PythonLibs ${GTSAM_PYTHON_VERSION})
endif()
# Find NumPy C-API -- this is part of the numpy package
find_package(NumPy)
# Compose strings used to specify the boost python version. They will be empty if we want to use the defaut
if(NOT GTSAM_PYTHON_VERSION STREQUAL "Default")
string(REPLACE "." "" BOOST_PYTHON_VERSION_SUFFIX ${GTSAM_PYTHON_VERSION}) # Remove '.' from version
@ -29,29 +40,12 @@ else()
set(BOOST_PYTHON_VERSION_SUFFIX_UPPERCASE "")
endif()
# Find NumPy C-API -- this is part of the numpy package
find_package(NumPy)
# Find Python
# First, be sure that python version can be found by FindPythonLibs.cmake
# See: http://stackoverflow.com/a/15660652/2220173
set(Python_ADDITIONAL_VERSIONS ${GTSAM_PYTHON_VERSION})
# Then look for the the lib. If no version is specified when looking for PythonLibs it searches the default version.
# See: https://cmake.org/cmake/help/v3.1/module/FindPythonInterp.html
if(GTSAM_PYTHON_VERSION STREQUAL "Default")
find_package(PythonLibs)
else()
find_package(PythonLibs ${GTSAM_PYTHON_VERSION})
endif()
# Find Boost Python
find_package(Boost COMPONENTS python${BOOST_PYTHON_VERSION_SUFFIX})
# Build python module library and setup the module inside build
if(Boost_PYTHON${BOOST_PYTHON_VERSION_SUFFIX_UPPERCASE}_FOUND AND PYTHONLIBS_FOUND AND NUMPY_FOUND)
# Build library
include_directories(${NUMPY_INCLUDE_DIRS})
include_directories(${PYTHON_INCLUDE_DIRS})
include_directories(${Boost_INCLUDE_DIRS})
include_directories(${CMAKE_SOURCE_DIR}/gtsam/3rdparty/numpy_eigen/include/)
@ -59,24 +53,16 @@ if(Boost_PYTHON${BOOST_PYTHON_VERSION_SUFFIX_UPPERCASE}_FOUND AND PYTHONLIBS_FOU
# Build the python module library
add_subdirectory(handwritten)
# Copy all .py files that changes since last build
file(GLOB_RECURSE GTSAM_PY_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.py")
foreach(PY_SRC ${GTSAM_PY_SRCS})
string(REPLACE "/" "_" PY_SRC_TARGET_SUFFIX ${PY_SRC}) # Replace "/" with "_"
add_custom_command(
OUTPUT ${PY_SRC}
DEPENDS ${PY_SRC}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${PY_SRC} ${CMAKE_CURRENT_BINARY_DIR}/${PY_SRC}
COMMENT "Copying python/${PY_SRC}"
)
add_custom_target(copy_${PY_SRC_TARGET_SUFFIX} DEPENDS ${PY_SRC})
# Add dependency so the copy is made BEFORE building the python module
add_dependencies(gtsam_python copy_${PY_SRC_TARGET_SUFFIX})
endforeach()
# Create and invoke setup.py, see https://bloerg.net/2012/11/10/cmake-and-distutils.html
set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
# Disable python module if we didn't find required libraries
configure_file(${SETUP_PY_IN} ${SETUP_PY})
# TODO(frank): possibly support a different prefix a la matlab wrapper
install(CODE "execute_process(WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${PYTHON_EXECUTABLE} setup.py -v install --prefix ${CMAKE_INSTALL_PREFIX})")
else()
# Disable python module if we didn't find required libraries
# message will print at end of main CMakeLists.txt
SET(GTSAM_PYTHON_WARNINGS "Python dependencies not found - Python module will not be built. Set GTSAM_BUILD_PYTHON to 'Off' to disable this warning. Details:")

View File

@ -1,4 +1,3 @@
# get subdirectories list
subdirlist(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR})
@ -16,14 +15,16 @@ set_target_properties(gtsam_python PROPERTIES
SKIP_BUILD_RPATH TRUE
CLEAN_DIRECT_OUTPUT 1
)
target_link_libraries(gtsam_python ${Boost_PYTHON${BOOST_PYTHON_VERSION_SUFFIX_UPPERCASE}_LIBRARY} ${PYTHON_LIBRARY} gtsam)
target_link_libraries(gtsam_python
${Boost_PYTHON${BOOST_PYTHON_VERSION_SUFFIX_UPPERCASE}_LIBRARY}
${PYTHON_LIBRARY} gtsam)
# Cause the library to be output in the correct directory.
# TODO: Change below to work on different systems (currently works only with Linux)
add_custom_command(
OUTPUT ${CMAKE_BINARY_DIR}/python/gtsam/_libgtsam_python.so
DEPENDS gtsam_python
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:gtsam_python> ${CMAKE_BINARY_DIR}/python/gtsam/_$<TARGET_FILE_NAME:gtsam_python>
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:gtsam_python> ${CMAKE_BINARY_DIR}/python/gtsam/_libgtsam_python.so
COMMENT "Copying extension module to python/gtsam/_libgtsam_python.so"
)
add_custom_target(copy_gtsam_python_module ALL DEPENDS ${CMAKE_BINARY_DIR}/python/gtsam/_libgtsam_python.so)

10
python/setup.py → python/setup.py.in Executable file → Normal file
View File

@ -1,15 +1,11 @@
#!/usr/bin/env python
#http://docs.python.org/2/distutils/setupscript.html#setup-script
from distutils.core import setup
setup(name='gtsam',
version='4.0.0',
version='${GTSAM_VERSION_STRING}',
description='GTSAM Python wrapper',
license = "BSD",
author='Dellaert et. al',
author_email='Andrew.Melim@gatech.edu',
author='Frank Dellaert et. al',
author_email='frank.dellaert@gatech.edu',
maintainer_email='gtsam@lists.gatech.edu',
url='https://collab.cc.gatech.edu/borg/gtsam',
packages=['gtsam', 'gtsam.examples', 'gtsam.utils'],