view cmake/CodeFunctions.cmake @ 487:d061bad36315

Fix various case-sensitive includes and resources not copied
author David Demelier <markand@malikania.fr>
date Fri, 13 Nov 2015 09:50:52 +0100
parents 7ee8da32da98
children b280d7aca160
line wrap: on
line source

function(code_define_module)
	set(options NO_TEST)
	set(oneValueArgs NAME)
	set(multiValueArgs SOURCES RESOURCES LIBRARIES INCLUDES FLAGS)

	cmake_parse_arguments(MOD "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

	if (NOT MOD_NAME)
		message(FATAL_ERROR "Argument NAME is not set")
	endif ()

	string(TOUPPER ${MOD_NAME} optionname)

	# Tests are optional
	if (NOT ${MOD_NO_TEST})
		# Create the option for enabling the test
		option(WITH_${optionname} "Enable ${MOD_NAME}" On)

		if (WITH_${optionname})
			# Add the test executable
			set(MAIN ${CMAKE_CURRENT_SOURCE_DIR}/test/main.cpp)

			if (NOT EXISTS ${MAIN})
				message(FATAL_ERROR "${MAIN} file does not exists")
			endif ()

			#
			# Copy optional resources in the ${CMAKE_BINARY_DIR}/${MOD_NAME} directory.
			#
			if (MOD_RESOURCES)
				foreach (res ${MOD_RESOURCES})
					get_filename_component(inputname ${res} NAME)
					set(output ${CMAKE_BINARY_DIR}/${MOD_NAME}/${inputname})

					add_custom_command(
						OUTPUT ${output}
						COMMENT "Copying ${inputname}"
						DEPENDS ${res}
						COMMAND ${CMAKE_COMMAND} -E copy ${res} ${output}
					)

					list(APPEND MOD_SOURCES ${output})
				endforeach()
			endif ()

			#
			# Finally create the executable and the test
			#
			add_executable(test-${MOD_NAME} ${MOD_SOURCES} ${MOD_RESOURCES} ${MAIN})
	
			add_test(
				NAME ${MOD_NAME}
				COMMAND test-${MOD_NAME}
				WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
			)
	
			set_target_properties(
				test-${MOD_NAME}
				PROPERTIES
					RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
					RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}
					RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}
					RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}
					RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR}
			)
			target_compile_definitions(test-${MOD_NAME} PRIVATE ${MOD_FLAGS})
			target_include_directories(
				test-${MOD_NAME}
				PRIVATE
					${CMAKE_CURRENT_SOURCE_DIR}
					${MOD_INCLUDES}
			)
			target_link_libraries(test-${MOD_NAME} gtest ${MOD_LIBRARIES})
		endif ()
	endif ()
endfunction()