Mercurial > malikania
annotate cmake/MalikaniaFunctions.cmake @ 18:cc13926bed59
Client: add more bindings for Window, #462
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 03 Apr 2016 20:10:37 +0200 |
parents | c12262a01559 |
children | a1e80d991968 |
rev | line source |
---|---|
0 | 1 # |
2 # CMakeLists.txt -- CMake build system for malikania | |
3 # | |
4 # Copyright (c) 2013-2016 Malikania Authors | |
5 # | |
6 # Permission to use, copy, modify, and/or distribute this software for any | |
7 # purpose with or without fee is hereby granted, provided that the above | |
8 # copyright notice and this permission notice appear in all copies. | |
9 # | |
10 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 # | |
18 | |
19 include(CMakeParseArguments) | |
20 | |
21 # --------------------------------------------------------- | |
22 # The following macros are available: | |
23 # | |
24 # malikania_define_executable | |
25 # --------------------------- | |
26 # | |
27 # malikania_define_executable( | |
28 # TARGET The target name | |
29 # SOURCES The list of sources | |
30 # FLAGS (Optional) List of flags | |
31 # INCLUDES (Optional) List of include directories | |
32 # LIBRARIES (Optional) List of libraries | |
33 # ) | |
34 # | |
35 # Create an executable. Be sure to quote SOURCES, if not only the first file will be passed. | |
36 # If you need flags, just pass them without -D or /D, this is automatically done for you. | |
37 # | |
38 # malikania_create_library | |
39 # ------------------------ | |
40 # | |
41 # malikania_create_library( | |
42 # TARGET The target name | |
43 # SOURCES The sources | |
44 # FLAGS (Optional) List of flags | |
45 # PRIVATE_INCLUDES (Optional) List of includes only for building the library | |
46 # PUBLIC_INCLUDES (Optional) List of public includes to share with the library users | |
47 # LIBRARIES (Optional) List of libraries to link against | |
48 # ) | |
49 # | |
50 # Create a shared library. Follow the same specification as malikania_define_executable. | |
51 # However, additional PRIVATE_INCLUDES and PUBLIC_INCLUDES are available. | |
52 # | |
53 # malikania_create_test | |
54 # --------------------- | |
55 # | |
56 # malikania_create_test( | |
57 # NAME Test name (must be lowercase) | |
58 # SOURCES Test sources files | |
59 # LIBRARIES (Optional) Libraries to link to | |
60 # RESOURCES (Optional) Resources files to copy verbatim | |
61 # ) | |
62 # | |
63 # This will generate a target named test-<name> where name is the parameter NAME. The test is created | |
64 # under CMAKE_BINARY_DIR/test/<NAME> and resources are copied there with the same hierarchy. | |
65 # | |
66 # setg | |
67 # ---- | |
68 # | |
69 # setg(var value) | |
70 # | |
71 # Set a cache variable internal with name var. | |
72 # | |
73 # --------------------------------------------------------- | |
74 | |
75 function(apply_flags target flags) | |
76 # Add MALIKANIA_BUILD to enable declspec(dllexport) on Windows | |
77 if (${flags}) | |
78 target_compile_definitions( | |
79 ${target} | |
80 PRIVATE ${flags} | |
81 PRIVATE "MALIKANIA_BUILD" | |
82 ) | |
83 endif () | |
84 endfunction() | |
85 | |
86 function(apply_public_includes target var) | |
87 if (${var}) | |
88 target_include_directories(${target} PUBLIC ${${var}}) | |
89 endif () | |
2
2418900a1cc5
Client: switch to bridge pattern (PIMPL) with clean headers
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
90 |
2418900a1cc5
Client: switch to bridge pattern (PIMPL) with clean headers
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
91 target_include_directories( |
2418900a1cc5
Client: switch to bridge pattern (PIMPL) with clean headers
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
92 ${target} |
2418900a1cc5
Client: switch to bridge pattern (PIMPL) with clean headers
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
93 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/malikania/${WITH_BACKEND_DIRECTORY} |
2418900a1cc5
Client: switch to bridge pattern (PIMPL) with clean headers
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
94 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} |
2418900a1cc5
Client: switch to bridge pattern (PIMPL) with clean headers
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
95 ) |
0 | 96 endfunction() |
97 | |
98 function(apply_private_includes target var) | |
99 if (${var}) | |
100 target_include_directories(${target} PRIVATE ${${var}}) | |
101 endif () | |
102 endfunction() | |
103 | |
104 function(apply_includes target var) | |
105 if (${var}) | |
106 target_include_directories(${target} PRIVATE ${${var}}) | |
107 endif () | |
108 endfunction() | |
109 | |
110 function(apply_libraries target libs) | |
111 if (${libs}) | |
112 target_link_libraries(${target} ${${libs}}) | |
113 endif () | |
114 endfunction() | |
115 | |
116 function(check_args prefix list) | |
117 foreach (e ${list}) | |
118 if (NOT ${prefix}_${e}) | |
119 message(FATAL_ERROR "Please set `${e}' parameter") | |
120 endif () | |
121 endforeach () | |
122 endfunction() | |
123 | |
124 function(malikania_define_executable) | |
125 set(singleArgs TARGET) | |
126 set(multiArgs SOURCES FLAGS INCLUDES LIBRARIES) | |
127 set(mandatory TARGET SOURCES) | |
128 | |
129 cmake_parse_arguments(EXE "" "${singleArgs}" "${multiArgs}" ${ARGN}) | |
130 check_args(EXE ${mandatory}) | |
131 | |
132 add_executable(${EXE_TARGET} ${EXE_SOURCES}) | |
133 | |
134 apply_libraries(${EXE_TARGET} EXE_LIBRARIES) | |
135 apply_includes(${EXE_TARGET} EXE_INCLUDES) | |
136 apply_flags(${EXE_TARGET} EXE_FLAGS) | |
137 endfunction() | |
138 | |
139 function(malikania_create_library) | |
140 set(singleArgs TARGET) | |
141 set(multiArgs SOURCES FLAGS PRIVATE_INCLUDES PUBLIC_INCLUDES LIBRARIES) | |
142 set(mandatory TARGET SOURCES) | |
143 | |
144 cmake_parse_arguments(LIB "" "${singleArgs}" "${multiArgs}" ${ARGN}) | |
145 check_args(LIB ${mandatory}) | |
146 | |
147 add_library(${LIB_TARGET} SHARED ${LIB_SOURCES}) | |
148 | |
149 # Remove lib suffix to avoid conflict with client and libclient targets | |
150 set_target_properties( | |
151 ${LIB_TARGET} | |
152 PROPERTIES | |
153 PREFIX "" | |
154 ) | |
155 | |
156 list(APPEND LIB_LIBRARIES duktape) | |
157 | |
158 apply_libraries(${LIB_TARGET} LIB_LIBRARIES) | |
159 apply_private_includes(${LIB_TARGET} LIB_PRIVATE_INCLUDES) | |
160 apply_public_includes(${LIB_TARGET} LIB_PUBLIC_INCLUDES) | |
161 apply_flags(${LIB_TARGET} LIB_FLAGS) | |
162 endfunction() | |
163 | |
164 function(malikania_create_test) | |
165 set(singleArgs NAME) | |
166 set(multiArgs LIBRARIES SOURCES RESOURCES) | |
167 | |
168 set(mandatory NAME SOURCES) | |
169 | |
170 cmake_parse_arguments(TEST "" "${singleArgs}" "${multiArgs}" ${ARGN}) | |
171 check_args(TEST ${mandatory}) | |
172 | |
173 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/test/${TEST_NAME}) | |
174 | |
175 if (UNIX) | |
176 list(APPEND TEST_LIBRARIES pthread) | |
177 endif () | |
178 | |
179 # Resources files added before as custom output | |
180 foreach (f ${TEST_RESOURCES}) | |
181 get_filename_component(absolute ${f} ABSOLUTE) | |
182 file(RELATIVE_PATH basename ${CMAKE_CURRENT_SOURCE_DIR} ${absolute}) | |
183 set(output ${CMAKE_BINARY_DIR}/test/${TEST_NAME}/${basename}) | |
184 | |
185 add_custom_command( | |
186 OUTPUT ${output} | |
187 COMMAND ${CMAKE_COMMAND} -E copy ${absolute} ${output} | |
188 DEPENDS ${absolute} | |
189 ) | |
190 | |
191 list(APPEND TEST_SOURCES ${absolute}) | |
192 list(APPEND outputs ${output}) | |
193 endforeach () | |
194 | |
195 add_executable(test-${TEST_NAME} ${TEST_SOURCES} ${outputs}) | |
196 source_group(private\\Resources FILES ${outputs}) | |
197 target_compile_definitions(test-${TEST_NAME} PRIVATE SOURCE_DIRECTORY=\"${CMAKE_BINARY_DIR}/test/${TEST_NAME}\") | |
198 set_target_properties( | |
199 test-${TEST_NAME} | |
200 PROPERTIES | |
201 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/${TEST_NAME} | |
202 RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/test/${TEST_NAME} | |
203 RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/test/${TEST_NAME} | |
204 RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/test/${TEST_NAME} | |
205 RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR}/test/${TEST_NAME} | |
206 ) | |
207 add_test( | |
208 NAME ${TEST_NAME} | |
209 COMMAND $<TARGET_FILE:test-${TEST_NAME}> | |
210 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/test/${TEST_NAME} | |
211 ) | |
212 | |
213 target_link_libraries( | |
214 test-${TEST_NAME} | |
215 ${TEST_LIBRARIES} | |
216 gtest | |
217 ) | |
218 | |
219 add_dependencies(tests test-${TEST_NAME}) | |
220 endfunction() | |
221 | |
222 macro(setg var value) | |
223 set(${var} ${value} CACHE INTERNAL "" FORCE) | |
224 endmacro() |