annotate cmake/function/MalikaniaDefineTest.cmake @ 49:2804ae55c70f

CMake: big cleanup, closes #598
author David Demelier <markand@malikania.fr>
date Fri, 09 Dec 2016 13:28:45 +0100
parents
children 0edaba9986ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
49
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 #
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 # MalikaniaDefineTest.cmake -- CMake build system for malikania
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 #
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 # Copyright (c) 2013-2016 Malikania Authors
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 #
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 # Permission to use, copy, modify, and/or distribute this software for any
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 # purpose with or without fee is hereby granted, provided that the above
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 # copyright notice and this permission notice appear in all copies.
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 #
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 #
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 # malikania_create_test
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 # ---------------------
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 # malikania_create_test(
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 # NAME Test name (must be lowercase)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 # SOURCES Test sources files
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 # LIBRARIES (Optional) Libraries to link to
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 # RESOURCES (Optional) Resources files to copy verbatim
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 # )
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 # This will generate a target named test-<name> where name is the parameter NAME. The test is created
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 # under CMAKE_BINARY_DIR/test/<NAME> and resources are copied there with the same hierarchy.
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 include(CMakeParseArguments)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 function(malikania_create_test)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 set(singleArgs NAME)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 set(multiArgs LIBRARIES SOURCES RESOURCES)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 cmake_parse_arguments(TEST "" "${singleArgs}" "${multiArgs}" ${ARGN})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 if (NOT TEST_NAME)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 message(FATAL_ERROR "Missing NAME parameter")
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 endif ()
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 if (NOT TEST_SOURCES)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 message(FATAL_ERROR "Missing SOURCES parameter")
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 endif ()
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/test/${TEST_NAME})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 if (UNIX)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 list(APPEND TEST_LIBRARIES pthread)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 endif ()
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 # Resources files added before as custom output
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 foreach (f ${TEST_RESOURCES})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 get_filename_component(absolute ${f} ABSOLUTE)
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 file(RELATIVE_PATH basename ${CMAKE_CURRENT_SOURCE_DIR} ${absolute})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 set(output ${CMAKE_BINARY_DIR}/test/${TEST_NAME}/${basename})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 add_custom_command(
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 OUTPUT ${output}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 COMMAND ${CMAKE_COMMAND} -E copy ${absolute} ${output}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 DEPENDS ${absolute}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 )
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 list(APPEND TEST_SOURCES ${absolute})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 list(APPEND outputs ${output})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 endforeach ()
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 add_executable(test-${TEST_NAME} ${TEST_SOURCES} ${outputs})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 source_group(private\\Resources FILES ${outputs})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 target_compile_definitions(
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 test-${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 PRIVATE
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 BOOST_TEST_DYN_LINK
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 SOURCE_DIRECTORY=\"${CMAKE_BINARY_DIR}/test/${TEST_NAME}\"
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 )
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 set_target_properties(
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 test-${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 PROPERTIES
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/test/${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/test/${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/test/${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR}/test/${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 )
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 add_test(
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 NAME ${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 COMMAND $<TARGET_FILE:test-${TEST_NAME}>
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/test/${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 )
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 target_link_libraries(
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 test-${TEST_NAME}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 ${TEST_LIBRARIES}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 ${Boost_unit_test_framework_LIBRARY}
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 )
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 add_dependencies(tests test-${TEST_NAME})
2804ae55c70f CMake: big cleanup, closes #598
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 endfunction()