1 ## =========================================================================
2 ## @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co)
3 ## =========================================================================
5 ## -------------------------------------------------------------------------
6 function(cpPlugins_PrepareSources
7 inputs recurrent includes links src hdr dirs plg def
10 ## -- Process targets include dirs
18 INTERFACE_INCLUDE_DIRECTORIES
22 list(APPEND _dirs ${_d})
29 ## -- Start by configuring _dflags for cpPlugins_MOC
33 DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
34 PROPERTY INCLUDE_DIRECTORIES
36 foreach(_i ${_global_dirs})
37 set(_dflags ${_dflags} "-I${_i}")
39 foreach(_i ${includes})
40 set(_dflags ${_dflags} "-I${_i}")
43 ## -- Process all inputs
46 ## -- Canonicalize path
47 get_filename_component(_p "${_s}" ABSOLUTE)
49 ## -- Check type of input
50 if(IS_DIRECTORY ${_p})
51 list(APPEND _dirs ${_p})
52 set(_dflags ${_dflags} "-I${_p}")
54 file(GLOB_RECURSE _f "${_p}/*")
56 file(GLOB _f "${_p}/*")
59 if(NOT IS_DIRECTORY ${_x})
60 list(APPEND _files ${_x})
61 endif(NOT IS_DIRECTORY ${_x})
63 else(IS_DIRECTORY ${_p})
64 list(APPEND _files ${_p})
65 endif(IS_DIRECTORY ${_p})
68 ## -- Process sources by extension
76 ## -- Separate filename from extension
77 string(REGEX REPLACE "\\.[^.]*$" "" _name ${_f})
78 string(REPLACE ${_name} "" _ext ${_f})
79 set(_out_name ${_name})
83 ## -- Process .in files
84 string(COMPARE EQUAL "${_ext}" ".in" _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})
94 ## -- Process .d files
95 string(COMPARE EQUAL "${_ext}" ".d" _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})
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
110 string(SUBSTRING ${_out_ext} 0 2 _ext_cmp)
113 ## -- Process .plg files
114 string(COMPARE EQUAL "${_ext}" ".plg" _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)
123 COMMAND ${CMAKE_COMMAND} -E make_directory ${_dir}
124 COMMAND cpPlugins_HostCreator -i ${_f} -o ${_out}
125 MAIN_DEPENDENCY ${_f}
126 DEPENDS cpPlugins_HostCreator
130 list(APPEND _plg ${_f})
133 ## -- Get real extension
134 string(SUBSTRING ${_out_ext} 0 2 _ext_cmp)
136 ## -- Process .e files
137 string(COMPARE EQUAL "${_ext_cmp}" ".e" _e_cmp)
139 list(APPEND _def ${_out_name}${_out_ext})
142 ## -- Process .c?? files
143 string(COMPARE EQUAL "${_ext_cmp}" ".c" _c_cmp)
145 list(APPEND _cpp ${_out_name}${_out_ext})
148 ## -- Process .h?? files
149 string(COMPARE EQUAL "${_ext_cmp}" ".h" _h_cmp)
151 list(APPEND _hpp ${_out_name}${_out_ext})
154 ## -- Process .ui files
155 string(COMPARE EQUAL "${_out_ext}" ".ui" _u_cmp)
157 list(APPEND _qui ${_out_name}${_out_ext})
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)
168 ## -- Build output lists
170 list(REMOVE_DUPLICATES _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)
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}
188 string(TOLOWER ${lib} _lower_lib)
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})
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
203 ## -- Configure installation directory
205 ${cpPlugins_BuildLibrary_INCLUDES}
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)
216 ## -- Process declared plugins
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")
234 -D_out:STRING="${lib}.plg"
235 -D_plg::STRING="${_plg}"
237 WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
240 COMMENT "Building \"${lib}\" plugins interface"
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)
249 add_library(${lib} ${typ} ${_src} ${_hdr})
250 generate_export_header(
252 EXPORT_FILE_NAME ${lib}_Export.h
254 list(APPEND _hdr "${CMAKE_CURRENT_BINARY_DIR}/${lib}_Export.h")
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})
265 TARGET ${lib} APPEND PROPERTY COMPATIBLE_INTERFACE_STRING ${_a}
267 endif(cpPlugins_BuildLibrary_VERSION)
270 if(cpPlugins_BuildLibrary_LINKS)
271 target_link_libraries(${lib} PUBLIC ${cpPlugins_BuildLibrary_LINKS})
272 endif(cpPlugins_BuildLibrary_LINKS)
275 ## -- Installation rules: library
277 if(cpPlugins_BuildLibrary_INSTALL_BIN)
280 EXPORT "${targets_export_name}"
281 LIBRARY DESTINATION "lib"
282 ARCHIVE DESTINATION "lib"
283 RUNTIME DESTINATION "bin"
284 INCLUDES DESTINATION "${include_install_dir}"
286 endif(cpPlugins_BuildLibrary_INSTALL_BIN)
289 ## -- Installation rules: source files
291 if(cpPlugins_BuildLibrary_INSTALL_DEV)
292 set(_install_hdr ${_hdr})
294 list(APPEND _install_hdr ${_def})
298 foreach(_h ${_install_hdr})
299 string(REPLACE ${PROJECT_SOURCE_DIR} "" _h_name ${_h})
300 string(COMPARE EQUAL "${_h_name}" "${_h}" _h_cmp)
302 string(REPLACE ${PROJECT_BINARY_DIR} "" _h_name ${_h})
304 string(REPLACE ${_current_bin_dir} "" _h_name ${_h_name})
305 string(COMPARE EQUAL "${_h_name}" "${_h_name}" _h_cmp)
307 string(REPLACE ${_current_src_dir} "" _h_name ${_h_name})
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)
313 string(SUBSTRING ${_h_dir} 1 -1 _h_dir)
317 DESTINATION "include/${_h_dir}"
320 endif(cpPlugins_BuildLibrary_INSTALL_DEV)
324 ## -------------------------------------------------------------------------
325 function(cpPlugins_BuildExecutable app)
326 set(options RECURRENT INSTALL)
328 set(multiValueArgs SOURCES LINKS INCLUDES)
329 cmake_parse_arguments(
330 cpPlugins_BuildExecutable
331 "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
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
345 ${cpPlugins_BuildExecutable_INCLUDES}
348 add_executable(${app} ${_src} ${_hdr})
351 if(cpPlugins_BuildExecutable_LINKS)
352 target_link_libraries(${app} PUBLIC ${cpPlugins_BuildExecutable_LINKS})
353 endif(cpPlugins_BuildExecutable_LINKS)
355 ## -- Installation rules
356 if(cpPlugins_BuildExecutable_INSTALL)
359 EXPORT "${targets_export_name}"
360 LIBRARY DESTINATION "lib"
361 ARCHIVE DESTINATION "lib"
362 RUNTIME DESTINATION "bin"
363 INCLUDES DESTINATION "${include_install_dir}"
365 endif(cpPlugins_BuildExecutable_INSTALL)
369 ## -------------------------------------------------------------------------
370 function(cpPlugins_BuildApplication app)
371 set(options RECURRENT INSTALL)
373 set(multiValueArgs SOURCES LINKS INCLUDES)
374 cmake_parse_arguments(
375 cpPlugins_BuildApplication
376 "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
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
390 ${cpPlugins_BuildApplication_INCLUDES}
393 add_executable(${app} ${_src} ${_hdr})
396 if(cpPlugins_BuildApplication_LINKS)
397 target_link_libraries(${app} PUBLIC ${cpPlugins_BuildApplication_LINKS})
398 endif(cpPlugins_BuildApplication_LINKS)
400 ## -- Installation rules
401 if(cpPlugins_BuildApplication_INSTALL)
404 EXPORT "${targets_export_name}"
405 LIBRARY DESTINATION "lib"
406 ARCHIVE DESTINATION "lib"
407 RUNTIME DESTINATION "bin"
408 INCLUDES DESTINATION "${include_install_dir}"
410 endif(cpPlugins_BuildApplication_INSTALL)