Skip to content
Snippets Groups Projects
CMakeLists.txt 7.45 KiB
Newer Older
# 
# Copyright (c) 2015-2016 CNRS
# Copyright (c) 2015 Wandercraft, 86 rue de Paris 91400 Orsay, France.
# 
# This file is part of Pinocchio
# Pinocchio is free software: you can redistribute it
# and/or modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation, either version
# 3 of the License, or (at your option) any later version.
# Pinocchio is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Lesser Public License for more details. You should have
# received a copy of the GNU Lesser General Public License along with
# Pinocchio If not, see
# <http://www.gnu.org/licenses/>.

MACRO(ADD_GROUP GROUP_NAME FILENAMES)
  FOREACH(filename ${${FILENAMES}})
    GET_FILENAME_COMPONENT(filenamePath ${filename} PATH)
    IF(NOT (filenamePath STREQUAL ""))
      STRING(REGEX REPLACE "/" "\\\\" filenamePath ${filenamePath}) 
      SOURCE_GROUP("${GROUP_NAME}\\${filenamePath}" FILES ${filename})
    ELSE()
      SOURCE_GROUP("${GROUP_NAME}" FILES ${filename})
    ENDIF()
  ENDFOREACH()
ENDMACRO(ADD_GROUP) 

MACRO(ADD_HEADER_GROUP FILENAMES)
  ADD_GROUP("Header Files" ${FILENAMES})
ENDMACRO(ADD_HEADER_GROUP FILENAMES)

MACRO(ADD_SOURCE_GROUP FILENAMES)
  ADD_GROUP("Source Files" ${FILENAMES})
ENDMACRO(ADD_SOURCE_GROUP FILENAMES)

MACRO(SYMLINK_AND_INSTALL_HEADERS HEADERS SUBPATH)
  FOREACH(header ${HEADERS})
    GET_FILENAME_COMPONENT(headerName ${header} NAME)
    GET_FILENAME_COMPONENT(headerPath ${header} PATH)
    EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E ${LINK}
      ${CMAKE_CURRENT_SOURCE_DIR}/${header}
      ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/${SUBPATH}/${header})
    INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${header}
      DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}/SUBPATH
            PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE)
  ENDFOREACH(header)
ENDMACRO(SYMLINK_AND_INSTALL_HEADERS HEADERS SUBPATH)

# --- DEPENDENCIES --- #
SET(PKG_CONFIG_PYWRAP_REQUIRES "eigenpy >= 1.3.1")
FOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES})
  ADD_SEPARATE_DEPENDENCY(${dep})
ENDFOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES})
SET(${PYWRAP}_INSTALL_DIR "${PYTHON_SITELIB}/${PROJECT_NAME}")

SET(${PROJECT_NAME}_PYTHON_HEADERS
  eigen_container.hpp
  handler.hpp
  python.hpp
  se3.hpp
  force.hpp
  motion.hpp
  inertia.hpp
  joints-models.hpp
  joints-variant.hpp
  joint.hpp
  joint-derived.hpp
  frame.hpp
  model.hpp
  data.hpp
  algorithm/algorithms.hpp 
  parsers.hpp
  explog.hpp
  geometry-object.hpp
  geometry-model.hpp
  geometry-data.hpp
  )

SET(${PROJECT_NAME}_PARSER_PYTHON_HEADERS
  parsers/python.hpp
  )

SET(${PROJECT_NAME}_PARSER_PYTHON_SOURCES
  parsers/python/model.cpp
  )

SET(${PROJECT_NAME}_PYTHON_SOURCES
  module.cpp
  expose-SE3.cpp
  expose-motion.cpp
  expose-force.cpp
  expose-inertia.cpp
  expose-explog.cpp
  expose-joints.cpp
  expose-frame.cpp
  expose-model.cpp
  expose-data.cpp
  expose-parsers.cpp
  algorithm/expose-algorithms.cpp
  algorithm/expose-com.cpp
  algorithm/expose-kinematics.cpp
  algorithm/expose-dynamics.cpp
  algorithm/expose-crba.cpp
  algorithm/expose-rnea.cpp
  algorithm/expose-aba.cpp
  algorithm/expose-jacobian.cpp
  algorithm/expose-joints.cpp
  algorithm/expose-energy.cpp
  algorithm/expose-frames.cpp
  algorithm/expose-cat.cpp
  )

LIST(APPEND ${PROJECT_NAME}_PYTHON_HEADERS
  geometry-object.hpp
  geometry-model.hpp
  geometry-data.hpp
  )

LIST(APPEND ${PROJECT_NAME}_PYTHON_SOURCES
  expose-geometry.cpp
  algorithm/expose-geometry.cpp
  )

LIST(APPEND HEADERS ${${PROJECT_NAME}_PYTHON_HEADERS})
LIST(REMOVE_DUPLICATES HEADERS)

# Headers of the python binding
MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python")
MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python/algorithm")
SYMLINK_AND_INSTALL_HEADERS("${${PROJECT_NAME}_PYTHON_HEADERS}" "bindings/python")

# Headers of the python parser
MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/parsers/python")
SYMLINK_AND_INSTALL_HEADERS("${${PROJECT_NAME}_PARSER_PYTHON_HEADERS}" "")

# --- COMPILE WRAPPER
MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${PROJECT_NAME}")
SET(${PYWRAP}_SOURCES ${${PROJECT_NAME}_PYTHON_SOURCES} ${${PROJECT_NAME}_PARSER_PYTHON_SOURCES})
SET(${PYWRAP}_HEADERS ${${PROJECT_NAME}_PYTHON_HEADERS} ${${PROJECT_NAME}_PARSER_PYTHON_HEADERS})

ADD_LIBRARY(${PYWRAP} SHARED ${${PYWRAP}_SOURCES} ${${PYWRAP}_HEADERS})
ADD_HEADER_GROUP(${PYWRAP}_PYTHON_HEADERS)
ADD_SOURCE_GROUP(${PYWRAP}_PYTHON_SOURCES)
PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} eigenpy)

TARGET_LINK_LIBRARIES(${PYWRAP} ${PROJECT_NAME})
TARGET_LINK_BOOST_PYTHON(${PYWRAP})

IF(APPLE)
  # We need to change the extension for python bindings
  SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES SUFFIX ".so")
ENDIF(APPLE)

SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES
  LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bindings/python/lib")
  "${CMAKE_BINARY_DIR}/bindings/python/lib/lib${PYWRAP}.so"
  DESTINATION ${${PYWRAP}_INSTALL_DIR})

# --- INSTALL SCRIPTS 
SET(PYTHON_FILES
  __init__.py
  utils.py
  robot_wrapper.py
  romeo_wrapper.py
  rpy.py
  explog.py
  )

FOREACH(python ${PYTHON_FILES})
  GET_FILENAME_COMPONENT(pythonFile ${python} NAME)
  EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E ${LINK}
    ${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python}
    ${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile})
    
  # Tag pyc file as generated.
  SET_SOURCE_FILES_PROPERTIES(
    "${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}c"
    PROPERTIES GENERATED TRUE)
    
  EXECUTE_PROCESS(COMMAND
    ${PYTHON_EXECUTABLE} -m py_compile
    ${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile})
    
  # Clean generated files.
  SET_PROPERTY(
    DIRECTORY APPEND PROPERTY
    ADDITIONAL_MAKE_CLEAN_FILES
    "${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}c")
  INSTALL(FILES
    "${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python}"
    "${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}c"
    DESTINATION ${${PYWRAP}_INSTALL_DIR})
# --- PACKAGING --- #

# Format string
SET(_PKG_CONFIG_PYWRAP_LIBDIR ${${PYWRAP}_INSTALL_DIR})
SET(_PKG_CONFIG_PYWRAP_BINDIR ${${PYWRAP}_INSTALL_DIR})
SET(_PKG_CONFIG_PYWRAP_CONFLICTS)
SET(_PKG_CONFIG_PYWRAP_REQUIRES "${PROJECT_NAME}")
FOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES})
  SET(_PKG_CONFIG_PYWRAP_REQUIRES "${_PKG_CONFIG_PYWRAP_REQUIRES}, ${dep}")
ENDFOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES})

SET(_PKG_CONFIG_PYWRAP_LIBS "-L\${libdir} -l${PYWRAP}")
IF(APPLE)
  SET(_PKG_CONFIG_PYWRAP_LIBS "${_PKG_CONFIG_PYWRAP_LIBS} -Wl,-undefined,dynamic_lookup,${Boost_${UPPERCOMPONENT}_LIBRARY}")
ELSE(APPLE)
  SET(_PKG_CONFIG_PYWRAP_LIBS "${_PKG_CONFIG_PYWRAP_LIBS} ${LIBINCL_KW}boost_python")
ENDIF(APPLE)

SET(_PKG_CONFIG_PYWRAP_CFLAGS "-I\${includedir} -I/usr/local/include")
SET(_PKG_CONFIG_PYWRAP_CFLAGS "${_PKG_CONFIG_PYWRAP_CFLAGS} -I${PYTHON_INCLUDE_DIRS}")
FOREACH(cflags ${CFLAGS_DEPENDENCIES})
  SET(_PKG_CONFIG_PYWRAP_CFLAGS "${_PKG_CONFIG_PYWRAP_CFLAGS} ${cflags}")
ENDFOREACH(cflags ${CFLAGS_DEPENDENCIES})

CONFIGURE_FILE(
   "${CMAKE_CURRENT_SOURCE_DIR}/pinocchiopy.pc.cmake"
   "${CMAKE_CURRENT_BINARY_DIR}/pinocchiopy.pc")

INSTALL(
    FILES "${CMAKE_CURRENT_BINARY_DIR}/pinocchiopy.pc"
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
    PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE)