]> Creatis software - cpPlugins.git/blob - cmake/cpPlugins_Functions.cmake
...
[cpPlugins.git] / cmake / cpPlugins_Functions.cmake
1
2 ## =================================
3 ## == Function to build a library ==
4 ## =================================
5
6 FUNCTION(cpPlugins_ManageLibrary library_name type sources headers qt_files version short_version)
7
8 ## -- Configure some simple values
9 SET(_all_sources ${sources})
10 SET(_all_headers ${headers})
11
12 ## -- Guess what headers sould be qt-moc'ed
13 IF(Qt4_FOUND)
14   FOREACH(_h ${headers})
15     FILE(READ ${_h} _txt)
16     STRING(FIND "${_txt}" "Q_OBJECT" _r)
17     IF(NOT ${_r} EQUAL -1)
18       SET(_s)
19       QT4_WRAP_CPP(_s ${_h})
20       SET(_all_sources ${_all_sources} ${_s})
21     ENDIF(NOT ${_r} EQUAL -1)
22   ENDFOREACH(_h)
23 ENDIF(Qt4_FOUND)
24
25 ## -- Guess what qt-ui's sould be qt-uic'ed
26 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change the
27 ## -- output file
28 IF(Qt4_FOUND)
29   FOREACH(_ui ${qt_files})
30     SET(_base_dir ${CMAKE_CURRENT_SOURCE_DIR})
31     STRING(FIND "${_ui}" "${_base_dir}" _pos)
32     IF(${_pos} EQUAL -1)
33       SET(_base_dir ${CMAKE_CURRENT_BINARY_DIR})
34       STRING(FIND "${_ui}" "${_base_dir}" _pos)
35     ENDIF(${_pos} EQUAL -1)
36     SET(_relative_dir)
37     IF(NOT ${_pos} EQUAL -1)
38       FILE(TO_CMAKE_PATH ${_base_dir} _base_cmake_dir)
39       FILE(TO_CMAKE_PATH ${_ui} _ui_dir)
40       STRING(REPLACE "${_base_cmake_dir}/" "" _relative_dir ${_ui_dir})
41     ENDIF(NOT ${_pos} EQUAL -1)
42     GET_FILENAME_COMPONENT(_ui_name ${_ui} NAME_WE)
43     STRING(FIND "${_relative_dir}" "/" _pos REVERSE)
44     STRING(SUBSTRING "${_relative_dir}" 0 ${_pos} _o)
45     SET(_o_name ${CMAKE_CURRENT_BINARY_DIR}/${_o}/ui_${_ui_name}.h)
46     ADD_CUSTOM_COMMAND(
47       OUTPUT ${_o_name}
48       COMMAND Qt4::uic
49       ARGS -o ${_o_name} ${_ui}
50       MAIN_DEPENDENCY ${_ui} VERBATIM
51       )
52     SET(_all_sources ${_all_sources} ${_o_name})
53   ENDFOREACH(_ui)
54 ENDIF(Qt4_FOUND)
55
56 ## -- Ok, compile library
57 IF(_all_sources)
58
59   ## -- Try to guess the binary directory
60   SET(_relative_dir)
61   FOREACH(_s ${_all_sources})
62     GET_FILENAME_COMPONENT(_d ${_s} DIRECTORY)
63     SET(_base_dir ${CMAKE_CURRENT_SOURCE_DIR})
64     STRING(FIND "${_d}" "${_base_dir}" _pos)
65     IF(${_pos} EQUAL -1)
66       SET(_base_dir ${CMAKE_CURRENT_BINARY_DIR})
67       STRING(FIND "${_d}" "${_base_dir}" _pos)
68     ENDIF(${_pos} EQUAL -1)
69     IF(NOT ${_pos} EQUAL -1)
70       FILE(TO_CMAKE_PATH ${_base_dir} _base_cmake_dir)
71       FILE(TO_CMAKE_PATH ${_d} _d_dir)
72       STRING(REPLACE "${_base_cmake_dir}/" "" _almost_relative_dir ${_d_dir})
73       STRING(FIND "${_almost_relative_dir}" "/" _pos)
74       IF(NOT ${_pos} EQUAL -1)
75         STRING(SUBSTRING ${_almost_relative_dir} 0 ${_pos} _relative_dir)
76       ELSE(NOT ${_pos} EQUAL -1)
77         SET(_relative_dir ${_almost_relative_dir})
78       ENDIF(NOT ${_pos} EQUAL -1)
79       BREAK()
80     ENDIF(NOT ${_pos} EQUAL -1)
81   ENDFOREACH(_s)
82   SET(_cur_binary_dir "${CMAKE_CURRENT_BINARY_DIR}/${_relative_dir}")
83
84   ADD_LIBRARY(${library_name} SHARED ${_all_sources})
85   SET_TARGET_PROPERTIES(
86     ${library_name} PROPERTIES
87     VERSION "${version}"
88     SOVERSION "${short_version}"
89     )
90   GENERATE_EXPORT_HEADER(
91     ${library_name}
92     BASE_NAME ${library_name}
93     EXPORT_MACRO_NAME ${library_name}_EXPORT
94     EXPORT_FILE_NAME ${_cur_binary_dir}/${library_name}_Export.h
95     STATIC_DEFINE ${library_name}_BUILT_AS_STATIC
96     )
97   TARGET_LINK_LIBRARIES(${library_name} ${ARGN})
98   SET(${library_name}_LIB ${library_name} CACHE INTERNAL "Library ${name}")
99 ENDIF(_all_sources)
100
101 ENDFUNCTION()
102
103 ## ==================================================
104 ## == Function to build a library from a directory ==
105 ## ==================================================
106
107 FUNCTION(cpPlugins_CreateLibraryFromDirectory library_name type source_dir binary_dir version short_version)
108
109 ## -- Some useful variables
110 SET(_all_sources_extensions c cpp cxx)
111 SET(_all_headers_extensions h hpp hxx)
112 SET(_all_qt_ui_extensions ui)
113 SET(_all_dirs ${source_dir} ${binary_dir})
114 SET(_all_sources)
115 SET(_all_headers)
116 SET(_all_qt_ui)
117
118 ## -- Configure some files
119 FILE(GLOB_RECURSE _all_configs "${source_dir}/*.in")
120 FOREACH(_c ${_all_configs})
121   SET(_base_dir ${CMAKE_CURRENT_SOURCE_DIR})
122   STRING(FIND "${_c}" "${_base_dir}" _pos)
123   IF(${_pos} EQUAL -1)
124     SET(_base_dir ${CMAKE_CURRENT_BINARY_DIR})
125     STRING(FIND "${_c}" "${_base_dir}" _pos)
126   ENDIF(${_pos} EQUAL -1)
127   SET(_relative_dir)
128   IF(NOT ${_pos} EQUAL -1)
129     FILE(TO_CMAKE_PATH ${_base_dir} _base_cmake_dir)
130     FILE(TO_CMAKE_PATH ${_c} _c_dir)
131     STRING(REPLACE "${_base_cmake_dir}/" "" _almost_relative_dir ${_c_dir})
132     STRING(FIND "${_almost_relative_dir}" "/" _pos)
133     SET(_relative_dir ${_almost_relative_dir})
134     IF(NOT ${_pos} EQUAL -1)
135       STRING(SUBSTRING ${_almost_relative_dir} 0 ${_pos} _relative_dir)
136     ENDIF(NOT ${_pos} EQUAL -1)
137   ENDIF(NOT ${_pos} EQUAL -1)
138   GET_FILENAME_COMPONENT(_c_name ${_c} NAME)
139   STRING(REGEX REPLACE ".in" "" _o_name ${_c_name})
140   CONFIGURE_FILE(
141     ${_c} ${CMAKE_CURRENT_BINARY_DIR}/${_relative_dir}/${_o_name} @ONLY
142     )
143   SET(_all_headers ${_all_headers} ${CMAKE_CURRENT_BINARY_DIR}/${_relative_dir}/${_o_name})
144 ENDFOREACH(_c)
145
146 ## -- Glob source code
147 FOREACH(_d ${_all_dirs})
148   FOREACH(_e ${_all_sources_extensions})
149     FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
150     SET(_all_sources ${_all_sources} ${_f})
151   ENDFOREACH(_e)
152   FOREACH(_e ${_all_headers_extensions})
153     FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
154     SET(_all_headers ${_all_headers} ${_f})
155   ENDFOREACH(_e)
156   FOREACH(_e ${_all_qt_ui_extensions})
157     FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
158     SET(_all_qt_ui ${_all_qt_ui} ${_f})
159   ENDFOREACH(_e)
160 ENDFOREACH(_d)
161
162 ## -- Create library
163 cpPlugins_ManageLibrary(
164   ${library_name} ${type}
165   "${_all_sources}" "${_all_headers}" "${_all_qt_ui}"
166   "${version}" "${short_version}"
167   ${ARGN}
168   )
169
170 ENDFUNCTION()
171
172 ## ================================
173 ## == Function to wrap instances ==
174 ## ================================
175
176 FUNCTION(cpPlugins_WrapInstances def_file prefix version short_version)
177
178 ## -- Configure some simple values
179 SET(_def_canonical_file "${CMAKE_CURRENT_SOURCE_DIR}/${def_file}.i")
180 SET(_header_file        "${CMAKE_CURRENT_BINARY_DIR}/${prefix}${def_file}.h")
181 SET(_code_file          "${CMAKE_CURRENT_BINARY_DIR}/${prefix}${def_file}.cxx")
182 SET(_extra_code_file    "${CMAKE_CURRENT_SOURCE_DIR}/${def_file}_extra.cxx")
183 SET(_library_name       "${prefix}${def_file}")
184
185 ## -- Add extra code, if any
186 SET(_all_code_files ${_code_file})
187 IF(EXISTS ${_extra_code_file})
188   SET(_all_code_files ${_all_code_files} ${_extra_code_file})
189 ENDIF(EXISTS ${_extra_code_file})
190
191 ## -- Command to write source code
192 ADD_CUSTOM_COMMAND(
193   OUTPUT ${_header_file} ${_code_file}
194   DEPENDS ${cpPlugins_CreateInstances_APP} ${_def_canonical_file}
195   COMMAND ${cpPlugins_CreateInstances_APP} ${_def_canonical_file} ${_library_name} ${CMAKE_CURRENT_BINARY_DIR}
196   )
197
198 ## -- Create library
199 cpPlugins_ManageLibrary(
200   ${_library_name} SHARED
201   "${_all_code_files}" "" ""
202   "${version}" "${short_version}"
203   ${ARGN}
204   )
205
206 ENDFUNCTION()
207
208 ## ====================================
209 ## == Function to wrap plugins hosts ==
210 ## ====================================
211
212 FUNCTION(cpPlugins_WrapPlugins source_dir version short_version prefix)
213
214 ## -- Some configuration values
215 SET(_source_dir ${CMAKE_CURRENT_SOURCE_DIR}/${source_dir})
216 SET(_binary_dir ${CMAKE_CURRENT_BINARY_DIR}/${source_dir})
217 SET(_lib_name ${prefix}${source_dir})
218
219 ## -- Get source code
220 FILE(GLOB_RECURSE _hdr_h   "${_source_dir}/*.h")
221 FILE(GLOB_RECURSE _hdr_hxx "${_source_dir}/*.hxx")
222 FILE(GLOB_RECURSE _hdr_hpp "${_source_dir}/*.hpp")
223 FILE(GLOB_RECURSE _src_c   "${_source_dir}/*.c")
224 FILE(GLOB_RECURSE _src_cxx "${_source_dir}/*.cxx")
225 FILE(GLOB_RECURSE _src_cpp "${_source_dir}/*.cpp")
226 FILE(GLOB_RECURSE _qt_ui   "${_source_dir}/*.ui")
227
228 ## -- Identify sources to wrap
229 SET(_hdr_to_wrap)
230 FOREACH(_h ${_hdr_h})
231   FILE(READ ${_h} _txt)
232   STRING(FIND "${_txt}" "cpPluginsObject;" _res)
233   IF(NOT ${_res} EQUAL -1)
234     LIST(APPEND _hdr_to_wrap ${_h})
235   ENDIF(NOT ${_res} EQUAL -1)
236 ENDFOREACH(_h)
237
238 ## -- Integrate all source files
239 SET(_all_src ${_src_c} ${_src_cpp} ${_src_cxx})
240 SET(_all_hdr ${_hdr_h} ${_hdr_hpp} ${_hdr_hxx})
241
242 ## -- Wrap plugins
243 IF(_hdr_to_wrap)
244   SET(_host ${_binary_dir}/${_lib_name}_host.cxx)
245   ADD_CUSTOM_COMMAND(
246     OUTPUT ${_host}
247     DEPENDS ${cpPlugins_HostCreator_APP} ${_hdr_to_wrap}
248     COMMAND ${cpPlugins_HostCreator_APP} ${_lib_name} ${_host} ${_hdr_to_wrap}
249     )
250   SET(_all_src ${_all_src} ${_host})
251 ENDIF(_hdr_to_wrap)
252
253 ## -- Ok, build library
254 IF(_all_src)
255   cpPlugins_ManageLibrary(
256     ${_lib_name} SHARED
257     "${_all_src}" "${_all_hdr}" "${_qt_ui}"
258     "${version}" "${short_version}"
259     ${ARGN}
260     )
261 ELSE(_all_src)
262   MESSAGE(FATAL_ERROR "No source code found to build \"${_lib_name}\"")
263 ENDIF(_all_src)
264
265 ENDFUNCTION()
266
267 ## ======================================
268 ## == Function to build an application ==
269 ## ======================================
270
271 FUNCTION(cpPlugins_BuildAppFromDirectory directory)
272
273 ## -- Some configuration values
274 FILE(TO_CMAKE_PATH ${directory} _src_dir)
275 STRING(REPLACE "${PROJECT_SOURCE_DIR}/" "" _bin_dir ${_src_dir})
276 SET(_bin_dir "${PROJECT_BINARY_DIR}/${_bin_dir}")
277 GET_FILENAME_COMPONENT(_app_name ${_src_dir} NAME)
278 SET(_all_sources_extensions c cpp cxx)
279 SET(_all_headers_extensions h hpp hxx)
280 SET(_all_qt_ui_extensions ui)
281 SET(_all_dirs ${_src_dir} ${_bin_dir})
282 SET(_all_sources)
283 SET(_all_headers)
284 SET(_all_qt_ui)
285
286 ## -- Compilation option
287 OPTION(BUILD_${_app_name} "Build \"${_app_name}\" application" OFF)
288
289 ## -- Glob source code
290 FOREACH(_d ${_all_dirs})
291   FOREACH(_e ${_all_sources_extensions})
292     FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
293     SET(_all_sources ${_all_sources} ${_f})
294   ENDFOREACH(_e)
295   FOREACH(_e ${_all_headers_extensions})
296     FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
297     SET(_all_headers ${_all_headers} ${_f})
298   ENDFOREACH(_e)
299   FOREACH(_e ${_all_qt_ui_extensions})
300     FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
301     SET(_all_qt_ui ${_all_qt_ui} ${_f})
302   ENDFOREACH(_e)
303 ENDFOREACH(_d)
304
305 ## -- Guess what headers sould be qt-moc'ed
306 FOREACH(_h ${_all_headers})
307   FILE(READ ${_h} _txt)
308   STRING(FIND "${_txt}" "Q_OBJECT" _r)
309   IF(NOT ${_r} EQUAL -1)
310     SET(_s)
311     QT4_WRAP_CPP(_s ${_h})
312     SET(_all_sources ${_all_sources} ${_s})
313   ENDIF(NOT ${_r} EQUAL -1)
314 ENDFOREACH(_h)
315
316 ## -- Guess what qt-ui's sould be qt-uic'ed
317 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change the
318 ## -- output file
319 FOREACH(_ui ${_all_qt_ui})
320   GET_FILENAME_COMPONENT(_r_ui ${_ui} NAME_WE)
321   SET(_o_ui ${_bin_dir}/ui_${_r_ui}.h)
322   ADD_CUSTOM_COMMAND(
323     OUTPUT ${_o_ui}
324     COMMAND Qt4::uic
325     ARGS -o ${_o_ui} ${_ui}
326     MAIN_DEPENDENCY ${_ui} VERBATIM
327     )
328   SET(_all_sources ${_all_sources} ${_o_ui})
329   SET(_all_headers ${_all_headers} ${_o_ui})
330 ENDFOREACH(_ui)
331
332 ## -- Ok, compile application
333 IF(_all_sources)
334   ADD_EXECUTABLE(${_app_name} ${_all_sources})
335   TARGET_LINK_LIBRARIES(${_app_name} ${ARGN})
336 ELSE(_all_sources)
337   MESSAGE(FATAL_ERROR "No source code found to build \"${_app_name}\"")
338 ENDIF(_all_sources)
339
340 ENDFUNCTION()
341
342 ## eof - $RCSfile$