]> Creatis software - cpPlugins.git/blob - cmake/Functions.cmake
...
[cpPlugins.git] / cmake / Functions.cmake
1 ## -------------------------------------------------------------------------
2 FUNCTION(NormPaths output_files)
3 SET(_out)
4 FOREACH(_f ${ARGN})
5   SET(_d)
6   FILE(TO_CMAKE_PATH ${_f} _d)
7   LIST(APPEND _out ${_d})
8 ENDFOREACH(_f)
9 SET(${output_files} "${_out}" PARENT_SCOPE)
10 ENDFUNCTION()
11
12 ## -------------------------------------------------------------------------
13 FUNCTION(Wrap_Qt_CPP output_files)
14 SET(_out)
15 FOREACH(_f ${ARGN})
16   IF(EXISTS ${_f})
17     FILE(READ ${_f} _txt)
18     STRING(FIND "${_txt}" "Q_OBJECT" _pos)
19     IF(NOT ${_pos} EQUAL -1)
20       SET(_s)
21       QT4_WRAP_CPP(_s ${_f})
22       SET(_out ${_out} ${_s})
23     ENDIF(NOT ${_pos} EQUAL -1)
24   ENDIF(EXISTS ${_f})
25 ENDFOREACH(_f)
26 SET(${output_files} "${_out}" PARENT_SCOPE)
27 ENDFUNCTION()
28
29 ## -------------------------------------------------------------------------
30 FUNCTION(Wrap_Qt_UI output_files)
31 NormPaths(_source_dir ${PROJECT_SOURCE_DIR})
32 NormPaths(_binary_dir ${PROJECT_BINARY_DIR})
33 SET(_out)
34 FOREACH(_f ${ARGN})
35   IF(EXISTS ${_f})
36     GET_FILENAME_COMPONENT(_name ${_f} NAME_WE)
37     GET_FILENAME_COMPONENT(_dir ${_f} DIRECTORY)
38     SET(_base_dir ${_source_dir})
39     STRING(FIND "${_dir}" "${_base_dir}" _pos)
40     IF(${_pos} EQUAL -1)
41       SET(_base_dir ${_binary_dir})
42       STRING(FIND "${_dir}" "${_base_dir}" _pos)
43     ENDIF(${_pos} EQUAL -1)
44     IF(NOT ${_pos} EQUAL -1)
45       STRING(REPLACE "${_base_dir}/" "" _dir ${_dir})
46       SET(_out_f ${_binary_dir}/${_dir}/ui_${_name}.h)
47       LIST(APPEND _out ${_out_f})
48       ADD_CUSTOM_COMMAND(
49         OUTPUT ${_out_f}
50         COMMAND Qt4::uic
51         ARGS -o ${_out_f} ${_f}
52         MAIN_DEPENDENCY ${_f} VERBATIM
53         )
54     ENDIF(NOT ${_pos} EQUAL -1)
55   ENDIF(EXISTS ${_f})
56 ENDFOREACH(_f)
57 SET(${output_files} "${_out}" PARENT_SCOPE)
58 ENDFUNCTION()
59
60 ## -------------------------------------------------------------------------
61 FUNCTION(
62   PrepareSourceFiles
63   out_sources_list
64   out_headers_list
65   out_headers_paths
66   )
67 SET(_config_extensions .c.in .cpp.in .cxx.in .h.in .hpp.in .hxx.in .ui.in)
68 SET(_sources_extensions .c .cpp .cxx)
69 SET(_headers_extensions .h .hpp .hxx)
70 SET(_qt_ui_extensions .ui)
71 SET(_demangler_extensions .d)
72
73 ## -- Configure inputs
74 SET(_all_files)
75 FOREACH(_file ${ARGN})
76   GET_FILENAME_COMPONENT(_ext ${_file} EXT)
77   LIST(FIND _config_extensions ${_ext} _cfg)
78   IF(NOT ${_cfg} EQUAL -1)
79     STRING(
80       REPLACE
81       ${PROJECT_SOURCE_DIR}
82       ${PROJECT_BINARY_DIR}
83       _file_bin
84       ${_file}
85       )
86     STRING(LENGTH ${_file_bin} _file_bin_len)
87     MATH(EXPR _file_bin_len "${_file_bin_len}-3")
88     STRING(SUBSTRING ${_file_bin} 0 ${_file_bin_len} _file_bin)
89     CONFIGURE_FILE(${_file} ${_file_bin} @ONLY)
90     LIST(APPEND _all_files ${_file_bin})
91   ELSE(NOT ${_cfg} EQUAL -1)
92     LIST(APPEND _all_files ${_file})
93   ENDIF(NOT ${_cfg} EQUAL -1)
94 ENDFOREACH(_file)
95
96 ## -- Separate files
97 SET(_srcs)
98 SET(_hdrs)
99 SET(_qts)
100 SET(_demanglers)
101 FOREACH(_file ${_all_files})
102   GET_FILENAME_COMPONENT(_ext ${_file} EXT)
103   LIST(FIND _sources_extensions ${_ext} _src)
104   LIST(FIND _headers_extensions ${_ext} _hdr)
105   LIST(FIND _qt_ui_extensions ${_ext} _ui)
106   LIST(FIND _demangler_extensions ${_ext} _dem)
107   IF(NOT ${_src} EQUAL -1)
108     LIST(APPEND _srcs ${_file})
109   ENDIF(NOT ${_src} EQUAL -1)
110   IF(NOT ${_hdr} EQUAL -1)
111     LIST(APPEND _hdrs ${_file})
112   ENDIF(NOT ${_hdr} EQUAL -1)
113   IF(NOT ${_ui} EQUAL -1)
114     LIST(APPEND _qts ${_file})
115   ENDIF(NOT ${_ui} EQUAL -1)
116   IF(NOT ${_dem} EQUAL -1)
117     LIST(APPEND _demanglers ${_file})
118   ENDIF(NOT ${_dem} EQUAL -1)
119 ENDFOREACH(_file)
120
121 # -- Prepare Qt4-based code
122 IF(Qt4_FOUND)
123   ## -- Guess what headers sould be qt-moc'ed
124   Wrap_Qt_CPP(_moc ${_hdrs})
125   IF(_moc)
126     LIST(APPEND _srcs ${_moc})
127   ENDIF(_moc)
128
129   ## -- Guess what qt-ui's sould be qt-uic'ed
130   ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change
131   ## -- the output file
132   Wrap_Qt_UI(_qt_hdrs ${_qts})
133   IF(_qt_hdrs)
134     LIST(APPEND _hdrs ${_qt_hdrs})
135   ENDIF(_qt_hdrs)
136 ENDIF(Qt4_FOUND)
137
138 ## -- Create demanglers
139 FOREACH(_d ${_demanglers})
140   STRING(
141     REPLACE
142     ${PROJECT_SOURCE_DIR}
143     ${PROJECT_BINARY_DIR}
144     _d_bin
145     ${_d}
146     )
147   GET_FILENAME_COMPONENT(_d_path ${_d_bin} DIRECTORY)
148   GET_FILENAME_COMPONENT(_out_name ${_d_bin} NAME_WE)
149   SET(_d_out ${_d_path}/${_out_name}_Demanglers.h)
150   ADD_CUSTOM_COMMAND(
151     OUTPUT ${_d_out}
152     COMMAND ${CMAKE_COMMAND} -E make_directory ${_d_path}
153     COMMAND ${cpPlugins_bash_CreateDemanglers_APP} ${_d} ${_out_name} ${_d_out}
154     DEPENDS ${cpPlugins_bash_CreateDemanglers_APP} ${_d}
155     )
156   LIST(APPEND _hdrs ${_d_out})
157 ENDFOREACH(_d)
158
159 ## -- Real compilation
160 SET(_hdrs_paths)
161 FOREACH(_hdr ${_hdrs})
162   GET_FILENAME_COMPONENT(_path ${_hdr} DIRECTORY)
163   LIST(FIND _hdrs_paths ${_path} _path_idx)
164   IF(${_path_idx} EQUAL -1)
165     LIST(APPEND _hdrs_paths ${_path})
166   ENDIF(${_path_idx} EQUAL -1)
167 ENDFOREACH(_hdr)
168
169 SET(${out_sources_list} ${_srcs} PARENT_SCOPE)
170 SET(${out_headers_list} ${_hdrs} PARENT_SCOPE)
171 SET(${out_headers_paths} ${_hdrs_paths} PARENT_SCOPE)
172
173 ENDFUNCTION()
174
175 ## -------------------------------------------------------------------------
176 FUNCTION(
177   CreateLib
178   lib_name
179   lib_type
180   )
181 PrepareSourceFiles(_srcs _hdrs _paths ${ARGN})
182 INCLUDE_DIRECTORIES(
183   ${_paths}
184   ${CMAKE_CURRENT_SOURCE_DIR}
185   ${CMAKE_CURRENT_BINARY_DIR}
186   )
187 IF(_srcs)
188   ADD_LIBRARY(${lib_name} ${lib_type} ${_srcs} ${_hdrs})
189   GENERATE_EXPORT_HEADER(
190     ${lib_name}
191     BASE_NAME ${lib_name}
192     EXPORT_MACRO_NAME ${lib_name}_EXPORT
193     EXPORT_FILE_NAME ${lib_name}_Export.h
194     STATIC_DEFINE ${lib_name}_BUILT_AS_STATIC
195     )
196   IF(${prj_NAME}_All_Headers)
197     SET(_hdr_tmp "${${prj_NAME}_All_Headers};${_hdrs}")
198   ELSE(${prj_NAME}_All_Headers)
199     SET(_hdr_tmp "${_hdrs}")
200   ENDIF(${prj_NAME}_All_Headers)
201   LIST(REMOVE_DUPLICATES _hdr_tmp)
202   SET(${prj_NAME}_All_Headers ${_hdr_tmp} CACHE INTERNAL "All headers." FORCE)
203 ENDIF(_srcs)
204 ENDFUNCTION()
205
206 ## -------------------------------------------------------------------------
207 FUNCTION(
208   CompileLibFromDir
209   lib_name
210   lib_type
211   lib_dir
212   )
213 FILE(GLOB_RECURSE _files "${lib_dir}/*")
214 CreateLib(${lib_name} ${lib_type} ${_files} ${ARGN})
215 ENDFUNCTION()
216
217 ## -------------------------------------------------------------------------
218 FUNCTION(
219   CompileInstances
220   out_lib_name
221   def_file
222   number_of_files
223   )
224
225 ### -- Configure inputs to be cmake-path compatible
226 SET(_src_dir ${CMAKE_CURRENT_SOURCE_DIR})
227 SET(_bin_dir ${CMAKE_CURRENT_BINARY_DIR})
228 SET(_def_file "${_src_dir}/${def_file}")
229
230 ## -- Infere source code filenames
231 MATH(EXPR _last_range "${number_of_files}-1")
232 SET(_out_code "${_bin_dir}/${out_lib_name}.h")
233 FOREACH(_n RANGE 0 ${_last_range})
234   LIST(APPEND _out_code ${_bin_dir}/${out_lib_name}_${_n}.cxx)
235 ENDFOREACH(_n)
236
237 ## -- Command to write source code
238 ADD_CUSTOM_COMMAND(
239   OUTPUT ${_out_code}
240   DEPENDS ${cpPlugins_bash_CreateInstances_APP} ${_def_file}
241   COMMAND ${cpPlugins_bash_CreateInstances_APP} ${_def_file} ${out_lib_name} ${_bin_dir} ${number_of_files}
242   )
243
244 ## -- Create library
245 CreateLib(${out_lib_name} SHARED "${_out_code}")
246
247 ENDFUNCTION()
248
249 ## -------------------------------------------------------------------------
250 FUNCTION(
251   CreatePlugin
252   lib_name
253   lib_dir
254   number_of_files
255   )
256
257 GET_FILENAME_COMPONENT(_lib_dir ${lib_dir} REALPATH)
258 FILE(GLOB_RECURSE _files "${_lib_dir}/*")
259 SET(_hdr_to_wrap)
260 SET(_instances)
261 FOREACH(_file ${_files})
262   FILE(READ ${_file} _txt)
263   STRING(FIND "${_txt}" "cpPluginsObject" _res)
264   IF(NOT ${_res} EQUAL -1)
265     LIST(APPEND _hdr_to_wrap ${_file})
266   ENDIF(NOT ${_res} EQUAL -1)
267   GET_FILENAME_COMPONENT(_ext ${_file} EXT)
268   IF(${_ext} STREQUAL ".i")
269     LIST(APPEND _instances ${_file})
270   ENDIF(${_ext} STREQUAL ".i")
271 ENDFOREACH(_file)
272
273 IF(_instances)
274   FOREACH(_instance ${_instances})
275     STRING(
276       REPLACE
277       ${PROJECT_SOURCE_DIR}
278       ${PROJECT_BINARY_DIR}
279       _out_dir
280       ${_lib_dir}
281       )
282     MATH(EXPR _last_range "${number_of_files}-1")
283     SET(_out_code "${_out_dir}/${lib_name}.h")
284     FOREACH(_n RANGE 0 ${_last_range})
285       LIST(APPEND _out_code ${_out_dir}/${lib_name}_${_n}.cxx)
286     ENDFOREACH(_n)
287
288     ADD_CUSTOM_COMMAND(
289       OUTPUT ${_out_code}
290       DEPENDS ${cpPlugins_bash_CreateInstances_APP} ${_instance}
291       COMMAND ${CMAKE_COMMAND} -E make_directory ${_out_dir}
292       COMMAND ${cpPlugins_bash_CreateInstances_APP} ${_instance} ${lib_name} ${_out_dir} ${number_of_files}
293       )
294     LIST(APPEND _files ${_out_code})
295   ENDFOREACH(_instance)
296 ENDIF(_instances)
297
298 IF(_hdr_to_wrap)
299   STRING(
300     REPLACE
301     ${PROJECT_SOURCE_DIR}
302     ${PROJECT_BINARY_DIR}
303     _out_dir
304     ${_lib_dir}
305     )
306   SET(_host ${_out_dir}/${lib_name}_host.cxx)
307   ADD_CUSTOM_COMMAND(
308     OUTPUT ${_host}
309     DEPENDS ${cpPlugins_bash_HostCreator_APP} ${_hdr_to_wrap}
310     COMMAND ${CMAKE_COMMAND} -E make_directory ${_out_dir}
311     COMMAND ${cpPlugins_bash_HostCreator_APP} ${lib_name} ${_host} ${_hdr_to_wrap}
312     )
313   LIST(APPEND _files ${_host})
314 ENDIF(_hdr_to_wrap)
315
316 CreateLib(${lib_name} SHARED ${_files})
317
318 ENDFUNCTION()
319
320 ## -------------------------------------------------------------------------
321 FUNCTION(
322   CompileAppFromDir
323   app_name
324   app_dir
325   )
326 OPTION(BUILD_${app_name} "Build ${app_name}" OFF)
327 IF(BUILD_${app_name})
328   FILE(GLOB_RECURSE _files "${app_dir}/*")
329   PrepareSourceFiles(_srcs _hdrs _paths ${_files} ${ARGN})
330   INCLUDE_DIRECTORIES(
331     ${_paths}
332     ${CMAKE_CURRENT_SOURCE_DIR}
333     ${CMAKE_CURRENT_BINARY_DIR}
334     )
335   IF(_srcs)
336     SET(_app_os_target)
337     IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
338       SET(_app_os_target WIN32)
339       ELSEIF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
340       SET(_app_os_target MACOSX_BUNDLE)
341     ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
342     ADD_EXECUTABLE(${app_name} ${_app_os_target} ${_srcs} ${_hdrs})
343   ENDIF(_srcs)
344 ENDIF(BUILD_${app_name})
345 ENDFUNCTION()
346
347 ## eof - $RCSfile$