view cmake/CodeDefineModule.cmake @ 615:e8661a550a12

Join: dedicate new module directory, #684
author David Demelier <markand@malikania.fr>
date Mon, 21 Aug 2017 11:31:22 +0200
parents 18ec7f4fc3de
children 266f32919d0a
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
                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()