2 ## ==============================
3 ## == Macro to normalize paths ==
4 ## ==============================
6 FUNCTION(cpPlugins_NormalizePaths output_files)
10 FILE(TO_CMAKE_PATH ${_f} _d)
11 LIST(APPEND _out ${_d})
13 SET(${output_files} "${_out}" PARENT_SCOPE)
16 ## ==========================
17 ## == Macro to wrap qt-uis ==
18 ## ==========================
20 FUNCTION(cpPlugins_Wrap_Qt_ui output_files)
21 cpPlugins_NormalizePaths(_source_dir ${PROJECT_SOURCE_DIR})
22 cpPlugins_NormalizePaths(_binary_dir ${PROJECT_BINARY_DIR})
26 GET_FILENAME_COMPONENT(_name ${_f} NAME_WE)
27 GET_FILENAME_COMPONENT(_dir ${_f} DIRECTORY)
28 SET(_base_dir ${_source_dir})
29 STRING(FIND "${_dir}" "${_base_dir}" _pos)
31 SET(_base_dir ${_binary_dir})
32 STRING(FIND "${_dir}" "${_base_dir}" _pos)
33 ENDIF(${_pos} EQUAL -1)
34 IF(NOT ${_pos} EQUAL -1)
35 STRING(REPLACE "${_base_dir}/" "" _dir ${_dir})
36 SET(_out_f ${_binary_dir}/${_dir}/ui_${_name}.h)
37 LIST(APPEND _out ${_out_f})
41 ARGS -o ${_out_f} ${_f}
42 MAIN_DEPENDENCY ${_f} VERBATIM
44 ENDIF(NOT ${_pos} EQUAL -1)
47 SET(${output_files} "${_out}" PARENT_SCOPE)
50 ## ==========================
51 ## == Macro to wrap qt-moc ==
52 ## ==========================
54 FUNCTION(cpPlugins_Wrap_Qt_cpp output_files)
59 STRING(FIND "${_txt}" "Q_OBJECT" _pos)
60 IF(NOT ${_pos} EQUAL -1)
62 QT4_WRAP_CPP(_s ${_f})
63 SET(_out ${_out} ${_s})
64 ENDIF(NOT ${_pos} EQUAL -1)
67 SET(${output_files} "${_out}" PARENT_SCOPE)
70 ## =================================
71 ## == Function to build a library ==
72 ## =================================
75 cpPlugins_CreateLibrary
85 ## -- Configure inputs to be cmake-path compatible
86 cpPlugins_NormalizePaths(_sources ${lib_source_files})
87 cpPlugins_NormalizePaths(_headers ${lib_header_files})
88 cpPlugins_NormalizePaths(_qt_uis ${lib_qt_ui_files})
90 # -- Prepare Qt4-based code
93 ## -- Guess what headers sould be qt-moc'ed
94 cpPlugins_Wrap_Qt_cpp(_qt_moc_sources ${_headers})
96 SET(_sources ${_sources} ${_qt_moc_sources})
97 ENDIF(_qt_moc_sources)
99 ## -- Guess what qt-ui's sould be qt-uic'ed
100 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change the
102 cpPlugins_Wrap_Qt_ui(_qt_ui_headers ${_qt_uis})
104 SET(_headers ${_headers} ${_qt_ui_headers})
105 SET(_sources ${_sources} ${_qt_ui_headers})
106 ENDIF(_qt_ui_headers)
109 ## -- Ok, compile library
111 cpPlugins_NormalizePaths(_cur_binary_dir ${CMAKE_CURRENT_BINARY_DIR})
112 ADD_LIBRARY(${lib_name} SHARED ${_sources} ${_headers})
113 SET_TARGET_PROPERTIES(
116 VERSION "${lib_version}"
117 SOVERSION "${lib_short_version}"
119 GENERATE_EXPORT_HEADER(
121 BASE_NAME ${lib_name}
122 EXPORT_MACRO_NAME ${lib_name}_EXPORT
123 EXPORT_FILE_NAME ${_cur_binary_dir}/${lib_name}_Export.h
124 STATIC_DEFINE ${lib_name}_BUILT_AS_STATIC
126 SET(${lib_name}_LIB ${lib_name} CACHE INTERNAL "Library ${lib_name}")
131 ## ==================================================
132 ## == Function to build a library from a directory ==
133 ## ==================================================
136 cpPlugins_CreateLibraryFromDirectory
144 ## -- Configure inputs to be cmake-path compatible
145 cpPlugins_NormalizePaths(_global_source_dir ${PROJECT_SOURCE_DIR})
146 cpPlugins_NormalizePaths(_global_binary_dir ${PROJECT_BINARY_DIR})
147 cpPlugins_NormalizePaths(_source_dir ${lib_source_dir})
148 STRING(REPLACE "${_global_source_dir}" "" _local_source_dir ${_source_dir})
149 SET(_binary_dir ${_global_binary_dir}${_local_source_dir})
151 ## -- Some useful variables
152 SET(_sources_extensions .c .cpp .cxx)
153 SET(_headers_extensions .h .hpp .hxx)
154 SET(_qt_ui_extensions .ui)
155 SET(_dirs ${_source_dir} ${_binary_dir})
160 ## -- Glob source code
162 FOREACH(_e ${_sources_extensions})
163 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
164 SET(_sources ${_sources} ${_f})
166 FOREACH(_e ${_headers_extensions})
167 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
168 SET(_headers ${_headers} ${_f})
170 FOREACH(_e ${_qt_ui_extensions})
171 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
172 SET(_qt_uis ${_qt_uis} ${_f})
176 ## -- Configure some files
177 FILE(GLOB_RECURSE _configs "${_source_dir}/*.in")
178 FOREACH(_c ${_configs})
180 ## -- Build input and output names
181 cpPlugins_NormalizePaths(_input_file ${_c})
182 GET_FILENAME_COMPONENT(_input_name ${_input_file} NAME)
183 GET_FILENAME_COMPONENT(_input_dir ${_input_file} DIRECTORY)
184 STRING(REPLACE ".in" "" _output_name ${_input_name})
185 STRING(REPLACE "${_global_source_dir}" "" _output_dir ${_input_dir})
186 SET(_output_file "${_global_binary_dir}${_output_dir}/${_output_name}")
189 CONFIGURE_FILE(${_input_file} ${_output_file} @ONLY)
191 ## -- Add it to the correct list
192 GET_FILENAME_COMPONENT(_output_ext ${_output_name} EXT)
194 "${_output_ext}" STREQUAL ".h"
196 "${_output_ext}" STREQUAL ".hpp"
198 "${_output_ext}" STREQUAL ".hxx"
200 SET(_headers ${_headers})
203 "${_output_ext}" STREQUAL ".c"
205 "${_output_ext}" STREQUAL ".cpp"
207 "${_output_ext}" STREQUAL ".cxx"
209 SET(_sources ${_sources})
211 IF("${_output_ext}" STREQUAL ".ui")
212 SET(_qt_uis ${_qt_uis})
217 cpPlugins_CreateLibrary(
218 ${lib_name} ${lib_type}
219 "${_sources}" "${_headers}" "${_qt_uis}"
220 "${lib_version}" "${lib_short_version}"
225 ## ================================
226 ## == Function to wrap instances ==
227 ## ================================
230 cpPlugins_WrapInstances
238 ## -- Configure inputs to be cmake-path compatible
239 cpPlugins_NormalizePaths(_def_file ${def_file})
240 GET_FILENAME_COMPONENT(_def_name ${_def_file} NAME_WE)
241 GET_FILENAME_COMPONENT(_def_dir ${_def_file} DIRECTORY)
242 cpPlugins_NormalizePaths(_global_source_dir ${PROJECT_SOURCE_DIR})
243 cpPlugins_NormalizePaths(_global_binary_dir ${PROJECT_BINARY_DIR})
244 STRING(REPLACE "${_global_source_dir}" "" _out_dir ${_def_dir})
245 SET(_out_base "${_global_binary_dir}${_out_dir}")
246 SET(_out_header "${prefix}${_def_name}.h")
247 SET(_out_code "${prefix}${_def_name}.cxx")
248 SET(_lib_name "${prefix}${_def_name}")
249 SET(_input_extra_code "${_global_source_dir}${_out_dir}/${_def_name}_extra.cxx")
251 ## -- Add extra code, if any
252 SET(_all_out_code ${_out_base}/${_out_code})
253 IF(EXISTS ${_input_extra_code})
254 SET(_all_out_code ${_all_out_code} ${_input_extra_code})
255 ENDIF(EXISTS ${_input_extra_code})
257 ## -- Command to write source code
259 OUTPUT ${_out_base}/${_out_header} ${_out_base}/${_out_code}
260 DEPENDS ${cpPlugins_CreateInstances_APP} ${_def_file}
261 COMMAND ${cpPlugins_CreateInstances_APP} ${_def_file} ${_lib_name} ${_out_base}
265 cpPlugins_CreateLibrary(
266 "${_lib_name}" SHARED
267 "${_all_out_code}" "${_out_base}/${_out_header}" ""
268 "${version}" "${short_version}"
270 SET(${out_lib_name} ${_lib_name} PARENT_SCOPE)
274 ## ====================================
275 ## == Function to wrap plugins hosts ==
276 ## ====================================
278 FUNCTION(cpPlugins_WrapPlugins output_lib source_dir version short_version prefix)
280 ## -- Configure inputs to be cmake-path compatible
281 cpPlugins_NormalizePaths(_source_dir ${source_dir})
282 cpPlugins_NormalizePaths(_global_source_dir ${PROJECT_SOURCE_DIR})
283 cpPlugins_NormalizePaths(_global_binary_dir ${PROJECT_BINARY_DIR})
284 STRING(REPLACE "${_global_source_dir}" "" _out_dir ${_source_dir})
285 SET(_out_dir "${_global_binary_dir}${_out_dir}")
286 FILE(MAKE_DIRECTORY ${_out_dir})
287 GET_FILENAME_COMPONENT(_lib_name ${_source_dir} NAME_WE)
288 SET(_lib_name ${prefix}${_lib_name})
290 ## -- Get source code
291 FILE(GLOB_RECURSE _hdr_h "${_source_dir}/*.h")
292 FILE(GLOB_RECURSE _hdr_hxx "${_source_dir}/*.hxx")
293 FILE(GLOB_RECURSE _hdr_hpp "${_source_dir}/*.hpp")
294 FILE(GLOB_RECURSE _src_c "${_source_dir}/*.c")
295 FILE(GLOB_RECURSE _src_cxx "${_source_dir}/*.cxx")
296 FILE(GLOB_RECURSE _src_cpp "${_source_dir}/*.cpp")
297 FILE(GLOB_RECURSE _qt_ui "${_source_dir}/*.ui")
299 ## -- Identify sources to wrap
301 FOREACH(_h ${_hdr_h})
302 FILE(READ ${_h} _txt)
303 STRING(FIND "${_txt}" "cpPluginsObject;" _res)
304 IF(NOT ${_res} EQUAL -1)
305 LIST(APPEND _hdr_to_wrap ${_h})
306 ENDIF(NOT ${_res} EQUAL -1)
309 ## -- Integrate all source files
310 SET(_all_src ${_src_c} ${_src_cpp} ${_src_cxx})
311 SET(_all_hdr ${_hdr_h} ${_hdr_hpp} ${_hdr_hxx})
315 SET(_host ${_out_dir}/${_lib_name}_host.cxx)
318 DEPENDS ${cpPlugins_HostCreator_APP} ${_hdr_to_wrap}
319 COMMAND ${cpPlugins_HostCreator_APP} ${_lib_name} ${_host} ${_hdr_to_wrap}
321 SET(_all_src ${_all_src} ${_host})
324 ## -- Ok, build library
326 cpPlugins_CreateLibrary(
328 "${_all_src}" "${_all_hdr}" "${_qt_ui}"
329 "${version}" "${short_version}"
332 SET(${output_lib} ${_lib_name} PARENT_SCOPE)
334 MESSAGE(FATAL_ERROR "No source code found to build \"${_lib_name}\"")
338 ## ======================================
339 ## == Function to build an application ==
340 ## ======================================
342 FUNCTION(cpPlugins_BuildAppFromDirectory output_app source_dir)
344 ## -- Configure inputs to be cmake-path compatible
345 cpPlugins_NormalizePaths(_global_source_dir ${PROJECT_SOURCE_DIR})
346 cpPlugins_NormalizePaths(_global_binary_dir ${PROJECT_BINARY_DIR})
347 cpPlugins_NormalizePaths(_source_dir ${source_dir})
348 STRING(REPLACE "${_global_source_dir}" "" _local_source_dir ${_source_dir})
349 SET(_binary_dir ${_global_binary_dir}${_local_source_dir})
351 SET(_app_name ${${output_app}})
353 GET_FILENAME_COMPONENT(_app_name ${_source_dir} NAME_WE)
355 SET(_app_name_option OFF)
357 LIST(GET ARGN 0 _app_name_option)
361 "Build \"${_app_name}\" application"
365 ## -- Real build commands
366 IF(BUILD_${_app_name})
367 ## -- Some useful variables
368 SET(_sources_extensions .c .cpp .cxx)
369 SET(_headers_extensions .h .hpp .hxx)
370 SET(_qt_ui_extensions .ui)
371 SET(_dirs ${_source_dir} ${_binary_dir})
376 ## -- Glob source code
378 FOREACH(_e ${_sources_extensions})
379 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
380 SET(_sources ${_sources} ${_f})
382 FOREACH(_e ${_headers_extensions})
383 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
384 SET(_headers ${_headers} ${_f})
386 FOREACH(_e ${_qt_ui_extensions})
387 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
388 SET(_qt_uis ${_qt_uis} ${_f})
392 ## -- Configure some files
393 FILE(GLOB_RECURSE _configs "${_source_dir}/*.in")
394 FOREACH(_c ${_configs})
396 ## -- Build input and output names
397 cpPlugins_NormalizePaths(_input_file ${_c})
398 GET_FILENAME_COMPONENT(_input_name ${_input_file} NAME)
399 GET_FILENAME_COMPONENT(_input_dir ${_input_file} DIRECTORY)
400 STRING(REPLACE ".in" "" _output_name ${_input_name})
401 STRING(REPLACE "${_global_source_dir}" "" _output_dir ${_input_dir})
402 SET(_output_file "${_global_binary_dir}${_output_dir}/${_output_name}")
405 CONFIGURE_FILE(${_input_file} ${_output_file} @ONLY)
407 ## -- Add it to the correct list
408 GET_FILENAME_COMPONENT(_output_ext ${_output_name} EXT)
410 "${_output_ext}" STREQUAL ".h"
412 "${_output_ext}" STREQUAL ".hpp"
414 "${_output_ext}" STREQUAL ".hxx"
416 SET(_headers ${_headers})
419 "${_output_ext}" STREQUAL ".c"
421 "${_output_ext}" STREQUAL ".cpp"
423 "${_output_ext}" STREQUAL ".cxx"
425 SET(_sources ${_sources})
427 IF("${_output_ext}" STREQUAL ".ui")
428 SET(_qt_uis ${_qt_uis})
432 # -- Prepare Qt4-based code
435 ## -- Guess what headers sould be qt-moc'ed
436 cpPlugins_Wrap_Qt_cpp(_qt_moc_sources ${_headers})
438 SET(_sources ${_sources} ${_qt_moc_sources})
439 ENDIF(_qt_moc_sources)
440 ## -- Guess what qt-ui's sould be qt-uic'ed
441 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to
442 ## -- change the output file
443 cpPlugins_Wrap_Qt_ui(_qt_ui_headers ${_qt_uis})
445 SET(_headers ${_headers} ${_qt_ui_headers})
446 SET(_sources ${_sources} ${_qt_ui_headers})
447 ENDIF(_qt_ui_headers)
450 ## -- Ok, compile application
452 ADD_EXECUTABLE(${_app_name} ${_sources})
453 SET(${output_app} ${_app_name} PARENT_SCOPE)
455 SET(${output_app} "" PARENT_SCOPE)
456 MESSAGE(FATAL_ERROR "No source code found to build \"${_app_name}\"")
458 ENDIF(BUILD_${_app_name})