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