view CMakeLists.txt @ 630:04dffcdb8e1a

json_util: initial import, closes #776 @1h
author David Demelier <markand@malikania.fr>
date Tue, 20 Mar 2018 13:18:44 +0100
parents b327391f6a62
children 18aa7181e0c3
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 14)
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 ()

# Doxygen target.
find_package(Doxygen)
find_package(Boost REQUIRED COMPONENTS unit_test_framework)

# Extern packages.
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})
        # 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
                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)
    configure_file(
        ${CMAKE_SOURCE_DIR}/doxygen/Doxyfile.in
        ${CMAKE_BINARY_DIR}/Doxyfile
    )

    add_custom_target(
        doxygen ALL
        COMMENT "Generating doxygen documentation"
        COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
        VERBATIM
    )
endif ()

add_subdirectory(cpp)