view cmake/CodeDefineModule.cmake @ 550:d6dd0d58b3a3

Fs: some style
author David Demelier <markand@malikania.fr>
date Wed, 15 Jun 2016 13:34:03 +0200
parents f48bb09bccc7
children 18ec7f4fc3de
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()