From 6f81bdea7b078ff447a520544f04e0c2606344e3 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Tue, 9 Mar 2021 15:07:15 -0500 Subject: [PATCH] offload matlab wrapping to the wrap project --- cmake/CMakeLists.txt | 2 - cmake/GtsamMatlabWrap.cmake | 452 ++---------------------------------- python/CMakeLists.txt | 2 + 3 files changed, 19 insertions(+), 437 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 451ca38a4..6e912dd63 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -22,5 +22,3 @@ install(FILES FindNumPy.cmake README.html DESTINATION "${SCRIPT_INSTALL_DIR}/GTSAMCMakeTools") - - diff --git a/cmake/GtsamMatlabWrap.cmake b/cmake/GtsamMatlabWrap.cmake index 993af47c4..a4085fd14 100644 --- a/cmake/GtsamMatlabWrap.cmake +++ b/cmake/GtsamMatlabWrap.cmake @@ -1,26 +1,5 @@ -# Check / set dependent variables for MATLAB wrapper -if(GTSAM_INSTALL_MATLAB_TOOLBOX) - find_package(Matlab COMPONENTS MEX_COMPILER REQUIRED) - if(NOT Matlab_MEX_COMPILER) - message(FATAL_ERROR "Cannot find MEX compiler binary. Please check your Matlab installation and ensure MEX in installed as well.") - endif() - - if(GTSAM_BUILD_TYPE_POSTFIXES) - set(CURRENT_POSTFIX ${CMAKE_${CMAKE_BUILD_TYPE_UPPER}_POSTFIX}) - endif() - - if(NOT BUILD_SHARED_LIBS) - message(FATAL_ERROR "GTSAM_INSTALL_MATLAB_TOOLBOX and BUILD_SHARED_LIBS=OFF. The MATLAB wrapper cannot be compiled with a static GTSAM library because mex modules are themselves shared libraries. If you want a self-contained mex module, enable GTSAM_MEX_BUILD_STATIC_MODULE instead of BUILD_SHARED_LIBS=OFF.") - endif() -endif() - -# Fixup the Python paths -if(GTWRAP_DIR) - # packaged - set(GTWRAP_PACKAGE_DIR ${GTWRAP_DIR}) -else() - set(GTWRAP_PACKAGE_DIR ${CMAKE_SOURCE_DIR}/wrap) -endif() +# Set the wrapping script variable +set(MATLAB_WRAP_SCRIPT "${GTSAM_SOURCE_DIR}/wrap/scripts/matlab_wrap.py") # Set up cache options option(GTSAM_MEX_BUILD_STATIC_MODULE "Build MATLAB wrapper statically (increases build time)" OFF) @@ -30,419 +9,22 @@ if(NOT GTSAM_TOOLBOX_INSTALL_PATH) set(GTSAM_TOOLBOX_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}/gtsam_toolbox") endif() -# GTSAM_MEX_BUILD_STATIC_MODULE is not for Windows - on Windows any static -# are already compiled into the library by the linker -if(GTSAM_MEX_BUILD_STATIC_MODULE AND WIN32) - message(FATAL_ERROR "GTSAM_MEX_BUILD_STATIC_MODULE should not be set on Windows - the linker already automatically compiles in any dependent static libraries. To create a standalone toolbox pacakge, simply ensure that CMake finds the static versions of all dependent libraries (Boost, etc).") +set(WRAP_MEX_BUILD_STATIC_MODULE ${GTSAM_MEX_BUILD_STATIC_MODULE}) +set(WRAP_BUILD_MEX_BINARY_FLAGS ${GTSAM_BUILD_MEX_BINARY_FLAGS}) +set(WRAP_TOOLBOX_INSTALL_PATH ${GTSAM_TOOLBOX_INSTALL_PATH}) +set(WRAP_CUSTOM_MATLAB_PATH ${GTSAM_CUSTOM_MATLAB_PATH}) +set(WRAP_BUILD_TYPE_POSTFIXES ${GTSAM_BUILD_TYPE_POSTFIXES}) + +# Fixup the Python paths +if(GTWRAP_DIR) + # packaged + set(GTWRAP_PACKAGE_DIR ${GTWRAP_DIR}) +else() + set(GTWRAP_PACKAGE_DIR ${GTSAM_SOURCE_DIR}/wrap) endif() -set(MEX_COMMAND ${Matlab_MEX_COMPILER} CACHE PATH "Path to MATLAB MEX compiler") -set(MATLAB_ROOT ${Matlab_ROOT_DIR} CACHE PATH "Path to MATLAB installation root (e.g. /usr/local/MATLAB/R2012a)") +include(MatlabWrap) -# Try to automatically configure mex path from provided custom `bin` path. -if(GTSAM_CUSTOM_MATLAB_PATH) - set(matlab_bin_directory ${GTSAM_CUSTOM_MATLAB_PATH}) - - if(WIN32) - set(mex_program_name "mex.bat") - else() - set(mex_program_name "mex") - endif() - - # Run find_program explicitly putting $PATH after our predefined program - # directories using 'ENV PATH' and 'NO_SYSTEM_ENVIRONMENT_PATH' - this prevents - # finding the LaTeX mex program (totally unrelated to MATLAB Mex) when LaTeX is - # on the system path. - find_program(MEX_COMMAND ${mex_program_name} - PATHS ${matlab_bin_directory} ENV PATH - NO_DEFAULT_PATH) - - mark_as_advanced(FORCE MEX_COMMAND) - # Now that we have mex, trace back to find the Matlab installation root - get_filename_component(MEX_COMMAND "${MEX_COMMAND}" REALPATH) - get_filename_component(mex_path "${MEX_COMMAND}" PATH) - if(mex_path MATCHES ".*/win64$") - get_filename_component(MATLAB_ROOT "${mex_path}/../.." ABSOLUTE) - else() - get_filename_component(MATLAB_ROOT "${mex_path}/.." ABSOLUTE) - endif() +if(NOT BUILD_SHARED_LIBS) + message(FATAL_ERROR "GTSAM_INSTALL_MATLAB_TOOLBOX and BUILD_SHARED_LIBS=OFF. The MATLAB wrapper cannot be compiled with a static GTSAM library because mex modules are themselves shared libraries. If you want a self-contained mex module, enable GTSAM_MEX_BUILD_STATIC_MODULE instead of BUILD_SHARED_LIBS=OFF.") endif() - - -# User-friendly wrapping function. Builds a mex module from the provided -# interfaceHeader. For example, for the interface header gtsam.h, -# this will build the wrap module 'gtsam'. -# -# Arguments: -# -# interfaceHeader: The relative path to the wrapper interface definition file. -# linkLibraries: Any *additional* libraries to link. Your project library -# (e.g. `lba`), libraries it depends on, and any necessary -# MATLAB libraries will be linked automatically. So normally, -# leave this empty. -# extraIncludeDirs: Any *additional* include paths required by dependent -# libraries that have not already been added by -# include_directories. Again, normally, leave this empty. -# extraMexFlags: Any *additional* flags to pass to the compiler when building -# the wrap code. Normally, leave this empty. -function(wrap_and_install_library interfaceHeader linkLibraries extraIncludeDirs extraMexFlags) - wrap_library_internal("${interfaceHeader}" "${linkLibraries}" "${extraIncludeDirs}" "${mexFlags}") - install_wrapped_library_internal("${interfaceHeader}") -endfunction() - - -# Internal function that wraps a library and compiles the wrapper -function(wrap_library_internal interfaceHeader linkLibraries extraIncludeDirs extraMexFlags) - if(UNIX AND NOT APPLE) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(mexModuleExt mexa64) - else() - set(mexModuleExt mexglx) - endif() - elseif(APPLE) - set(mexModuleExt mexmaci64) - elseif(MSVC) - if(CMAKE_CL_64) - set(mexModuleExt mexw64) - else() - set(mexModuleExt mexw32) - endif() - endif() - - # Wrap codegen interface - #usage: wrap interfacePath moduleName toolboxPath headerPath - # interfacePath : *absolute* path to directory of module interface file - # moduleName : the name of the module, interface file must be called moduleName.h - # toolboxPath : the directory in which to generate the wrappers - # headerPath : path to matlab.h - - # Extract module name from interface header file name - get_filename_component(interfaceHeader "${interfaceHeader}" ABSOLUTE) - get_filename_component(modulePath "${interfaceHeader}" PATH) - get_filename_component(moduleName "${interfaceHeader}" NAME_WE) - - # Paths for generated files - set(generated_files_path "${PROJECT_BINARY_DIR}/wrap/${moduleName}") - set(generated_cpp_file "${generated_files_path}/${moduleName}_wrapper.cpp") - set(compiled_mex_modules_root "${PROJECT_BINARY_DIR}/wrap/${moduleName}_mex") - - message(STATUS "Building wrap module ${moduleName}") - - # Find matlab.h in GTSAM - if(("${PROJECT_NAME}" STREQUAL "gtsam") OR - ("${PROJECT_NAME}" STREQUAL "gtsam_unstable")) - set(matlab_h_path "${PROJECT_SOURCE_DIR}") - else() - if(NOT GTSAM_INCLUDE_DIR) - message(FATAL_ERROR "You must call find_package(GTSAM) before using wrap") - endif() - list(GET GTSAM_INCLUDE_DIR 0 installed_includes_path) - set(matlab_h_path "${installed_includes_path}/wrap") - endif() - - # If building a static mex module, add all cmake-linked libraries to the - # explicit link libraries list so that the next block of code can unpack - # any static libraries - set(automaticDependencies "") - foreach(lib ${moduleName} ${linkLibraries}) - #message("MODULE NAME: ${moduleName}") - if(TARGET "${lib}") - get_target_property(dependentLibraries ${lib} INTERFACE_LINK_LIBRARIES) - # message("DEPENDENT LIBRARIES: ${dependentLibraries}") - if(dependentLibraries) - list(APPEND automaticDependencies ${dependentLibraries}) - endif() - endif() - endforeach() - - ## CHRIS: Temporary fix. On my system the get_target_property above returned Not-found for gtsam module - ## This needs to be fixed!! - if(UNIX AND NOT APPLE) - list(APPEND automaticDependencies ${Boost_SERIALIZATION_LIBRARY_RELEASE} ${Boost_FILESYSTEM_LIBRARY_RELEASE} - ${Boost_SYSTEM_LIBRARY_RELEASE} ${Boost_THREAD_LIBRARY_RELEASE} ${Boost_DATE_TIME_LIBRARY_RELEASE}) - if(Boost_TIMER_LIBRARY_RELEASE AND NOT GTSAM_DISABLE_NEW_TIMERS) # Only present in Boost >= 1.48.0 - list(APPEND automaticDependencies ${Boost_TIMER_LIBRARY_RELEASE} ${Boost_CHRONO_LIBRARY_RELEASE}) - if(GTSAM_MEX_BUILD_STATIC_MODULE) - #list(APPEND automaticDependencies -Wl,--no-as-needed -lrt) - endif() - endif() - endif() - - #message("AUTOMATIC DEPENDENCIES: ${automaticDependencies}") - ## CHRIS: End temporary fix - - # Separate dependencies - set(correctedOtherLibraries "") - set(otherLibraryTargets "") - set(otherLibraryNontargets "") - set(otherSourcesAndObjects "") - foreach(lib ${moduleName} ${linkLibraries} ${automaticDependencies}) - if(TARGET "${lib}") - if(GTSAM_MEX_BUILD_STATIC_MODULE) - get_target_property(target_sources ${lib} SOURCES) - list(APPEND otherSourcesAndObjects ${target_sources}) - else() - list(APPEND correctedOtherLibraries ${lib}) - list(APPEND otherLibraryTargets ${lib}) - endif() - else() - get_filename_component(file_extension "${lib}" EXT) - get_filename_component(lib_name "${lib}" NAME_WE) - if(file_extension STREQUAL ".a" AND GTSAM_MEX_BUILD_STATIC_MODULE) - # For building a static MEX module, unpack the static library - # and compile its object files into our module - file(MAKE_DIRECTORY "${generated_files_path}/${lib_name}_objects") - execute_process(COMMAND ar -x "${lib}" - WORKING_DIRECTORY "${generated_files_path}/${lib_name}_objects" - RESULT_VARIABLE ar_result) - if(NOT ar_result EQUAL 0) - message(FATAL_ERROR "Failed extracting ${lib}") - endif() - - # Get list of object files - execute_process(COMMAND ar -t "${lib}" - OUTPUT_VARIABLE object_files - RESULT_VARIABLE ar_result) - if(NOT ar_result EQUAL 0) - message(FATAL_ERROR "Failed listing ${lib}") - endif() - - # Add directory to object files - string(REPLACE "\n" ";" object_files_list "${object_files}") - foreach(object_file ${object_files_list}) - get_filename_component(file_extension "${object_file}" EXT) - if(file_extension STREQUAL ".o") - list(APPEND otherSourcesAndObjects "${generated_files_path}/${lib_name}_objects/${object_file}") - endif() - endforeach() - else() - list(APPEND correctedOtherLibraries ${lib}) - list(APPEND otherLibraryNontargets ${lib}) - endif() - endif() - endforeach() - - # Check libraries for conflicting versions built-in to MATLAB - set(dependentLibraries "") - if(NOT "${otherLibraryTargets}" STREQUAL "") - foreach(target ${otherLibraryTargets}) - get_target_property(dependentLibrariesOne ${target} INTERFACE_LINK_LIBRARIES) - list(APPEND dependentLibraries ${dependentLibrariesOne}) - endforeach() - endif() - list(APPEND dependentLibraries ${otherLibraryNontargets}) - check_conflicting_libraries_internal("${dependentLibraries}") - - # Set up generation of module source file - file(MAKE_DIRECTORY "${generated_files_path}") - - find_package(PythonInterp - ${GTSAM_PYTHON_VERSION} - EXACT - REQUIRED) - find_package(PythonLibs - ${GTSAM_PYTHON_VERSION} - EXACT - REQUIRED) - - - set(_ignore gtsam::Point2 - gtsam::Point3 - gtsam::BearingRangeFactor - gtsam::BearingRangeFactor2D - gtsam::BearingRangeFactorPose2) - - # set the matlab wrapping script variable - set(MATLAB_WRAP_SCRIPT "${GTSAM_SOURCE_DIR}/wrap/scripts/matlab_wrap.py") - - add_custom_command( - OUTPUT ${generated_cpp_file} - DEPENDS ${interfaceHeader} ${module_library_target} ${otherLibraryTargets} ${otherSourcesAndObjects} - COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${GTWRAP_PACKAGE_DIR}${GTWRAP_PATH_SEPARATOR}$ENV{PYTHONPATH}" - ${PYTHON_EXECUTABLE} - ${MATLAB_WRAP_SCRIPT} - --src ${interfaceHeader} - --module_name ${moduleName} - --out ${generated_files_path} - --top_module_namespaces ${moduleName} - --ignore ${_ignore} - VERBATIM - WORKING_DIRECTORY ${generated_files_path}) - - # Set up building of mex module - string(REPLACE ";" " " extraMexFlagsSpaced "${extraMexFlags}") - string(REPLACE ";" " " mexFlagsSpaced "${GTSAM_BUILD_MEX_BINARY_FLAGS}") - add_library(${moduleName}_matlab_wrapper MODULE ${generated_cpp_file} ${interfaceHeader} ${otherSourcesAndObjects}) - target_link_libraries(${moduleName}_matlab_wrapper ${correctedOtherLibraries}) - target_link_libraries(${moduleName}_matlab_wrapper ${moduleName}) - set_target_properties(${moduleName}_matlab_wrapper PROPERTIES - OUTPUT_NAME "${moduleName}_wrapper" - PREFIX "" - SUFFIX ".${mexModuleExt}" - LIBRARY_OUTPUT_DIRECTORY "${compiled_mex_modules_root}" - ARCHIVE_OUTPUT_DIRECTORY "${compiled_mex_modules_root}" - RUNTIME_OUTPUT_DIRECTORY "${compiled_mex_modules_root}" - CLEAN_DIRECT_OUTPUT 1) - set_property(TARGET ${moduleName}_matlab_wrapper APPEND_STRING PROPERTY COMPILE_FLAGS " ${extraMexFlagsSpaced} ${mexFlagsSpaced} \"-I${MATLAB_ROOT}/extern/include\" -DMATLAB_MEX_FILE -DMX_COMPAT_32") - set_property(TARGET ${moduleName}_matlab_wrapper APPEND PROPERTY INCLUDE_DIRECTORIES ${extraIncludeDirs}) - # Disable build type postfixes for the mex module - we install in different directories for each build type instead - foreach(build_type ${CMAKE_CONFIGURATION_TYPES}) - string(TOUPPER "${build_type}" build_type_upper) - set_target_properties(${moduleName}_matlab_wrapper PROPERTIES ${build_type_upper}_POSTFIX "") - endforeach() - # Set up platform-specific flags - if(MSVC) - if(CMAKE_CL_64) - set(mxLibPath "${MATLAB_ROOT}/extern/lib/win64/microsoft") - else() - set(mxLibPath "${MATLAB_ROOT}/extern/lib/win32/microsoft") - endif() - target_link_libraries(${moduleName}_matlab_wrapper "${mxLibPath}/libmex.lib" "${mxLibPath}/libmx.lib" "${mxLibPath}/libmat.lib") - set_target_properties(${moduleName}_matlab_wrapper PROPERTIES LINK_FLAGS "/export:mexFunction") - set_property(SOURCE "${generated_cpp_file}" APPEND PROPERTY COMPILE_FLAGS "/bigobj") - elseif(APPLE) - set(mxLibPath "${MATLAB_ROOT}/bin/maci64") - target_link_libraries(${moduleName}_matlab_wrapper "${mxLibPath}/libmex.dylib" "${mxLibPath}/libmx.dylib" "${mxLibPath}/libmat.dylib") - endif() - - # Hacking around output issue with custom command - # Deletes generated build folder - add_custom_target(wrap_${moduleName}_matlab_distclean - COMMAND cmake -E remove_directory ${generated_files_path} - COMMAND cmake -E remove_directory ${compiled_mex_modules_root}) -endfunction() - -# Internal function that installs a wrap toolbox -function(install_wrapped_library_internal interfaceHeader) - get_filename_component(moduleName "${interfaceHeader}" NAME_WE) - set(generated_files_path "${PROJECT_BINARY_DIR}/wrap/${moduleName}") - - # NOTE: only installs .m and mex binary files (not .cpp) - the trailing slash on the directory name - # here prevents creating the top-level module name directory in the destination. - message(STATUS "Installing Matlab Toolbox to ${GTSAM_TOOLBOX_INSTALL_PATH}") - if(GTSAM_BUILD_TYPE_POSTFIXES) - foreach(build_type ${CMAKE_CONFIGURATION_TYPES}) - string(TOUPPER "${build_type}" build_type_upper) - if(${build_type_upper} STREQUAL "RELEASE") - set(build_type_tag "") # Don't create release mode tag on installed directory - else() - set(build_type_tag "${build_type}") - endif() - # Split up filename to strip trailing '/' in GTSAM_TOOLBOX_INSTALL_PATH if there is one - get_filename_component(location "${GTSAM_TOOLBOX_INSTALL_PATH}" PATH) - get_filename_component(name "${GTSAM_TOOLBOX_INSTALL_PATH}" NAME) - install(DIRECTORY "${generated_files_path}/" DESTINATION "${location}/${name}${build_type_tag}" CONFIGURATIONS "${build_type}" FILES_MATCHING PATTERN "*.m") - install(TARGETS ${moduleName}_matlab_wrapper - LIBRARY DESTINATION "${location}/${name}${build_type_tag}" CONFIGURATIONS "${build_type}" - RUNTIME DESTINATION "${location}/${name}${build_type_tag}" CONFIGURATIONS "${build_type}") - endforeach() - else() - install(DIRECTORY "${generated_files_path}/" DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH} FILES_MATCHING PATTERN "*.m") - install(TARGETS ${moduleName}_matlab_wrapper - LIBRARY DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH} - RUNTIME DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}) - endif() -endfunction() - -# Internal function to check for libraries installed with MATLAB that may conflict -# and prints a warning to move them if problems occur. -function(check_conflicting_libraries_internal libraries) - if(UNIX) - # Set path for matlab's built-in libraries - if(APPLE) - set(mxLibPath "${MATLAB_ROOT}/bin/maci64") - else() - if(CMAKE_CL_64) - set(mxLibPath "${MATLAB_ROOT}/bin/glnxa64") - else() - set(mxLibPath "${MATLAB_ROOT}/bin/glnx86") - endif() - endif() - - # List matlab's built-in libraries - file(GLOB matlabLibs RELATIVE "${mxLibPath}" "${mxLibPath}/lib*") - - # Convert to base names - set(matlabLibNames "") - foreach(lib ${matlabLibs}) - get_filename_component(libName "${lib}" NAME_WE) - list(APPEND matlabLibNames "${libName}") - endforeach() - - # Get names of link libraries - set(linkLibNames "") - foreach(lib ${libraries}) - string(FIND "${lib}" "/" slashPos) - if(NOT slashPos EQUAL -1) - # If the name is a path, just get the library name - get_filename_component(libName "${lib}" NAME_WE) - list(APPEND linkLibNames "${libName}") - else() - # It's not a path, so see if it looks like a filename - get_filename_component(ext "${lib}" EXT) - if(NOT "${ext}" STREQUAL "") - # It's a filename, so get the base name - get_filename_component(libName "${lib}" NAME_WE) - list(APPEND linkLibNames "${libName}") - else() - # It's not a filename so it must be a short name, add the "lib" prefix - list(APPEND linkLibNames "lib${lib}") - endif() - endif() - endforeach() - - # Remove duplicates - list(REMOVE_DUPLICATES linkLibNames) - - set(conflictingLibs "") - foreach(lib ${linkLibNames}) - list(FIND matlabLibNames "${lib}" libPos) - if(NOT libPos EQUAL -1) - if(NOT conflictingLibs STREQUAL "") - set(conflictingLibs "${conflictingLibs}, ") - endif() - set(conflictingLibs "${conflictingLibs}${lib}") - endif() - endforeach() - - if(NOT "${conflictingLibs}" STREQUAL "") - message(WARNING "GTSAM links to the libraries [ ${conflictingLibs} ] on your system, but " - "MATLAB is distributed with its own versions of these libraries which may conflict. " - "If you get strange errors or crashes with the GTSAM MATLAB wrapper, move these " - "libraries out of MATLAB's built-in library directory, which is ${mxLibPath} on " - "your system. MATLAB will usually still work with these libraries moved away, but " - "if not, you'll have to compile the static GTSAM MATLAB wrapper module.") - endif() - endif() -endfunction() - -# Helper function to install MATLAB scripts and handle multiple build types where the scripts -# should be installed to all build type toolboxes -function(install_matlab_scripts source_directory patterns) - set(patterns_args "") - set(exclude_patterns "") - if(NOT GTSAM_WRAP_SERIALIZATION) - set(exclude_patterns "testSerialization.m") - endif() - - foreach(pattern ${patterns}) - list(APPEND patterns_args PATTERN "${pattern}") - endforeach() - if(GTSAM_BUILD_TYPE_POSTFIXES) - foreach(build_type ${CMAKE_CONFIGURATION_TYPES}) - string(TOUPPER "${build_type}" build_type_upper) - if(${build_type_upper} STREQUAL "RELEASE") - set(build_type_tag "") # Don't create release mode tag on installed directory - else() - set(build_type_tag "${build_type}") - endif() - # Split up filename to strip trailing '/' in GTSAM_TOOLBOX_INSTALL_PATH if there is one - get_filename_component(location "${GTSAM_TOOLBOX_INSTALL_PATH}" PATH) - get_filename_component(name "${GTSAM_TOOLBOX_INSTALL_PATH}" NAME) - install(DIRECTORY "${source_directory}" DESTINATION "${location}/${name}${build_type_tag}" CONFIGURATIONS "${build_type}" FILES_MATCHING ${patterns_args} PATTERN "${exclude_patterns}" EXCLUDE) - endforeach() - else() - install(DIRECTORY "${source_directory}" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING ${patterns_args} PATTERN "${exclude_patterns}" EXCLUDE) - endif() - -endfunction() diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index b50701464..cfc2e39bd 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -13,6 +13,8 @@ configure_file(${PROJECT_SOURCE_DIR}/python/setup.py.in file(COPY ${PROJECT_SOURCE_DIR}/python/MANIFEST.in DESTINATION ${GTSAM_PYTHON_BUILD_DIRECTORY}) +set(WRAP_BUILD_TYPE_POSTFIXES ${GTSAM_BUILD_TYPE_POSTFIXES}) + include(PybindWrap) ############################################################