view cmake/CodeDefineModule.cmake @ 538:ea04b51d91ab

Json: complete removal (use nlohmann instead)
author David Demelier <markand@malikania.fr>
date Wed, 08 Jun 2016 20:42:00 +0200
parents cc50a80dc163
children f48bb09bccc7
line wrap: on
line source

#
# CMakeLists.txt -- code building for common code
#
# Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#

#
# code_define_module
# -------------------------------------------------------------------
#
# code_define_module(
#	NAME lowercase name
#	SOURCES source files
#	LIBRARIES (Optional) libraries
#	INCLUDES (Optional) include directories
#	FLAGS (Optional) flags
# )
#
# Create a test for the given module.
#
# This macro adds a new option WITH_<uppercase NAME> to test the module.
#
# If the module has a file test/main.cpp in its directory, a target test-<NAME> is created.
#

include(CMakeParseArguments)

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

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

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

	# Create the option for enabling the test.
	string(TOUPPER ${MOD_NAME} optionname)
	option(WITH_${optionname} "Enable ${MOD_NAME}" On)

	if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/main.cpp AND WITH_${optionname})
		# Create test executable.
		add_executable(test-${MOD_NAME} ${MOD_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/test/main.cpp)
		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})

		# Register the test.
		add_test(
			NAME ${MOD_NAME}
			COMMAND test-${MOD_NAME}
			WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
		)
	endif ()
endfunction()