173 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			CMake
		
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			CMake
		
	
	
| # This file should be used as a template for creating new projects using the CMake tools
 | |
| # This project has the following features
 | |
| #    - GTSAM linking
 | |
| #    - Boost linking
 | |
| #    - Unit tests via CppUnitLite
 | |
| #    - Automatic detection of sources and headers in subfolders
 | |
| #    - Installation of library and headers
 | |
| #    - Matlab wrap interface with within-project building
 | |
| #    - Use of GTSAM cmake macros
 | |
| 
 | |
| ###################################################################################
 | |
| # To create your own project, replace "myproject" with the actual name of your project
 | |
| cmake_minimum_required(VERSION 2.6)
 | |
| enable_testing()
 | |
| project(myproject CXX C)               
 | |
| 
 | |
| # Add the cmake subfolder to the cmake module path - necessary to use macros
 | |
| set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${PROJECT_SOURCE_DIR}/cmake")
 | |
| 
 | |
| # Ensure that local folder is searched before library folders
 | |
| include_directories(BEFORE "${PROJECT_SOURCE_DIR}")
 | |
| 
 | |
| # Load build type flags and default to Debug mode
 | |
| include(GtsamBuildTypes)
 | |
| 
 | |
| ###################################################################################
 | |
| # Create a list of library dependencies 
 | |
| # These will be linked with executables
 | |
| set(library_deps "")
 | |
| set(linking_mode "static")
 | |
| 
 | |
| # Find GTSAM components
 | |
| find_package(GTSAM REQUIRED) # Uses installed package
 | |
| list(APPEND library_deps gtsam-${linking_mode} gtsam_unstable-${linking_mode})
 | |
| 
 | |
| # Include ransac
 | |
| find_package(ransac REQUIRED) # Uses installed package
 | |
| list(APPEND library_deps ransac-${linking_mode})
 | |
| 
 | |
| # Boost - same requirement as gtsam
 | |
| find_package(Boost 1.43 COMPONENTS 
 | |
|     serialization 
 | |
|     system 
 | |
|     filesystem 
 | |
|     thread 
 | |
|     date_time 
 | |
|     REQUIRED)
 | |
| list(APPEND library_deps 
 | |
|     ${Boost_SERIALIZATION_LIBRARY} 
 | |
|     ${Boost_SYSTEM_LIBRARY} 
 | |
|     ${Boost_FILESYSTEM_LIBRARY}
 | |
|     ${Boost_THREAD_LIBRARY} 
 | |
|     ${Boost_DATE_TIME_LIBRARY})
 | |
| 
 | |
| include_directories(${Boost_INCLUDE_DIR} ${GTSAM_INCLUDE_DIR} ${ransac_INCLUDE_DIR})
 | |
| 
 | |
| ###################################################################################
 | |
| # List subdirs to process tests/sources
 | |
| # Each of these will be scanned for new files
 | |
| set (myproject_subdirs 
 | |
|     "."   # ensure root folder gets included
 | |
|     stuff 
 | |
|     things
 | |
|     )
 | |
| 
 | |
| # loop through subdirs to install and build up source lists
 | |
| set(myproject_lib_source "")
 | |
| set(myproject_tests_source "")
 | |
| set(myproject_scripts_source "")
 | |
| foreach(subdir ${myproject_subdirs})
 | |
|     # Installing headers
 | |
|     message(STATUS "Installing ${subdir}")
 | |
|     file(GLOB sub_myproject_headers "myproject/${subdir}/*.h")
 | |
|     install(FILES ${sub_myproject_headers} DESTINATION include/myproject/${subdir})
 | |
|     
 | |
|     # add sources to main sources list
 | |
|     file(GLOB subdir_srcs "myproject/${subdir}/*.cpp")
 | |
|     list(APPEND myproject_lib_source ${subdir_srcs})
 | |
|     
 | |
|     # add tests to main tests list
 | |
|     file(GLOB subdir_test_srcs "myproject/${subdir}/tests/*.cpp")
 | |
|     list(APPEND myproject_tests_source ${subdir_test_srcs})
 | |
|     
 | |
|     # add scripts to main tests list
 | |
|     file(GLOB subdir_scripts_srcs "myproject/${subdir}/scripts/*.cpp")
 | |
|     list(APPEND myproject_scripts_source ${subdir_scripts_srcs})
 | |
| endforeach(subdir)
 | |
| 
 | |
| set(myproject_version   ${myproject_VERSION_MAJOR}.${myproject_VERSION_MINOR}.${myproject_VERSION_PATCH})
 | |
| set(myproject_soversion ${myproject_VERSION_MAJOR})
 | |
| message(STATUS "GTSAM Version: ${gtsam_version}")
 | |
| message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")
 | |
| 
 | |
| # Build library (static and shared versions)
 | |
| # Include installed versions
 | |
| SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
 | |
| add_library(${PROJECT_NAME}-shared SHARED ${myproject_lib_source})
 | |
| set_target_properties(${PROJECT_NAME}-shared PROPERTIES 
 | |
|     OUTPUT_NAME         ${PROJECT_NAME}
 | |
|     CLEAN_DIRECT_OUTPUT 1)
 | |
| install(TARGETS myproject-shared EXPORT myproject-exports LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin)
 | |
| list(APPEND myproject_EXPORTED_TARGETS myproject-shared)
 | |
| 
 | |
| add_library(${PROJECT_NAME}-static STATIC ${myproject_lib_source})
 | |
| set_target_properties(${PROJECT_NAME}-static PROPERTIES 
 | |
|     OUTPUT_NAME         ${PROJECT_NAME}
 | |
|     CLEAN_DIRECT_OUTPUT 1)
 | |
| install(TARGETS myproject-static EXPORT myproject-exports ARCHIVE DESTINATION lib)
 | |
| list(APPEND myproject_EXPORTED_TARGETS myproject-static)
 | |
| 
 | |
| install(TARGETS ${PROJECT_NAME}-shared LIBRARY DESTINATION lib )
 | |
| install(TARGETS ${PROJECT_NAME}-static ARCHIVE DESTINATION lib )
 | |
| 
 | |
| # Disabled tests - subtract these from the test files
 | |
| # Note the need for a full path
 | |
| set(disabled_tests 
 | |
|     "dummy"
 | |
|     #"${PROJECT_SOURCE_DIR}/myproject/geometry/tests/testCovarianceEllipse.cpp"
 | |
| )
 | |
| list(REMOVE_ITEM myproject_tests_source ${disabled_tests})
 | |
| 
 | |
| ###################################################################################
 | |
| # Build tests
 | |
| add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
 | |
| foreach(test_src_file ${myproject_tests_source})
 | |
|     get_filename_component(test_base ${test_src_file} NAME_WE)
 | |
|     message(STATUS "Adding test ${test_src_file} with base name ${test_base}" )
 | |
|     add_executable(${test_base} ${test_src_file})
 | |
|     target_link_libraries(${test_base} ${PROJECT_NAME}-${linking_mode} ${library_deps} CppUnitLite)
 | |
|     add_test(${test_base} ${EXECUTABLE_OUTPUT_PATH}/${test_base})
 | |
|     add_custom_target(${test_base}.run ${test_base} ${ARGN})
 | |
|     add_dependencies(check ${test_base})
 | |
| endforeach(test_src_file)
 | |
| 
 | |
| # Build scripts
 | |
| foreach(script_src_file ${myproject_scripts_source})
 | |
|     get_filename_component(script_base ${script_src_file} NAME_WE)
 | |
|     message(STATUS "Adding script ${script_src_file} with base name ${script_base}" )
 | |
|     add_executable(${script_base} ${script_src_file})
 | |
|     target_link_libraries(${script_base} ${PROJECT_NAME}-${linking_mode} ${library_deps} CppUnitLite)
 | |
|     add_custom_target(${script_base}.run ${script_base} ${ARGN})
 | |
| endforeach(script_src_file)
 | |
| 
 | |
| ###################################################################################
 | |
| # Matlab wrapping
 | |
| include(GtsamMatlabWrap)
 | |
| set(MEX_COMMAND "mex" CACHE STRING "Command to use for executing mex (if on path, 'mex' will work)")
 | |
| set(GTSAM_BUILD_MEX_BINARY_FLAGS "" CACHE STRING "Extra flags for running Matlab MEX compilation")
 | |
| set(MYPROJECT_TOOLBOX_DIR "../matlab/myproject" CACHE PATH "Install folder for matlab toolbox - defaults to inside project")
 | |
| set(WRAP_HEADER_PATH "${GTSAM_DIR}/../../../include")
 | |
| set(MYPROJECT_TOOLBOX_FLAGS 
 | |
|     ${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${PROJECT_SOURCE_DIR} -I${PROJECT_SOURCE_DIR}/myproject -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${GTSAM_INCLUDE_DIR} -I${WRAP_HEADER_PATH} -Wl,-rpath,${CMAKE_BINARY_DIR}:${CMAKE_INSTALL_PREFIX}/lib)
 | |
| set(MYPROJECT_LIBRARY_DEPS gtsam gtsam_unstable ransac myproject)
 | |
| set(GTSAM_BUILD_MEX_BIN ON)
 | |
|  
 | |
| # Function to setup codegen, building and installation of the wrap toolbox
 | |
| # This wrap setup function assumes that the toolbox will be installed directly, 
 | |
| # with predictable matlab.h sourcing
 | |
| # params:
 | |
| #  moduleName       : the name of the module, interface file must be called moduleName.h
 | |
| #  mexFlags         : Compilation flags to be passed to the mex compiler 
 | |
| #  modulePath       : relative path to module markup header file (called moduleName.h)
 | |
| #  otherLibraries   : list of library targets this should depend on
 | |
| #  toolboxPath      : the directory in which to generate/build wrappers
 | |
| #  wrap_header_path : path to the installed wrap header  
 | |
| wrap_library_generic(myproject "${MYPROJECT_TOOLBOX_FLAGS}" "" "${MYPROJECT_LIBRARY_DEPS}" "${MYPROJECT_TOOLBOX_DIR}" "${WRAP_HEADER_PATH}")
 | |
| 
 | |
| ###################################################################################
 | |
| # Create Install config and export files
 | |
| # This config file takes the place of FindXXX.cmake scripts
 | |
| include(GtsamMakeConfigFile)
 | |
| GtsamMakeConfigFile(myproject)
 | |
| export(TARGETS ${myproject_EXPORTED_TARGETS} FILE myproject-exports.cmake) |