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()
 |