view CMakeLists.txt @ 650:ff73f2dd1c82

json_util: split and style
author David Demelier <markand@malikania.fr>
date Tue, 23 Oct 2018 21:10:00 +0200
parents 5bd9424a523a
children 6739771fba29
line wrap: on
line source

#
# CMakeLists.txt -- code building for common code
#
# Copyright (c) 2013-2018 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.
#

cmake_minimum_required(VERSION 3.5)
project(code)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED On)

if (CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
	set(CMAKE_CXX_FLAGS "-Wall -Wextra -pedantic ${CMAKE_CXX_FLAGS}")
	set(CMAKE_CXX_FLAGS_DEBUG "-Werror ${CMAKE_CXX_FLAGS_DEBUG}")
endif ()

find_package(Doxygen)
find_package(Boost REQUIRED COMPONENTS unit_test_framework)

add_subdirectory(extern/json)

enable_testing()

#
# 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.
#
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})
		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
				BOOST_TEST_DYN_LINK
				${MOD_FLAGS}
		)
		target_include_directories(
			test-${MOD_NAME}
			PRIVATE
				${CMAKE_CURRENT_SOURCE_DIR}
				${MOD_INCLUDES}
		)
		target_link_libraries(
			test-${MOD_NAME}
			Boost::unit_test_framework
			${MOD_LIBRARIES}
		)

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

if (DOXYGEN_FOUND)
	set(DOXYGEN_PROJECT_NAME code)
	set(DOXYGEN_STRIP_FROM_PATH ${code_SOURCE_DIR}/cpp)
	set(DOXYGEN_FILE_PATTERNS "*.hpp")
	set(DOXYGEN_WARN_NO_PARAMDOC YES)
	set(DOXYGEN_WARN_AS_ERROR YES)
	set(DOXYGEN_QUIET YES)

	doxygen_add_docs(
		doxygen
		${code_SOURCE_DIR}/cpp
		WORKING_DIRECTORY ${code_SOURCE_DIR}
	)

	add_custom_target(docs ALL DEPENDS doxygen)
endif ()

add_subdirectory(cpp)