196 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			CMake
		
	
	
		
		
			
		
	
	
			196 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			CMake
		
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Macro for adding categorized tests in a "tests" folder, with 
							 | 
						||
| 
								 | 
							
								# optional exclusion of tests and convenience library linking options
							 | 
						||
| 
								 | 
							
								#  
							 | 
						||
| 
								 | 
							
								# By default, all tests are linked with CppUnitLite and boost
							 | 
						||
| 
								 | 
							
								# Arguments: 
							 | 
						||
| 
								 | 
							
								#   - subdir    The name of the category for this test
							 | 
						||
| 
								 | 
							
								#   - local_libs  A list of convenience libraries to use (if GTSAM_BUILD_CONVENIENCE_LIBRARIES is true)
							 | 
						||
| 
								 | 
							
								#   - full_libs   The main library to link against if not using convenience libraries
							 | 
						||
| 
								 | 
							
								#   - excluded_tests  A list of test files that should not be compiled - use for debugging 
							 | 
						||
| 
								 | 
							
								function(gtsam_add_subdir_tests subdir local_libs full_libs excluded_tests)
							 | 
						||
| 
								 | 
							
								    # Subdirectory target for tests
							 | 
						||
| 
								 | 
							
								    add_custom_target(check.${subdir} COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> --output-on-failure)
							 | 
						||
| 
								 | 
							
								    set(is_test TRUE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# Put check target in Visual Studio solution folder
							 | 
						||
| 
								 | 
							
									file(RELATIVE_PATH relative_path "${PROJECT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
							 | 
						||
| 
								 | 
							
									set_property(TARGET check.${subdir} PROPERTY FOLDER "${relative_path}")
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
									# Link with CppUnitLite - pulled from gtsam installation
							 | 
						||
| 
								 | 
							
									list(APPEND local_libs CppUnitLite)
							 | 
						||
| 
								 | 
							
									list(APPEND full_libs CppUnitLite)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Build grouped tests
							 | 
						||
| 
								 | 
							
								    gtsam_add_grouped_scripts("${subdir}"               # Use subdirectory as group label
							 | 
						||
| 
								 | 
							
								    "tests/test*.cpp" check "Test"                      # Standard for all tests
							 | 
						||
| 
								 | 
							
								    "${local_libs}"
							 | 
						||
| 
								 | 
							
								    "${full_libs}" "${excluded_tests}"  # Pass in linking and exclusion lists
							 | 
						||
| 
								 | 
							
								    ${is_test})                                         # Set all as tests
							 | 
						||
| 
								 | 
							
								endfunction()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Macro for adding categorized timing scripts in a "tests" folder, with 
							 | 
						||
| 
								 | 
							
								# optional exclusion of tests and convenience library linking options
							 | 
						||
| 
								 | 
							
								#  
							 | 
						||
| 
								 | 
							
								# By default, all tests are linked with boost
							 | 
						||
| 
								 | 
							
								# Arguments: 
							 | 
						||
| 
								 | 
							
								#   - subdir    The name of the category for this timing script
							 | 
						||
| 
								 | 
							
								#   - local_libs  A list of convenience libraries to use (if GTSAM_BUILD_CONVENIENCE_LIBRARIES is true)
							 | 
						||
| 
								 | 
							
								#   - full_libs   The main library to link against if not using convenience libraries
							 | 
						||
| 
								 | 
							
								#   - excluded_srcs  A list of timing files that should not be compiled - use for debugging 
							 | 
						||
| 
								 | 
							
								macro(gtsam_add_subdir_timing subdir local_libs full_libs excluded_srcs)
							 | 
						||
| 
								 | 
							
								    # Subdirectory target for timing - does not actually execute the scripts
							 | 
						||
| 
								 | 
							
								    add_custom_target(timing.${subdir})
							 | 
						||
| 
								 | 
							
								    set(is_test FALSE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Build grouped benchmarks
							 | 
						||
| 
								 | 
							
								    gtsam_add_grouped_scripts("${subdir}"               # Use subdirectory as group label
							 | 
						||
| 
								 | 
							
								    "tests/time*.cpp" timing "Timing Benchmark"         # Standard for all timing scripts
							 | 
						||
| 
								 | 
							
								    "${local_libs}" "${full_libs}" "${excluded_srcs}"   # Pass in linking and exclusion lists
							 | 
						||
| 
								 | 
							
								    ${is_test})                                         # Treat as not a test
							 | 
						||
| 
								 | 
							
								endmacro()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Macro for adding executables matching a pattern - builds one executable for
							 | 
						||
| 
								 | 
							
								# each file matching the pattern.  These exectuables are automatically linked
							 | 
						||
| 
								 | 
							
								# with boost.
							 | 
						||
| 
								 | 
							
								# Arguments:
							 | 
						||
| 
								 | 
							
								#   - pattern    The glob pattern to match source files
							 | 
						||
| 
								 | 
							
								#   - local_libs A list of convenience libraries to use (if GTSAM_BUILD_CONVENIENCE_LIBRARIES is true)
							 | 
						||
| 
								 | 
							
								#   - full_libs  The main library to link against if not using convenience libraries
							 | 
						||
| 
								 | 
							
								#   - excluded_srcs  A list of timing files that should not be compiled - use for debugging
							 | 
						||
| 
								 | 
							
								function(gtsam_add_executables pattern local_libs full_libs excluded_srcs)
							 | 
						||
| 
								 | 
							
								    set(is_test FALSE)
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    if(NOT excluded_srcs)
							 | 
						||
| 
								 | 
							
								        set(excluded_srcs "")
							 | 
						||
| 
								 | 
							
								    endif()
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    # Build executables
							 | 
						||
| 
								 | 
							
								    gtsam_add_grouped_scripts("" "${pattern}" "" "Executable" "${local_libs}" "${full_libs}" "${excluded_srcs}" ${is_test})
							 | 
						||
| 
								 | 
							
								endfunction()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# General-purpose script for adding tests with categories and linking options
							 | 
						||
| 
								 | 
							
								macro(gtsam_add_grouped_scripts group pattern target_prefix pretty_prefix_name local_libs full_libs excluded_srcs is_test)
							 | 
						||
| 
								 | 
							
									# Print warning about using this obsolete function
							 | 
						||
| 
								 | 
							
									message(AUTHOR_WARNING "Warning:  Please see GtsamTesting.cmake - obsolete cmake cmake macro for creating unit tests, examples, and scripts was called.  This will be removed in the future.  The new macros are much easier anyway!!")
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								    # Get all script files
							 | 
						||
| 
								 | 
							
								    set(script_files "")
							 | 
						||
| 
								 | 
							
								    foreach(one_pattern ${pattern})
							 | 
						||
| 
								 | 
							
								        file(GLOB one_script_files "${one_pattern}")
							 | 
						||
| 
								 | 
							
								        list(APPEND script_files "${one_script_files}")
							 | 
						||
| 
								 | 
							
								    endforeach()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Remove excluded scripts from the list
							 | 
						||
| 
								 | 
							
								    set(exclusions "") # Need to copy out exclusion list for logic to work
							 | 
						||
| 
								 | 
							
								    foreach(one_exclusion ${excluded_srcs})
							 | 
						||
| 
								 | 
							
								        file(GLOB one_exclusion_srcs "${one_exclusion}")
							 | 
						||
| 
								 | 
							
								        list(APPEND exclusions "${one_exclusion_srcs}")
							 | 
						||
| 
								 | 
							
								    endforeach()
							 | 
						||
| 
								 | 
							
								    if(exclusions)
							 | 
						||
| 
								 | 
							
								    	list(REMOVE_ITEM script_files ${exclusions})
							 | 
						||
| 
								 | 
							
								    endif(exclusions)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# Separate into source files and headers
							 | 
						||
| 
								 | 
							
									set(script_srcs "")
							 | 
						||
| 
								 | 
							
									set(script_headers "")
							 | 
						||
| 
								 | 
							
									foreach(script_file ${script_files})
							 | 
						||
| 
								 | 
							
										get_filename_component(script_ext ${script_file} EXT)
							 | 
						||
| 
								 | 
							
										if(script_ext MATCHES "(h|H)")
							 | 
						||
| 
								 | 
							
											list(APPEND script_headers ${script_file})
							 | 
						||
| 
								 | 
							
										else()
							 | 
						||
| 
								 | 
							
											list(APPEND script_srcs ${script_file})
							 | 
						||
| 
								 | 
							
										endif()
							 | 
						||
| 
								 | 
							
									endforeach()
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    # Add targets and dependencies for each script
							 | 
						||
| 
								 | 
							
								    if(NOT "${group}" STREQUAL "")
							 | 
						||
| 
								 | 
							
								        message(STATUS "Adding ${pretty_prefix_name}s in ${group}")
							 | 
						||
| 
								 | 
							
								    endif()
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									# Create exe's for each script, unless we're in SINGLE_TEST_EXE mode
							 | 
						||
| 
								 | 
							
									if(NOT is_test OR NOT GTSAM_SINGLE_TEST_EXE)
							 | 
						||
| 
								 | 
							
										foreach(script_src ${script_srcs})
							 | 
						||
| 
								 | 
							
											get_filename_component(script_base ${script_src} NAME_WE)
							 | 
						||
| 
								 | 
							
											if (script_base) # Check for null filenames and headers
							 | 
						||
| 
								 | 
							
												set( script_bin ${script_base} )
							 | 
						||
| 
								 | 
							
												message(STATUS "Adding ${pretty_prefix_name} ${script_bin}") 
							 | 
						||
| 
								 | 
							
												add_executable(${script_bin} ${script_src} ${script_headers})
							 | 
						||
| 
								 | 
							
												if(NOT "${target_prefix}" STREQUAL "")
							 | 
						||
| 
								 | 
							
													if(NOT "${group}" STREQUAL "")
							 | 
						||
| 
								 | 
							
														add_dependencies(${target_prefix}.${group} ${script_bin})
							 | 
						||
| 
								 | 
							
													endif()
							 | 
						||
| 
								 | 
							
													add_dependencies(${target_prefix} ${script_bin})
							 | 
						||
| 
								 | 
							
												endif()
							 | 
						||
| 
								 | 
							
												
							 | 
						||
| 
								 | 
							
												# Add TOPSRCDIR
							 | 
						||
| 
								 | 
							
												set_property(SOURCE ${script_src} APPEND PROPERTY COMPILE_DEFINITIONS "TOPSRCDIR=\"${PROJECT_SOURCE_DIR}\"")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												# Disable building during make all/install
							 | 
						||
| 
								 | 
							
												if (GTSAM_DISABLE_TESTS_ON_INSTALL)
							 | 
						||
| 
								 | 
							
													set_target_properties(${script_bin} PROPERTIES EXCLUDE_FROM_ALL ON)
							 | 
						||
| 
								 | 
							
												endif()
							 | 
						||
| 
								 | 
							
												
							 | 
						||
| 
								 | 
							
												if (is_test)
							 | 
						||
| 
								 | 
							
													add_test(NAME ${script_base} COMMAND ${script_bin})
							 | 
						||
| 
								 | 
							
												endif()
							 | 
						||
| 
								 | 
							
												
							 | 
						||
| 
								 | 
							
												# Linking and dependendencies
							 | 
						||
| 
								 | 
							
												if (GTSAM_BUILD_CONVENIENCE_LIBRARIES)
							 | 
						||
| 
								 | 
							
													target_link_libraries(${script_bin} ${local_libs} ${GTSAM_BOOST_LIBRARIES})
							 | 
						||
| 
								 | 
							
												else()
							 | 
						||
| 
								 | 
							
													target_link_libraries(${script_bin} ${full_libs} ${GTSAM_BOOST_LIBRARIES})
							 | 
						||
| 
								 | 
							
												endif()
							 | 
						||
| 
								 | 
							
												
							 | 
						||
| 
								 | 
							
												# Add .run target
							 | 
						||
| 
								 | 
							
												if(NOT MSVC AND NOT XCODE_VERSION)
							 | 
						||
| 
								 | 
							
												  add_custom_target(${script_bin}.run ${EXECUTABLE_OUTPUT_PATH}${script_bin} ${ARGN})
							 | 
						||
| 
								 | 
							
												endif()
							 | 
						||
| 
								 | 
							
												
							 | 
						||
| 
								 | 
							
												# Set up Visual Studio folders
							 | 
						||
| 
								 | 
							
												file(RELATIVE_PATH relative_path "${PROJECT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
							 | 
						||
| 
								 | 
							
												set_property(TARGET ${script_bin} PROPERTY FOLDER "${relative_path}")
							 | 
						||
| 
								 | 
							
											endif()
							 | 
						||
| 
								 | 
							
										endforeach(script_src)
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										if(MSVC)
							 | 
						||
| 
								 | 
							
											source_group("" FILES ${script_srcs} ${script_headers})
							 | 
						||
| 
								 | 
							
										endif()
							 | 
						||
| 
								 | 
							
									else()
							 | 
						||
| 
								 | 
							
										# Create single unit test exe from all test scripts
							 | 
						||
| 
								 | 
							
										set(script_bin ${target_prefix}_${group}_prog)
							 | 
						||
| 
								 | 
							
										add_executable(${script_bin} ${script_srcs} ${script_headers})
							 | 
						||
| 
								 | 
							
										if (GTSAM_BUILD_CONVENIENCE_LIBRARIES)
							 | 
						||
| 
								 | 
							
											target_link_libraries(${script_bin} ${local_libs} ${Boost_LIBRARIES})
							 | 
						||
| 
								 | 
							
										else()
							 | 
						||
| 
								 | 
							
											target_link_libraries(${script_bin} ${Boost_LIBRARIES} ${full_libs})
							 | 
						||
| 
								 | 
							
										endif()
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										# Only have a main function in one script
							 | 
						||
| 
								 | 
							
										set(rest_script_srcs ${script_srcs})
							 | 
						||
| 
								 | 
							
										list(REMOVE_AT rest_script_srcs 0)
							 | 
						||
| 
								 | 
							
										set_property(SOURCE ${rest_script_srcs} APPEND PROPERTY COMPILE_DEFINITIONS "main=static no_main")
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
										# Add TOPSRCDIR
							 | 
						||
| 
								 | 
							
										set_property(SOURCE ${script_srcs} APPEND PROPERTY COMPILE_DEFINITIONS "TOPSRCDIR=\"${PROJECT_SOURCE_DIR}\"")
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
										# Add test
							 | 
						||
| 
								 | 
							
										add_dependencies(${target_prefix}.${group} ${script_bin})
							 | 
						||
| 
								 | 
							
										add_dependencies(${target_prefix} ${script_bin})
							 | 
						||
| 
								 | 
							
										add_test(NAME ${target_prefix}.${group} COMMAND ${script_bin})
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										# Disable building during make all/install
							 | 
						||
| 
								 | 
							
										if (GTSAM_DISABLE_TESTS_ON_INSTALL)
							 | 
						||
| 
								 | 
							
											set_target_properties(${script_bin} PROPERTIES EXCLUDE_FROM_ALL ON)
							 | 
						||
| 
								 | 
							
										endif()
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										# Set up Visual Studio folders
							 | 
						||
| 
								 | 
							
										if(MSVC)
							 | 
						||
| 
								 | 
							
										    file(RELATIVE_PATH relative_path "${PROJECT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
							 | 
						||
| 
								 | 
							
											set_property(TARGET ${script_bin} PROPERTY FOLDER "${relative_path}")
							 | 
						||
| 
								 | 
							
											source_group("" FILES ${script_srcs} ${script_headers})
							 | 
						||
| 
								 | 
							
										endif()
							 | 
						||
| 
								 | 
							
									endif()
							 | 
						||
| 
								 | 
							
								endmacro()
							 |