103 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			CMake
		
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			CMake
		
	
	
#Setup cache options
 | 
						|
set(GTSAM_PYTHON_VERSION "Default" CACHE STRING "Target python version for GTSAM python module. Use 'Default' to chose the default version")
 | 
						|
set(GTSAM_BUILD_PYTHON_FLAGS "" CACHE STRING "Extra flags for running Matlab PYTHON compilation")
 | 
						|
set(GTSAM_PYTHON_INSTALL_PATH "" CACHE PATH "Python toolbox destination, blank defaults to CMAKE_INSTALL_PREFIX/borg/python")
 | 
						|
if(NOT GTSAM_PYTHON_INSTALL_PATH)
 | 
						|
  set(GTSAM_PYTHON_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}/borg/python")
 | 
						|
endif() 
 | 
						|
 | 
						|
#Author: Paul Furgale Modified by Andrew Melim
 | 
						|
function(wrap_python TARGET_NAME PYTHON_MODULE_DIRECTORY)
 | 
						|
  # # Boost
 | 
						|
  # find_package(Boost COMPONENTS python filesystem system REQUIRED)
 | 
						|
  # include_directories(${Boost_INCLUDE_DIRS})
 | 
						|
 | 
						|
  # # Find Python
 | 
						|
  # FIND_PACKAGE(PythonLibs 2.7 REQUIRED)
 | 
						|
  # INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS})
 | 
						|
 | 
						|
  IF(APPLE)
 | 
						|
    # The apple framework headers don't include the numpy headers for some reason.
 | 
						|
    GET_FILENAME_COMPONENT(REAL_PYTHON_INCLUDE ${PYTHON_INCLUDE_DIRS} REALPATH)
 | 
						|
    IF( ${REAL_PYTHON_INCLUDE} MATCHES Python.framework)
 | 
						|
      message("Trying to find extra headers for numpy from ${REAL_PYTHON_INCLUDE}.")
 | 
						|
      message("Looking in ${REAL_PYTHON_INCLUDE}/../../Extras/lib/python/numpy/core/include/numpy")
 | 
						|
      FIND_PATH(NUMPY_INCLUDE_DIR arrayobject.h
 | 
						|
  ${REAL_PYTHON_INCLUDE}/../../Extras/lib/python/numpy/core/include/numpy
 | 
						|
  ${REAL_PYTHON_INCLUDE}/numpy
 | 
						|
  )
 | 
						|
      IF(${NUMPY_INCLUDE_DIR} MATCHES NOTFOUND)
 | 
						|
  message("Unable to find numpy include directories: ${NUMPY_INCLUDE_DIR}")
 | 
						|
      ELSE()
 | 
						|
  message("Found headers at ${NUMPY_INCLUDE_DIR}")
 | 
						|
  INCLUDE_DIRECTORIES(${NUMPY_INCLUDE_DIR})
 | 
						|
  INCLUDE_DIRECTORIES(${NUMPY_INCLUDE_DIR}/..)
 | 
						|
      ENDIF()
 | 
						|
    ENDIF()
 | 
						|
  ENDIF(APPLE)
 | 
						|
 | 
						|
  if(MSVC)
 | 
						|
    add_library(${moduleName}_python MODULE ${ARGN})
 | 
						|
    set_target_properties(${moduleName}_python PROPERTIES
 | 
						|
        OUTPUT_NAME         ${moduleName}_python
 | 
						|
        CLEAN_DIRECT_OUTPUT 1
 | 
						|
        VERSION             1
 | 
						|
        SOVERSION           0
 | 
						|
        SUFFIX              ".pyd")
 | 
						|
      target_link_libraries(${moduleName}_python ${Boost_PYTHON_LIBRARY} ${PYTHON_LIBRARY} ${gtsamLib}) #temp
 | 
						|
 | 
						|
    set(PYLIB_OUTPUT_FILE $<TARGET_FILE:${moduleName}_python>)
 | 
						|
    message(${PYLIB_OUTPUT_FILE})
 | 
						|
    get_filename_component(PYLIB_OUTPUT_NAME ${PYLIB_OUTPUT_FILE} NAME_WE)
 | 
						|
    set(PYLIB_SO_NAME ${PYLIB_OUTPUT_NAME}.pyd)
 | 
						|
 | 
						|
  ELSE()
 | 
						|
    # Create a shared library
 | 
						|
    add_library(${moduleName}_python SHARED ${generated_cpp_file})
 | 
						|
 | 
						|
    set_target_properties(${moduleName}_python PROPERTIES
 | 
						|
        OUTPUT_NAME         ${moduleName}_python
 | 
						|
        CLEAN_DIRECT_OUTPUT 1)
 | 
						|
      target_link_libraries(${moduleName}_python ${Boost_PYTHON_LIBRARY} ${PYTHON_LIBRARY} ${gtsamLib}) #temp
 | 
						|
    # On OSX and Linux, the python library must end in the extension .so. Build this
 | 
						|
    # filename here.
 | 
						|
    get_property(PYLIB_OUTPUT_FILE TARGET ${moduleName}_python PROPERTY LOCATION)
 | 
						|
    set(PYLIB_OUTPUT_FILE $<TARGET_FILE:${moduleName}_python>)
 | 
						|
    message(${PYLIB_OUTPUT_FILE})
 | 
						|
    get_filename_component(PYLIB_OUTPUT_NAME ${PYLIB_OUTPUT_FILE} NAME_WE)
 | 
						|
    set(PYLIB_SO_NAME lib${moduleName}_python.so)
 | 
						|
  ENDIF(MSVC)
 | 
						|
 | 
						|
  # Installs the library in the gtsam folder, which is used by setup.py to create the gtsam package
 | 
						|
  set(PYTHON_MODULE_DIRECTORY ${CMAKE_SOURCE_DIR}/python/gtsam)
 | 
						|
  # Cause the library to be output in the correct directory.
 | 
						|
  add_custom_command(TARGET ${moduleName}_python
 | 
						|
    POST_BUILD
 | 
						|
    COMMAND cp -v ${PYLIB_OUTPUT_FILE} ${PYTHON_MODULE_DIRECTORY}/${PYLIB_SO_NAME}
 | 
						|
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
 | 
						|
    COMMENT "Copying library files to python directory" )
 | 
						|
 | 
						|
  # Cause the library to be output in the correct directory.
 | 
						|
  add_custom_command(TARGET ${TARGET_NAME}
 | 
						|
    POST_BUILD
 | 
						|
    COMMAND cp -v ${PYLIB_OUTPUT_FILE} ${PYTHON_MODULE_DIRECTORY}/${PYLIB_SO_NAME}
 | 
						|
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
 | 
						|
    COMMENT "Copying library files to python directory" )
 | 
						|
 | 
						|
  get_directory_property(AMCF ADDITIONAL_MAKE_CLEAN_FILES)
 | 
						|
  list(APPEND AMCF ${PYTHON_MODULE_DIRECTORY}/${PYLIB_SO_NAME})
 | 
						|
  set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${AMCF}") 
 | 
						|
endfunction(wrap_python)
 | 
						|
 | 
						|
# Macro to get list of subdirectories
 | 
						|
macro(SUBDIRLIST result curdir)
 | 
						|
  file(GLOB children RELATIVE ${curdir} ${curdir}/*)
 | 
						|
  set(dirlist "")
 | 
						|
  foreach(child ${children})
 | 
						|
    if(IS_DIRECTORY ${curdir}/${child})
 | 
						|
        list(APPEND dirlist ${child})
 | 
						|
    endif()
 | 
						|
  endforeach()
 | 
						|
  set(${result} ${dirlist})
 | 
						|
endmacro()
 |