]> Creatis software - FrontAlgorithms.git/blob - cmake/Functions.cmake
update
[FrontAlgorithms.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   lib_name
64   out_sources_list
65   out_headers_list
66   out_headers_paths
67   )
68 SET(_config_extensions .c.in .cpp.in .cxx.in .h.in .hpp.in .hxx.in .ui.in)
69 SET(_sources_extensions .c .cpp .cxx)
70 SET(_headers_extensions .h .hpp .hxx)
71 SET(_qt_ui_extensions .ui)
72 SET(_demangler_extensions .d)
73 SET(_instances_extensions .i)
74
75 ## -- Configure inputs
76 SET(_all_files)
77 FOREACH(_file ${ARGN})
78   GET_FILENAME_COMPONENT(_ext ${_file} EXT)
79   LIST(FIND _config_extensions ${_ext} _cfg)
80   IF(NOT ${_cfg} EQUAL -1)
81     STRING(
82       REPLACE
83       ${PROJECT_SOURCE_DIR}
84       ${PROJECT_BINARY_DIR}
85       _file_bin
86       ${_file}
87       )
88     STRING(LENGTH ${_file_bin} _file_bin_len)
89     MATH(EXPR _file_bin_len "${_file_bin_len}-3")
90     STRING(SUBSTRING ${_file_bin} 0 ${_file_bin_len} _file_bin)
91     CONFIGURE_FILE(${_file} ${_file_bin} @ONLY)
92     LIST(APPEND _all_files ${_file_bin})
93   ELSE(NOT ${_cfg} EQUAL -1)
94     LIST(APPEND _all_files ${_file})
95   ENDIF(NOT ${_cfg} EQUAL -1)
96 ENDFOREACH(_file)
97
98 ## -- Separate files
99 SET(_srcs)
100 SET(_hdrs)
101 SET(_qts)
102 SET(_demanglers)
103 SET(_instances)
104 FOREACH(_file ${_all_files})
105   GET_FILENAME_COMPONENT(_ext ${_file} EXT)
106   LIST(FIND _sources_extensions ${_ext} _src)
107   LIST(FIND _headers_extensions ${_ext} _hdr)
108   LIST(FIND _qt_ui_extensions ${_ext} _ui)
109   LIST(FIND _demangler_extensions ${_ext} _dem)
110   LIST(FIND _instances_extensions ${_ext} _ins)
111   IF(NOT ${_src} EQUAL -1)
112     LIST(APPEND _srcs ${_file})
113   ENDIF(NOT ${_src} EQUAL -1)
114   IF(NOT ${_hdr} EQUAL -1)
115     LIST(APPEND _hdrs ${_file})
116   ENDIF(NOT ${_hdr} EQUAL -1)
117   IF(NOT ${_ui} EQUAL -1)
118     LIST(APPEND _qts ${_file})
119   ENDIF(NOT ${_ui} EQUAL -1)
120   IF(NOT ${_dem} EQUAL -1)
121     LIST(APPEND _demanglers ${_file})
122   ENDIF(NOT ${_dem} EQUAL -1)
123   IF(NOT ${_ins} EQUAL -1)
124     LIST(APPEND _instances ${_file})
125   ENDIF(NOT ${_ins} EQUAL -1)
126 ENDFOREACH(_file)
127
128 # -- Prepare Qt4-based code
129 IF(Qt4_FOUND)
130   ## -- Guess what headers sould be qt-moc'ed
131   Wrap_Qt_CPP(_moc ${_hdrs})
132   IF(_moc)
133     LIST(APPEND _srcs ${_moc})
134   ENDIF(_moc)
135
136   ## -- Guess what qt-ui's sould be qt-uic'ed
137   ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change
138   ## -- the output file
139   Wrap_Qt_UI(_qt_hdrs ${_qts})
140   IF(_qt_hdrs)
141     LIST(APPEND _hdrs ${_qt_hdrs})
142   ENDIF(_qt_hdrs)
143 ENDIF(Qt4_FOUND)
144
145 ## -- Create demanglers
146 FOREACH(_d ${_demanglers})
147   STRING(
148     REPLACE
149     ${PROJECT_SOURCE_DIR}
150     ${PROJECT_BINARY_DIR}
151     _d_bin
152     ${_d}
153     )
154   GET_FILENAME_COMPONENT(_d_path ${_d_bin} DIRECTORY)
155   GET_FILENAME_COMPONENT(_out_name ${_d_bin} NAME_WE)
156   SET(_d_out ${_d_path}/${_out_name}_Demanglers.h)
157   ADD_CUSTOM_COMMAND(
158     OUTPUT ${_d_out}
159     COMMAND ${CMAKE_COMMAND} -E make_directory ${_d_path}
160     COMMAND ${cpPlugins_bash_CreateDemanglers_APP} ${_d} ${_out_name} ${_d_out}
161     DEPENDS ${cpPlugins_bash_CreateDemanglers_APP} ${_d}
162     )
163   LIST(APPEND _hdrs ${_d_out})
164 ENDFOREACH(_d)
165
166 ## -- Create instances
167 FOREACH(_i ${_instances})
168   STRING(
169     REPLACE
170     ${PROJECT_SOURCE_DIR}
171     ${PROJECT_BINARY_DIR}
172     _i_bin
173     ${_i}
174     )
175   GET_FILENAME_COMPONENT(_i_path ${_i_bin} DIRECTORY)
176   GET_FILENAME_COMPONENT(_out_name ${_i} NAME_WE)
177
178   ## -- Infere source code filenames
179   MATH(EXPR _last_range "${cpPlugins_NUMBER_OF_FILES}-1")
180   SET(_out_code)
181   FOREACH(_n RANGE 0 ${_last_range})
182     LIST(APPEND _out_code ${_i_path}/${_out_name}_${_n}.cxx)
183     LIST(APPEND _srcs ${_i_path}/${_out_name}_${_n}.cxx)
184   ENDFOREACH(_n)
185
186   ## -- Command to write source code
187   ADD_CUSTOM_COMMAND(
188     OUTPUT ${_out_code}
189     DEPENDS ${cpPlugins_bash_CreateInstances_APP} ${_i}
190     COMMAND ${CMAKE_COMMAND} -E make_directory ${_i_path}
191     COMMAND ${cpPlugins_bash_CreateInstances_APP} ${_i} ${lib_name} ${_i_path}/${_out_name}
192     )
193 ENDFOREACH(_i)
194
195 ## -- Real compilation
196 SET(_hdrs_paths)
197 FOREACH(_hdr ${_hdrs})
198   GET_FILENAME_COMPONENT(_path ${_hdr} DIRECTORY)
199   LIST(FIND _hdrs_paths ${_path} _path_idx)
200   IF(${_path_idx} EQUAL -1)
201     LIST(APPEND _hdrs_paths ${_path})
202   ENDIF(${_path_idx} EQUAL -1)
203 ENDFOREACH(_hdr)
204
205 SET(${out_sources_list} ${_srcs} PARENT_SCOPE)
206 SET(${out_headers_list} ${_hdrs} PARENT_SCOPE)
207 SET(${out_headers_paths} ${_hdrs_paths} PARENT_SCOPE)
208
209 ENDFUNCTION()
210
211 ## -------------------------------------------------------------------------
212 FUNCTION(cpPlugins_BuildLibrary lib_name lib_type)
213 # -- Detect all source files
214 SET(_all_files)
215 FOREACH(_c ${ARGN})
216   GET_FILENAME_COMPONENT(_cname ${_c} ABSOLUTE)
217   SET(_files)
218   IF(IS_DIRECTORY ${_cname})
219     FILE(GLOB_RECURSE _files "${_cname}/*")
220   ELSE(IS_DIRECTORY ${_cname})
221     SET(_files ${_cname})
222   ENDIF(IS_DIRECTORY ${_cname})
223   LIST(APPEND _all_files ${_files})
224 ENDFOREACH(_c ${ARGN})
225
226 ## -- Prepare sources by types
227 PrepareSourceFiles(${lib_name} _srcs _hdrs _paths ${_all_files})
228
229 ## -- Build library
230 IF(_srcs)
231   INCLUDE_DIRECTORIES(
232     ${CMAKE_CURRENT_SOURCE_DIR}
233     ${CMAKE_CURRENT_BINARY_DIR}
234     )
235   ADD_LIBRARY(${lib_name} ${lib_type} ${_srcs} ${_hdrs})
236   GENERATE_EXPORT_HEADER(
237     ${lib_name}
238     BASE_NAME ${lib_name}
239     EXPORT_MACRO_NAME ${lib_name}_EXPORT
240     EXPORT_FILE_NAME ${lib_name}_Export.h
241     STATIC_DEFINE ${lib_name}_BUILT_AS_STATIC
242     )
243 ENDIF(_srcs)
244
245 ENDFUNCTION()
246
247 ## -------------------------------------------------------------------------
248 FUNCTION(cpPlugins_BuildPluginsLibrary lib_name)
249 # -- Detect all source files
250 SET(_all_files)
251 FOREACH(_c ${ARGN})
252   GET_FILENAME_COMPONENT(_cname ${_c} ABSOLUTE)
253   SET(_files)
254   IF(IS_DIRECTORY ${_cname})
255     FILE(GLOB_RECURSE _files "${_cname}/*")
256   ELSE(IS_DIRECTORY ${_cname})
257     SET(_files ${_cname})
258   ENDIF(IS_DIRECTORY ${_cname})
259   LIST(APPEND _all_files ${_files})
260 ENDFOREACH(_c ${ARGN})
261
262 ## -- Prepare sources by types
263 PrepareSourceFiles(${lib_name} _srcs _hdrs _paths ${_all_files})
264
265 ## -- Check which headers need to be wrapped to build host code
266 SET(_hdrs_to_wrap)
267 FOREACH(_hdr ${_hdrs})
268   IF(EXISTS ${_hdr})
269     FILE(READ ${_hdr} _txt)
270     STRING(FIND "${_txt}" "cpPluginsObject" _res)
271     IF(NOT ${_res} EQUAL -1)
272       LIST(APPEND _hdrs_to_wrap ${_hdr})
273     ENDIF(NOT ${_res} EQUAL -1)
274   ENDIF(EXISTS ${_hdr})
275 ENDFOREACH(_hdr)
276
277 ## -- Wrap headers
278 IF(_hdrs_to_wrap)
279   SET(_host ${CMAKE_CURRENT_BINARY_DIR}/${lib_name}_host.cxx)
280   ADD_CUSTOM_COMMAND(
281     OUTPUT ${_host}
282     DEPENDS ${cpPlugins_bash_HostCreator_APP} ${_hdrs_to_wrap}
283     COMMAND ${cpPlugins_bash_HostCreator_APP} ${lib_name} ${_host} ${_hdrs_to_wrap}
284     )
285   LIST(APPEND _all_files ${_host})
286 ENDIF(_hdrs_to_wrap)
287
288 cpPlugins_BuildLibrary(${lib_name} SHARED ${_all_files})
289 ENDFUNCTION()
290
291 ## -------------------------------------------------------------------------
292 FUNCTION(cpPlugins_BuildApplication app_name)
293 OPTION(BUILD_${app_name} "Build \"${app_name}\" application?" OFF)
294 IF(BUILD_${app_name})
295   # -- Detect all source files
296   SET(_all_files)
297   FOREACH(_c ${ARGN})
298     GET_FILENAME_COMPONENT(_cname ${_c} ABSOLUTE)
299     SET(_files)
300     IF(IS_DIRECTORY ${_cname})
301       FILE(GLOB_RECURSE _files "${_cname}/*")
302     ELSE(IS_DIRECTORY ${_cname})
303       SET(_files ${_cname})
304     ENDIF(IS_DIRECTORY ${_cname})
305     LIST(APPEND _all_files ${_files})
306   ENDFOREACH(_c ${ARGN})
307
308   ## -- Prepare sources by types
309   PrepareSourceFiles(${app_name} _srcs _hdrs _paths ${_all_files})
310
311   ## -- Build library
312   IF(_srcs)
313     INCLUDE_DIRECTORIES(
314       ${CMAKE_CURRENT_SOURCE_DIR}
315       ${CMAKE_CURRENT_BINARY_DIR}
316       )
317     SET(_app_os_target)
318     IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
319       SET(_app_os_target WIN32)
320       ELSEIF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
321       SET(_app_os_target MACOSX_BUNDLE)
322     ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
323     ADD_EXECUTABLE(${app_name} ${_app_os_target} ${_srcs} ${_hdrs})
324   ENDIF(_srcs)
325 ENDIF(BUILD_${app_name})
326 ENDFUNCTION()
327
328 ## eof - $RCSfile$