]> Creatis software - cpPlugins.git/blob - cmake/cpPlgFunctions.cmake
Moved to version 1.0
[cpPlugins.git] / cmake / cpPlgFunctions.cmake
1 ## =========================================================================
2 ## @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co)
3 ## =========================================================================
4
5 ## -------------------------------------------------------------------------
6 function(cpPlugins_PrepareSources
7   inputs recurrent includes links src hdr dirs plg def
8   )
9
10 ## -- Process targets include dirs
11 set(_dirs)
12 if(links)
13   foreach(_l ${links})
14     if(TARGET ${_l})
15       get_target_property(
16         _incl
17         ${_l}
18         INTERFACE_INCLUDE_DIRECTORIES
19         )
20       if(_incl)
21         foreach(_d ${_incl})
22           list(APPEND _dirs ${_d})
23         endforeach(_d)
24       endif(_incl)
25     endif(TARGET ${_l})
26   endforeach(_l)
27 endif(links)
28
29 ## -- Start by configuring _dflags for cpPlugins_MOC
30 set(_dflags)
31 get_property(
32   _global_dirs
33   DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
34   PROPERTY INCLUDE_DIRECTORIES
35   )
36 foreach(_i ${_global_dirs})
37   set(_dflags ${_dflags} "-I${_i}")
38 endforeach()
39 foreach(_i ${includes})
40   set(_dflags ${_dflags} "-I${_i}")
41 endforeach(_i)
42
43 ## -- Process all inputs
44 set(_files)
45 foreach(_s ${inputs})
46   ## -- Canonicalize path
47   get_filename_component(_p "${_s}" ABSOLUTE)
48
49   ## -- Check type of input
50   if(IS_DIRECTORY ${_p})
51     list(APPEND _dirs ${_p})
52     set(_dflags ${_dflags} "-I${_p}")
53     if(${recurrent})
54       file(GLOB_RECURSE _f "${_p}/*")
55     else(${recurrent})
56       file(GLOB _f "${_p}/*")
57     endif(${recurrent})
58     foreach(_x ${_f})
59       if(NOT IS_DIRECTORY ${_x})
60         list(APPEND _files ${_x})
61       endif(NOT IS_DIRECTORY ${_x})
62     endforeach(_x)
63   else(IS_DIRECTORY ${_p})
64     list(APPEND _files ${_p})
65   endif(IS_DIRECTORY ${_p})
66 endforeach(_s)
67
68 ## -- Process sources by extension
69 set(_def)
70 set(_cpp)
71 set(_hpp)
72 set(_qui)
73 set(_plg)
74
75 foreach(_f ${_files})
76   ## -- Separate filename from extension
77   string(REGEX REPLACE "\\.[^.]*$" "" _name ${_f})
78   string(REPLACE ${_name} "" _ext ${_f})
79   set(_out_name ${_name})
80   set(_out_ext ${_ext})
81
82   if(_out_ext)
83     ## -- Process .in files
84     string(COMPARE EQUAL "${_ext}" ".in" _in_cmp)
85     if(_in_cmp)
86       string(REPLACE ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR} _out ${_name})
87       configure_file(${_f} ${_out} @ONLY)
88       string(REGEX REPLACE "\\.[^.]*$" "" _out_name ${_out})
89       string(REPLACE ${_out_name} "" _out_ext ${_out})
90       get_filename_component(_dir ${_out} DIRECTORY)
91       list(APPEND _dirs ${_dir})
92     endif(_in_cmp)
93
94     ## -- Process .d files
95     string(COMPARE EQUAL "${_ext}" ".d" _d_cmp)
96     if(_d_cmp)
97       string(REPLACE ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR} _out ${_name})
98       string(REGEX REPLACE "\\.[^.]*$" "" _out_name ${_out})
99       string(REPLACE ${_out_name} "" _out_ext ${_out})
100       get_filename_component(_dir ${_out} DIRECTORY)
101       list(APPEND _dirs ${_dir})
102       add_custom_command(
103         OUTPUT ${_out}
104         COMMAND ${CMAKE_COMMAND} -E make_directory ${_dir}
105         COMMAND cpPlugins_MOC -i ${_f} -o ${_out} ${_dflags}
106         MAIN_DEPENDENCY ${_f}
107         DEPENDS cpPlugins_MOC
108         VERBATIM
109         )
110       string(SUBSTRING ${_out_ext} 0 2 _ext_cmp)
111     endif(_d_cmp)
112
113     ## -- Process .plg files
114     string(COMPARE EQUAL "${_ext}" ".plg" _plg_cmp)
115     if(_plg_cmp)
116       string(REPLACE ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR} _out ${_name})
117       string(REGEX REPLACE "\\.[^.]*$" "" _out_name ${_out})
118       string(REPLACE ${_out_name} "" _out_ext ${_out})
119       set(_out "${_out}.cxx")
120       get_filename_component(_dir ${_out} DIRECTORY)
121       add_custom_command(
122         OUTPUT ${_out}
123         COMMAND ${CMAKE_COMMAND} -E make_directory ${_dir}
124         COMMAND cpPlugins_HostCreator -i ${_f} -o ${_out}
125         MAIN_DEPENDENCY ${_f}
126         DEPENDS cpPlugins_HostCreator
127         VERBATIM
128         )
129       set(_out_ext ".cxx")
130       list(APPEND _plg ${_f})
131     endif(_plg_cmp)
132
133     ## -- Get real extension
134     string(SUBSTRING ${_out_ext} 0 2 _ext_cmp)
135
136     ## -- Process .e files
137     string(COMPARE EQUAL "${_ext_cmp}" ".e" _e_cmp)
138     if(_e_cmp)
139       list(APPEND _def ${_out_name}${_out_ext})
140     endif(_e_cmp)
141
142     ## -- Process .c?? files
143     string(COMPARE EQUAL "${_ext_cmp}" ".c" _c_cmp)
144     if(_c_cmp)
145       list(APPEND _cpp ${_out_name}${_out_ext})
146     endif(_c_cmp)
147
148     ## -- Process .h?? files
149     string(COMPARE EQUAL "${_ext_cmp}" ".h" _h_cmp)
150     if(_h_cmp)
151       list(APPEND _hpp ${_out_name}${_out_ext})
152     endif(_h_cmp)
153
154     ## -- Process .ui files
155     string(COMPARE EQUAL "${_out_ext}" ".ui" _u_cmp)
156     if(_u_cmp)
157       list(APPEND _qui ${_out_name}${_out_ext})
158     endif(_u_cmp)
159   endif(_out_ext)
160 endforeach(_f)
161
162 ## -- Process Qt ui files
163 list(LENGTH _qui _qui_len)
164 if(${_qui_len} GREATER 0)
165   qt5_wrap_ui(_qui_hpp ${_qui})
166 endif(${_qui_len} GREATER 0)
167
168 ## -- Build output lists
169 if(_dirs)
170   list(REMOVE_DUPLICATES _dirs)
171 endif(_dirs)
172 set(${dirs} "${_dirs}" PARENT_SCOPE)
173 set(${src} "${_cpp}" PARENT_SCOPE)
174 set(${hdr} "${_hpp};${_qui_hpp}" PARENT_SCOPE)
175 set(${plg} "${_plg}" PARENT_SCOPE)
176 set(${def} "${_def}" PARENT_SCOPE)
177
178 endfunction()
179
180 ## -------------------------------------------------------------------------
181 function(cpPlugins_BuildLibrary lib typ)
182 set(options RECURRENT INSTALL_ALL INSTALL_BIN INSTALL_DEV)
183 set(multiValueArgs SOURCES VERSION LINKS INCLUDES)
184 cmake_parse_arguments(
185   cpPlugins_BuildLibrary
186   "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
187   )
188 string(TOLOWER ${lib} _lower_lib)
189
190 ## -- Some useful values
191 string(REPLACE ${PROJECT_SOURCE_DIR} "" _current_src_dir ${CMAKE_CURRENT_SOURCE_DIR})
192 string(REPLACE ${PROJECT_SOURCE_DIR} "" _current_bin_dir ${CMAKE_CURRENT_BINARY_DIR})
193
194 ## -- Process sources
195 cpPlugins_PrepareSources(
196   "${cpPlugins_BuildLibrary_SOURCES}"
197   "${cpPlugins_BuildLibrary_RECURRENT}"
198   "${cpPlugins_BuildLibrary_INCLUDES}"
199   "${cpPlugins_BuildLibrary_LINKS}"
200   _src _hdr _dirs _plg _def
201   )
202
203 ## -- Configure installation directory
204 include_directories(
205   ${cpPlugins_BuildLibrary_INCLUDES}
206   ${_dirs}
207   )
208
209 ## -- Installation rules
210 if(cpPlugins_BuildLibrary_INSTALL_ALL)
211   set(cpPlugins_BuildLibrary_INSTALL_BIN ${cpPlugins_BuildLibrary_INSTALL_ALL})
212   set(cpPlugins_BuildLibrary_INSTALL_DEV ${cpPlugins_BuildLibrary_INSTALL_ALL})
213 endif(cpPlugins_BuildLibrary_INSTALL_ALL)
214
215 if(_src)
216   ## -- Process declared plugins
217   if(_plg)
218     set(_c ${PROJECT_BINARY_DIR}/${lib}.plg.cmake)
219     file(WRITE  ${_c} "set(_classes)\n")
220     file(APPEND ${_c} "foreach(_p \${_plg})\n")
221     file(APPEND ${_c} "  file(STRINGS \${_p} _c REGEX \"^\\\\s*@.*$\")\n")
222     file(APPEND ${_c} "  foreach(_l \${_c})\n")
223     file(APPEND ${_c} "    string(REPLACE \" \" \";\" _m \${_l})\n")
224     file(APPEND ${_c} "    list(GET _m 0 _n)\n")
225     file(APPEND ${_c} "    string(SUBSTRING \${_n} 1 -1 _d)\n")
226     file(APPEND ${_c} "    set(_classes \"\${_classes}\\n\${_d}\")\n")
227     file(APPEND ${_c} "  endforeach(_l)\n")
228     file(APPEND ${_c} "endforeach(_p)\n")
229     file(APPEND ${_c} "file(WRITE \${_out} \"\${_classes}\")\n")
230     add_custom_target(
231       ${lib}.plg ALL
232       COMMAND
233         ${CMAKE_COMMAND}
234         -D_out:STRING="${lib}.plg"
235         -D_plg::STRING="${_plg}"
236         -P ${_c}
237       WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
238       DEPENDS "${_plg}"
239       SOURCES "${_plg}"
240       COMMENT "Building \"${lib}\" plugins interface"
241       )
242     add_dependencies(${lib}.plg ${lib})
243     if(cpPlugins_BuildLibrary_INSTALL_BIN)
244       install(FILES ${PROJECT_BINARY_DIR}/${lib}.plg DESTINATION "lib")
245     endif(cpPlugins_BuildLibrary_INSTALL_BIN)
246   endif(_plg)
247
248   ## -- Real build
249   add_library(${lib} ${typ} ${_src} ${_hdr})
250   generate_export_header(
251     ${lib}
252     EXPORT_FILE_NAME ${lib}_Export.h
253     )
254   list(APPEND _hdr "${CMAKE_CURRENT_BINARY_DIR}/${lib}_Export.h")
255
256   ## -- Put version strings
257   if(cpPlugins_BuildLibrary_VERSION)
258     list(GET cpPlugins_BuildLibrary_VERSION 0 _a)
259     list(GET cpPlugins_BuildLibrary_VERSION 1 _b)
260     list(GET cpPlugins_BuildLibrary_VERSION 2 _c)
261     set_property(TARGET ${lib} PROPERTY VERSION "${_a}.${_b}.${_c}")
262     set_property(TARGET ${lib} PROPERTY SOVERSION ${_a})
263     set_property(TARGET ${lib} PROPERTY INTERFACE_${lib}_MAJOR_VERSION ${_a})
264     set_property(
265       TARGET ${lib} APPEND PROPERTY COMPATIBLE_INTERFACE_STRING ${_a}
266       )
267   endif(cpPlugins_BuildLibrary_VERSION)
268
269   ## -- Link library
270   if(cpPlugins_BuildLibrary_LINKS)
271     target_link_libraries(${lib} PUBLIC ${cpPlugins_BuildLibrary_LINKS})
272   endif(cpPlugins_BuildLibrary_LINKS)
273 endif(_src)
274
275 ## -- Installation rules: library
276 if(_src)
277   if(cpPlugins_BuildLibrary_INSTALL_BIN)
278     install(
279       TARGETS ${lib}
280       EXPORT "${targets_export_name}"
281       LIBRARY DESTINATION "lib"
282       ARCHIVE DESTINATION "lib"
283       RUNTIME DESTINATION "bin"
284       INCLUDES DESTINATION "${include_install_dir}"
285       )
286   endif(cpPlugins_BuildLibrary_INSTALL_BIN)
287 endif(_src)
288
289 ## -- Installation rules: source files
290
291 if(cpPlugins_BuildLibrary_INSTALL_DEV)
292   set(_install_hdr ${_hdr})
293   if(_def)
294     list(APPEND _install_hdr ${_def})
295   endif(_def)
296   set(_install_dirs)
297
298   foreach(_h ${_install_hdr})
299     string(REPLACE ${PROJECT_SOURCE_DIR} "" _h_name ${_h})
300     string(COMPARE EQUAL "${_h_name}" "${_h}" _h_cmp)
301     if(_h_cmp)
302       string(REPLACE ${PROJECT_BINARY_DIR} "" _h_name ${_h})
303     endif(_h_cmp)
304     string(REPLACE ${_current_bin_dir} "" _h_name ${_h_name})
305     string(COMPARE EQUAL "${_h_name}" "${_h_name}" _h_cmp)
306     if(_h_cmp)
307       string(REPLACE ${_current_src_dir} "" _h_name ${_h_name})
308     endif(_h_cmp)
309     get_filename_component(_h_dir ${_h_name} DIRECTORY)
310     string(SUBSTRING ${_h_dir} 0 1 _h_dir_first)
311     string(COMPARE EQUAL "${_h_dir_first}" "/" _h_cmp)
312     if(_h_cmp)
313       string(SUBSTRING ${_h_dir} 1 -1 _h_dir)
314     endif(_h_cmp)
315     install(
316       FILES "${_h}"
317       DESTINATION "include/${_h_dir}"
318       )
319   endforeach(_h)
320 endif(cpPlugins_BuildLibrary_INSTALL_DEV)
321
322 endfunction()
323
324 ## -------------------------------------------------------------------------
325 function(cpPlugins_BuildExecutable app)
326 set(options RECURRENT INSTALL)
327 set(oneValueArgs)
328 set(multiValueArgs SOURCES LINKS INCLUDES)
329 cmake_parse_arguments(
330   cpPlugins_BuildExecutable
331   "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
332   )
333
334 cpPlugins_PrepareSources(
335   "${cpPlugins_BuildExecutable_SOURCES}"
336   "${cpPlugins_BuildExecutable_RECURRENT}"
337   "${cpPlugins_BuildExecutable_INCLUDES}"
338   "${cpPlugins_BuildExecutable_LINKS}"
339   _src _hdr _dirs _plg _def
340   )
341
342 if(_src)
343   ## -- Real build
344   include_directories(
345     ${cpPlugins_BuildExecutable_INCLUDES}
346     ${_dirs}
347     )
348   add_executable(${app} ${_src} ${_hdr})
349
350   ## -- Link library
351   if(cpPlugins_BuildExecutable_LINKS)
352     target_link_libraries(${app} PUBLIC ${cpPlugins_BuildExecutable_LINKS})
353   endif(cpPlugins_BuildExecutable_LINKS)
354
355   ## -- Installation rules
356   if(cpPlugins_BuildExecutable_INSTALL)
357     install(
358       TARGETS ${app}
359       EXPORT "${targets_export_name}"
360       LIBRARY DESTINATION "lib"
361       ARCHIVE DESTINATION "lib"
362       RUNTIME DESTINATION "bin"
363       INCLUDES DESTINATION "${include_install_dir}"
364       )
365   endif(cpPlugins_BuildExecutable_INSTALL)
366 endif(_src)
367 endfunction()
368
369 ## -------------------------------------------------------------------------
370 function(cpPlugins_BuildApplication app)
371 set(options RECURRENT INSTALL)
372 set(oneValueArgs)
373 set(multiValueArgs SOURCES LINKS INCLUDES)
374 cmake_parse_arguments(
375   cpPlugins_BuildApplication
376   "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
377   )
378
379 cpPlugins_PrepareSources(
380   "${cpPlugins_BuildApplication_SOURCES}"
381   "${cpPlugins_BuildApplication_RECURRENT}"
382   "${cpPlugins_BuildApplication_INCLUDES}"
383   "${cpPlugins_BuildApplication_LINKS}"
384   _src _hdr _dirs _plg _def
385   )
386
387 if(_src)
388   ## -- Real build
389   include_directories(
390     ${cpPlugins_BuildApplication_INCLUDES}
391     ${_dirs}
392     )
393   add_executable(${app} ${_src} ${_hdr})
394
395   ## -- Link library
396   if(cpPlugins_BuildApplication_LINKS)
397     target_link_libraries(${app} PUBLIC ${cpPlugins_BuildApplication_LINKS})
398   endif(cpPlugins_BuildApplication_LINKS)
399
400   ## -- Installation rules
401   if(cpPlugins_BuildApplication_INSTALL)
402     install(
403       TARGETS ${app}
404       EXPORT "${targets_export_name}"
405       LIBRARY DESTINATION "lib"
406       ARCHIVE DESTINATION "lib"
407       RUNTIME DESTINATION "bin"
408       INCLUDES DESTINATION "${include_install_dir}"
409       )
410   endif(cpPlugins_BuildApplication_INSTALL)
411 endif(_src)
412 endfunction()
413
414 ## eof - $RCSfile$