view cmake/CodeFunctions.cmake @ 486:7ee8da32da98

Unify all in modules/
author David Demelier <markand@malikania.fr>
date Fri, 13 Nov 2015 09:26:46 +0100
parents
children d061bad36315
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(${MOD_NAME} ${MOD_SOURCES} ${MOD_RESOURCES} ${MAIN})
	
			add_test(
				NAME ${MOD_NAME}-test
				COMMAND ${MOD_NAME}
				WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
			)
	
			target_compile_definitions(${MOD_NAME} PRIVATE ${MOD_FLAGS})
			target_include_directories(
				${MOD_NAME}
				PRIVATE
					${CMAKE_CURRENT_SOURCE_DIR}
					${MOD_INCLUDES}
			)
			target_link_libraries(${MOD_NAME} gtest ${MOD_LIBRARIES})
		endif ()
	endif ()
endfunction()