Skip to content
Snippets Groups Projects
Commit a8080d89 authored by Guilhem Saurel's avatar Guilhem Saurel
Browse files

[CMake] multi python setup

parent 96e4f9cd
Branches topic/multipy
No related tags found
No related merge requests found
Pipeline #11601 failed
# #
# Copyright (c) 2014-2019 CNRS # Copyright (c) 2014-2020 CNRS
# Copyright (c) 2018-2020 INRIA # Copyright (c) 2018-2020 INRIA
# #
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
SET(PROJECT_NAME eigenpy) SET(PROJECT_NAME eigenpy)
SET(PROJECT_DESCRIPTION "Bindings between Numpy and Eigen using Boost.Python") SET(PROJECT_DESCRIPTION "Bindings between Numpy and Eigen using Boost.Python")
SET(PROJECT_URL "http://github.com/stack-of-tasks/eigenpy") SET(PROJECT_URL "http://github.com/stack-of-tasks/eigenpy")
SET(PROJECT_USE_CMAKE_EXPORT TRUE) SET(PROJECT_USE_CMAKE_EXPORT TRUE)
SET(PROJECT_USE_KEYWORD_LINK_LIBRARIES TRUE)
SET(PROJECT_CUSTOM_HEADER_EXTENSION "hpp") SET(PROJECT_CUSTOM_HEADER_EXTENSION "hpp")
# Check if the submodule cmake have been initialized # Check if the submodule cmake have been initialized
...@@ -35,16 +34,9 @@ STRING(REPLACE "-pedantic" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) ...@@ -35,16 +34,9 @@ STRING(REPLACE "-pedantic" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
# If needed, fix CMake policy for APPLE systems # If needed, fix CMake policy for APPLE systems
APPLY_DEFAULT_APPLE_CONFIGURATION() APPLY_DEFAULT_APPLE_CONFIGURATION()
IF(WIN32)
SET(LINK copy_if_different)
ELSE(WIN32)
SET(LINK create_symlink)
ENDIF(WIN32)
# ---------------------------------------------------- # ----------------------------------------------------
# --- OPTIONS --------------------------------------- # --- OPTIONS ---------------------------------------
# ---------------------------------------------------- # ----------------------------------------------------
OPTION(INSTALL_DOCUMENTATION "Generate and install the documentation" FALSE)
OPTION(SUFFIX_SO_VERSION "Suffix library name with its version" OFF) OPTION(SUFFIX_SO_VERSION "Suffix library name with its version" OFF)
IF(DEFINED BUILD_UNIT_TESTS) IF(DEFINED BUILD_UNIT_TESTS)
...@@ -54,19 +46,35 @@ IF(DEFINED BUILD_UNIT_TESTS) ...@@ -54,19 +46,35 @@ IF(DEFINED BUILD_UNIT_TESTS)
SET(BUILD_TESTING ${BUILD_UNIT_TESTS}) SET(BUILD_TESTING ${BUILD_UNIT_TESTS})
ENDIF(DEFINED BUILD_UNIT_TESTS) ENDIF(DEFINED BUILD_UNIT_TESTS)
FINDPYTHON()
FIND_NUMPY()
IF(WIN32) IF(WIN32)
LINK_DIRECTORIES(${PYTHON_LIBRARY_DIRS}) LINK_DIRECTORIES(${PYTHON_LIBRARY_DIRS})
ENDIF(WIN32) ENDIF(WIN32)
SET(PYWRAP "${PROJECT_NAME}_pywrap")
# ---------------------------------------------------- # ----------------------------------------------------
# --- DEPENDENCIES ----------------------------------- # --- DEPENDENCIES -----------------------------------
# ---------------------------------------------------- # ----------------------------------------------------
ADD_PROJECT_DEPENDENCY(Eigen3 REQUIRED PKG_CONFIG_REQUIRES "eigen3 >= 3.0.5") ADD_PROJECT_DEPENDENCY(Eigen3 REQUIRED)
IF(BUILD_PYTHON_INTERFACE)
FINDPYTHON()
FIND_NUMPY()
SEARCH_FOR_BOOST_PYTHON(REQUIRED)
ENDIF(BUILD_PYTHON_INTERFACE)
# ----------------------------------------------------
# --- INTERFACE --------------------------------------
# ----------------------------------------------------
ADD_LIBRARY(${PROJECT_NAME} INTERFACE)
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
SYSTEM INTERFACE
${Boost_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
INTERFACE
$<INSTALL_INTERFACE:include>)
SEARCH_FOR_BOOST_PYTHON() INSTALL(TARGETS ${PROJECT_NAME} EXPORT ${TARGETS_EXPORT_NAME} DESTINATION lib)
# ---------------------------------------------------- # ----------------------------------------------------
# --- INCLUDE ---------------------------------------- # --- INCLUDE ----------------------------------------
...@@ -143,7 +151,7 @@ SET(${PROJECT_NAME}_SOLVERS_SOURCES ...@@ -143,7 +151,7 @@ SET(${PROJECT_NAME}_SOLVERS_SOURCES
SET(${PROJECT_NAME}_DECOMPOSITIONS_SOURCES SET(${PROJECT_NAME}_DECOMPOSITIONS_SOURCES
src/decompositions/decompositions.cpp src/decompositions/decompositions.cpp
) )
SET(${PROJECT_NAME}_SOURCES SET(${PROJECT_NAME}_SOURCES
${${PROJECT_NAME}_SOLVERS_SOURCES} ${${PROJECT_NAME}_SOLVERS_SOURCES}
${${PROJECT_NAME}_DECOMPOSITIONS_SOURCES} ${${PROJECT_NAME}_DECOMPOSITIONS_SOURCES}
...@@ -166,52 +174,50 @@ SET(${PROJECT_NAME}_SOURCES ...@@ -166,52 +174,50 @@ SET(${PROJECT_NAME}_SOURCES
src/version.cpp src/version.cpp
) )
ADD_LIBRARY(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS})
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
SYSTEM PUBLIC
${Boost_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
${PYTHON_INCLUDE_DIRS}
${NUMPY_INCLUDE_DIRS}
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
$<INSTALL_INTERFACE:include>)
IF(SUFFIX_SO_VERSION)
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION})
ENDIF(SUFFIX_SO_VERSION)
IF(NOT WIN32)
TARGET_COMPILE_OPTIONS(${PROJECT_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC>:-bigobj> "-Wno-conversion")
ELSE()
TARGET_COMPILE_OPTIONS(${PROJECT_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC>:-bigobj>)
ENDIF()
TARGET_LINK_BOOST_PYTHON(${PROJECT_NAME} PUBLIC)
INSTALL(TARGETS ${PROJECT_NAME}
EXPORT ${TARGETS_EXPORT_NAME}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR})
ADD_HEADER_GROUP(${PROJECT_NAME}_HEADERS) ADD_HEADER_GROUP(${PROJECT_NAME}_HEADERS)
ADD_SOURCE_GROUP(${PROJECT_NAME}_SOURCES) ADD_SOURCE_GROUP(${PROJECT_NAME}_SOURCES)
# Install package for ROS IF(BUILD_PYTHON_INTERFACE)
install(FILES package.xml DESTINATION share/eigenpy) ADD_LIBRARY(${PY_PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS})
TARGET_LINK_LIBRARIES(${PY_PROJECT_NAME} PUBLIC ${PROJECT_NAME})
# ---------------------------------------------------- TARGET_INCLUDE_DIRECTORIES(${PY_PROJECT_NAME}
# --- PYTHON LIBRARY --------------------------------- SYSTEM PUBLIC
# ---------------------------------------------------- ${PYTHON_INCLUDE_DIR}
ADD_SUBDIRECTORY(python) ${NUMPY_INCLUDE_DIRS})
# ---------------------------------------------------- IF(SUFFIX_SO_VERSION)
# --- UNIT TEST -------------------------------------- SET_TARGET_PROPERTIES(${PY_PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION})
# ---------------------------------------------------- ENDIF(SUFFIX_SO_VERSION)
ADD_SUBDIRECTORY(unittest)
IF(NOT WIN32)
TARGET_COMPILE_OPTIONS(${PY_PROJECT_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC>:-bigobj> "-Wno-conversion")
ELSE()
TARGET_COMPILE_OPTIONS(${PY_PROJECT_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC>:-bigobj>)
ENDIF()
TARGET_LINK_BOOST_PYTHON(${PY_PROJECT_NAME} PRIVATE)
INSTALL(TARGETS ${PY_PROJECT_NAME}
EXPORT ${TARGETS_EXPORT_PY_NAME}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR})
PROJECT_INSTALL_COMPONENT(${PY_PROJECT_NAME})
# ----------------------------------------------------
# --- PYTHON LIBRARY ---------------------------------
# ----------------------------------------------------
ADD_SUBDIRECTORY(python)
# ----------------------------------------------------
# --- UNIT TEST --------------------------------------
# ----------------------------------------------------
ADD_SUBDIRECTORY(unittest)
ENDIF()
PKG_CONFIG_APPEND_LIBS(${PROJECT_NAME}) IF(NOT INSTALL_PYTHON_INTERFACE_ONLY)
PKG_CONFIG_APPEND_CFLAGS("-I${PYTHON_INCLUDE_DIRS}") # Install package for ROS
PKG_CONFIG_APPEND_CFLAGS("-I${NUMPY_INCLUDE_DIRS}") install(FILES package.xml DESTINATION "share/${PROJECT_NAME}")
PKG_CONFIG_APPEND_BOOST_LIBS(${BOOST_COMPONENTS}) ENDIF()
Subproject commit f4fca276f9feaaea1ef9b866df32f8a263a35501 Subproject commit d5fd2cc10afc094e9cb1d4db3051cb5e4d437ac2
...@@ -3,17 +3,12 @@ ...@@ -3,17 +3,12 @@
# #
# --- LIBRARY --- # # --- LIBRARY --- #
SET(PYWRAP ${PROJECT_NAME}_pywrap)
SET(PYWRAP ${PYWRAP} PARENT_SCOPE)
MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/python/${PROJECT_NAME}")
ADD_CUSTOM_TARGET(python) ADD_CUSTOM_TARGET(python)
SET_TARGET_PROPERTIES(python PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD True) SET_TARGET_PROPERTIES(python PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD True)
ADD_LIBRARY(${PYWRAP} SHARED main.cpp) ADD_LIBRARY(${PYWRAP} SHARED main.cpp)
ADD_DEPENDENCIES(python ${PYWRAP}) ADD_DEPENDENCIES(python ${PYWRAP})
TARGET_LINK_LIBRARIES(${PYWRAP} PUBLIC ${PROJECT_NAME}) TARGET_LINK_LIBRARIES(${PYWRAP} PUBLIC ${PY_PROJECT_NAME})
# BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS spews conversion warnings from int to long unsigned int. # BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS spews conversion warnings from int to long unsigned int.
# Unfortunately, using literals does not work in a macro. As such, this turns them off for the entire wrapper: # Unfortunately, using literals does not work in a macro. As such, this turns them off for the entire wrapper:
IF(NOT WIN32) IF(NOT WIN32)
...@@ -26,7 +21,7 @@ ELSE() ...@@ -26,7 +21,7 @@ ELSE()
ENDIF() ENDIF()
SET_TARGET_PROPERTIES(${PYWRAP} SET_TARGET_PROPERTIES(${PYWRAP}
PROPERTIES PROPERTIES
PREFIX "" PREFIX ""
SUFFIX ${PYTHON_EXT_SUFFIX} SUFFIX ${PYTHON_EXT_SUFFIX}
OUTPUT_NAME "${PROJECT_NAME}" OUTPUT_NAME "${PROJECT_NAME}"
...@@ -35,14 +30,11 @@ SET_TARGET_PROPERTIES(${PYWRAP} ...@@ -35,14 +30,11 @@ SET_TARGET_PROPERTIES(${PYWRAP}
INSTALL(TARGETS ${PYWRAP} DESTINATION ${${PYWRAP}_INSTALL_DIR}) INSTALL(TARGETS ${PYWRAP} DESTINATION ${${PYWRAP}_INSTALL_DIR})
# --- INSTALL SCRIPTS # --- INSTALL SCRIPTS
SET(PYTHON_FILES SET(PYTHON_FILES
__init__.py __init__.py
) )
FOREACH(python ${PYTHON_FILES}) FOREACH(python ${PYTHON_FILES})
INSTALL(FILES PYTHON_INSTALL_ON_SITE("${PROJECT_NAME}" "${python}")
"${CMAKE_CURRENT_SOURCE_DIR}/eigenpy/${python}"
DESTINATION ${${PYWRAP}_INSTALL_DIR})
ENDFOREACH(python) ENDFOREACH(python)
# #
# Copyright (c) 2014-2019 CNRS # Copyright (c) 2014-2020 CNRS
# Copyright (c) 2018-2020 INRIA # Copyright (c) 2018-2020 INRIA
# #
...@@ -12,7 +12,7 @@ MACRO(ADD_LIB_UNIT_TEST test) ...@@ -12,7 +12,7 @@ MACRO(ADD_LIB_UNIT_TEST test)
ADD_LIBRARY(${test} SHARED EXCLUDE_FROM_ALL ${test}) ADD_LIBRARY(${test} SHARED EXCLUDE_FROM_ALL ${test})
ENDIF(BUILD_TESTING) ENDIF(BUILD_TESTING)
TARGET_LINK_LIBRARIES(${test} PUBLIC ${PROJECT_NAME}) TARGET_LINK_LIBRARIES(${test} PUBLIC ${PY_PROJECT_NAME})
SET_TARGET_PROPERTIES(${test} PROPERTIES PREFIX "") SET_TARGET_PROPERTIES(${test} PROPERTIES PREFIX "")
SET_TARGET_PROPERTIES(${test} PROPERTIES SUFFIX ${PYTHON_EXT_SUFFIX}) SET_TARGET_PROPERTIES(${test} PROPERTIES SUFFIX ${PYTHON_EXT_SUFFIX})
...@@ -41,23 +41,23 @@ ADD_PYTHON_UNIT_TEST("py-return-by-ref" "unittest/python/test_return_by_ref.py" ...@@ -41,23 +41,23 @@ ADD_PYTHON_UNIT_TEST("py-return-by-ref" "unittest/python/test_return_by_ref.py"
ADD_PYTHON_UNIT_TEST("py-eigen-ref" "unittest/python/test_eigen_ref.py" "unittest") ADD_PYTHON_UNIT_TEST("py-eigen-ref" "unittest/python/test_eigen_ref.py" "unittest")
ADD_PYTHON_UNIT_TEST("py-user-type" "unittest/python/test_user_type.py" "unittest") ADD_PYTHON_UNIT_TEST("py-user-type" "unittest/python/test_user_type.py" "unittest")
ADD_PYTHON_UNIT_TEST("py-switch" "unittest/python/test_switch.py" "python/eigenpy;unittest") ADD_PYTHON_UNIT_TEST("py-switch" "unittest/python/test_switch.py" "python;unittest")
SET_TESTS_PROPERTIES("py-switch" PROPERTIES DEPENDS ${PYWRAP}) SET_TESTS_PROPERTIES("py-switch" PROPERTIES DEPENDS ${PYWRAP})
ADD_PYTHON_UNIT_TEST("py-dimensions" "unittest/python/test_dimensions.py" "python/eigenpy;unittest") ADD_PYTHON_UNIT_TEST("py-dimensions" "unittest/python/test_dimensions.py" "python;unittest")
SET_TESTS_PROPERTIES("py-dimensions" PROPERTIES DEPENDS ${PYWRAP}) SET_TESTS_PROPERTIES("py-dimensions" PROPERTIES DEPENDS ${PYWRAP})
ADD_PYTHON_UNIT_TEST("py-version" "unittest/python/test_version.py" "python/eigenpy;unittest") ADD_PYTHON_UNIT_TEST("py-version" "unittest/python/test_version.py" "python;unittest")
SET_TESTS_PROPERTIES("py-version" PROPERTIES DEPENDS ${PYWRAP}) SET_TESTS_PROPERTIES("py-version" PROPERTIES DEPENDS ${PYWRAP})
ADD_PYTHON_UNIT_TEST("py-eigen-solver" "unittest/python/test_eigen_solver.py" "python/eigenpy;unittest") ADD_PYTHON_UNIT_TEST("py-eigen-solver" "unittest/python/test_eigen_solver.py" "python;unittest")
SET_TESTS_PROPERTIES("py-eigen-solver" PROPERTIES DEPENDS ${PYWRAP}) SET_TESTS_PROPERTIES("py-eigen-solver" PROPERTIES DEPENDS ${PYWRAP})
ADD_PYTHON_UNIT_TEST("py-self-adjoint-eigen-solver" "unittest/python/test_self_adjoint_eigen_solver.py" "python/eigenpy;unittest") ADD_PYTHON_UNIT_TEST("py-self-adjoint-eigen-solver" "unittest/python/test_self_adjoint_eigen_solver.py" "python;unittest")
SET_TESTS_PROPERTIES("py-self-adjoint-eigen-solver" PROPERTIES DEPENDS ${PYWRAP}) SET_TESTS_PROPERTIES("py-self-adjoint-eigen-solver" PROPERTIES DEPENDS ${PYWRAP})
ADD_PYTHON_UNIT_TEST("py-LLT" "unittest/python/test_LLT.py" "python/eigenpy;unittest") ADD_PYTHON_UNIT_TEST("py-LLT" "unittest/python/test_LLT.py" "python;unittest")
SET_TESTS_PROPERTIES("py-LLT" PROPERTIES DEPENDS ${PYWRAP}) SET_TESTS_PROPERTIES("py-LLT" PROPERTIES DEPENDS ${PYWRAP})
ADD_PYTHON_UNIT_TEST("py-LDLT" "unittest/python/test_LDLT.py" "python/eigenpy;unittest") ADD_PYTHON_UNIT_TEST("py-LDLT" "unittest/python/test_LDLT.py" "python;unittest")
SET_TESTS_PROPERTIES("py-LDLT" PROPERTIES DEPENDS ${PYWRAP}) SET_TESTS_PROPERTIES("py-LDLT" PROPERTIES DEPENDS ${PYWRAP})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment