OverviewFilesCommitsIssuesDocsReleasesPeers

opencog-cogutil / cmake / AddCxxtest.cmake

103 lines · cmake ref:
# ADD_CXXTEST macro from http://www.cmake.org/Wiki/CMakeMacroAddCxxTest
FIND_PACKAGE(Cxxtest)

IF (CXXTEST_FOUND)

	#ADD_CONFIGURABLE_CXXTEST declares a configurable cxxtest. If the executable
	#is to be compiled then it needs to be added as a dependency to the target
	#'tests' by declaring 'ADD_DEPENDENCIES(tests NAME)'. To run the executable
	#by ctest using a configuration script, declare as follows
	#ADD_TEST(NAME COMMAND configuration_and_run_script.sh)

	MACRO(ADD_CONFIGURABLE_CXXTEST NAME)
		ADD_CUSTOM_COMMAND(
			OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp
			COMMAND
				${CXXTEST_GEN}
				--runner=ErrorPrinter
				--have-eh
				-o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp
				${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.cxxtest
			DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.cxxtest ${ARGN}
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)

		ADD_EXECUTABLE(${NAME} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp ${ARGN})
	ENDMACRO(ADD_CONFIGURABLE_CXXTEST)

	MACRO(ADD_CXXTEST NAME)
		ADD_CONFIGURABLE_CXXTEST(${NAME} ${ARGN})
		INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ${CXXTEST_INCLUDE_DIRS})

        IF (CMAKE_BUILD_TYPE STREQUAL "Coverage")
            ADD_TEST(${NAME} ${PROJECT_SOURCE_DIR}/scripts/run_lcov.sh
                ${PROJECT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${NAME})
        ELSE (CMAKE_BUILD_TYPE STREQUAL "Coverage")
            ADD_TEST(${NAME} ${NAME})
		ENDIF (CMAKE_BUILD_TYPE STREQUAL "Coverage")
		IF (GUILE_LOAD_PATH)
			SET_PROPERTY(TEST ${NAME} PROPERTY
				ENVIRONMENT "GUILE_LOAD_PATH=${GUILE_LOAD_PATH}:$ENV{GUILE_LOAD_PATH};GUILE_LOAD_COMPILED_PATH=${GUILE_LOAD_PATH}:$ENV{GUILE_LOAD_COMPILED_PATH}")
		ELSE()
			SET_PROPERTY(TEST ${NAME} PROPERTY
				ENVIRONMENT "GUILE_LOAD_PATH=$ENV{GUILE_LOAD_PATH};GUILE_LOAD_COMPILED_PATH=$ENV{GUILE_LOAD_COMPILED_PATH}")
		ENDIF(GUILE_LOAD_PATH)
		ADD_DEPENDENCIES(tests ${NAME})
	ENDMACRO(ADD_CXXTEST)

	#The above macro generates a single source file for all input test headers.
	#If by some reason you prefer separate compilation of each part, you may use
	#the variation. This doesn't compile the target one have to call 'make NAME'
	#before 'make test', or add it as a dependency to 'tests' target by
	#declaring 'ADD_DEPENDENCIES(tests NAME)'.

	MACRO(ADD_CXXTEST_SEP NAME)
		# generate the parts
		FOREACH(_PART ${ARGN})
			GET_FILENAME_COMPONENT(_NAME ${_PART} NAME)
			GET_FILENAME_COMPONENT(_NAME_WE ${_PART} NAME_WE)
			ADD_CUSTOM_COMMAND(
				OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_NAME_WE}.cpp
				COMMAND
					${CXXTEST_GEN}
					--part
					--have-eh
					-o ${CMAKE_CURRENT_BINARY_DIR}/${_NAME_WE}.cpp
					${CMAKE_CURRENT_SOURCE_DIR}/${_NAME}.cxxtest
				DEPENDS ${_PART}
				WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
			)
		ENDFOREACH(_PART)

		# generate the runner
		ADD_CUSTOM_COMMAND(
			OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_runner.cpp
			COMMAND
				${CXXTEST_GEN}
				--runner=ErrorPrinter --root
				--have-eh
				-o ${NAME}_runner.cpp
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)

		# enumerate all generated files
		SET(PARTS ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_runner.cpp)
		FOREACH(_PART ${ARGN})
			GET_FILENAME_COMPONENT(_PART_WE ${_PART} NAME_WE)
			SET(PARTS ${PARTS} ${_PART_WE}.cpp)
		ENDFOREACH(_PART)

		ADD_EXECUTABLE(${NAME} ${PARTS})

		ADD_TEST(${NAME} ${NAME})
		IF (GUILE_LOAD_PATH)
			SET_PROPERTY(TEST ${NAME} PROPERTY
				ENVIRONMENT "GUILE_LOAD_PATH=${GUILE_LOAD_PATH}:$ENV{GUILE_LOAD_PATH};GUILE_LOAD_COMPILED_PATH=${GUILE_LOAD_PATH}:$ENV{GUILE_LOAD_COMPILED_PATH}")
		ELSE()
			SET_PROPERTY(TEST ${NAME} PROPERTY
				ENVIRONMENT "GUILE_LOAD_PATH=$ENV{GUILE_LOAD_PATH};GUILE_LOAD_COMPILED_PATH=$ENV{GUILE_LOAD_COMPILED_PATH}")
		ENDIF(GUILE_LOAD_PATH)
	ENDMACRO(ADD_CXXTEST_SEP)

ENDIF(CXXTEST_FOUND)