1 ## -------------------------------------------------------------------------
2 FUNCTION(NormPaths output_files)
6 FILE(TO_CMAKE_PATH ${_f} _d)
7 LIST(APPEND _out ${_d})
9 SET(${output_files} "${_out}" PARENT_SCOPE)
12 ## -------------------------------------------------------------------------
13 FUNCTION(Wrap_Qt_CPP output_files)
18 STRING(FIND "${_txt}" "Q_OBJECT" _pos)
19 IF(NOT ${_pos} EQUAL -1)
21 QT4_WRAP_CPP(_s ${_f})
22 SET(_out ${_out} ${_s})
23 ENDIF(NOT ${_pos} EQUAL -1)
26 SET(${output_files} "${_out}" PARENT_SCOPE)
29 ## -------------------------------------------------------------------------
30 FUNCTION(Wrap_Qt_UI output_files)
31 NormPaths(_source_dir ${PROJECT_SOURCE_DIR})
32 NormPaths(_binary_dir ${PROJECT_BINARY_DIR})
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)
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})
51 ARGS -o ${_out_f} ${_f}
52 MAIN_DEPENDENCY ${_f} VERBATIM
54 ENDIF(NOT ${_pos} EQUAL -1)
57 SET(${output_files} "${_out}" PARENT_SCOPE)
60 ## -------------------------------------------------------------------------
72 ## -- Configure inputs to be cmake-path compatible
73 NormPaths(_sources ${lib_source_files})
74 NormPaths(_headers ${lib_header_files})
75 NormPaths(_qt_uis ${lib_qt_ui_files})
77 # -- Prepare Qt4-based code
79 ## -- Guess what headers sould be qt-moc'ed
80 Wrap_Qt_CPP(_qt_moc_sources ${_headers})
82 SET(_sources ${_sources} ${_qt_moc_sources})
83 ENDIF(_qt_moc_sources)
85 ## -- Guess what qt-ui's sould be qt-uic'ed
86 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change
88 Wrap_Qt_UI(_qt_ui_headers ${_qt_uis})
90 SET(_headers ${_headers} ${_qt_ui_headers})
91 SET(_sources ${_sources} ${_qt_ui_headers})
95 ## -- Ok, compile library
97 NormPaths(_cur_binary_dir ${CMAKE_CURRENT_BINARY_DIR})
98 ADD_LIBRARY(${lib_name} ${lib_type} ${_sources} ${_headers})
99 SET_TARGET_PROPERTIES(
102 VERSION "${lib_version}"
103 SOVERSION "${lib_short_version}"
105 GENERATE_EXPORT_HEADER(
107 BASE_NAME ${lib_name}
108 EXPORT_MACRO_NAME ${lib_name}_EXPORT
109 EXPORT_FILE_NAME ${lib_name}_Export.h
110 STATIC_DEFINE ${lib_name}_BUILT_AS_STATIC
112 SET(${lib_name}_LIB ${lib_name} CACHE INTERNAL "Library ${lib_name}")
117 ## -------------------------------------------------------------------------
128 ## -- Configure inputs to be cmake-path compatible
129 NormPaths(_global_source_dir ${PROJECT_SOURCE_DIR})
130 NormPaths(_global_binary_dir ${PROJECT_BINARY_DIR})
131 NormPaths(_source_dir ${lib_source_dir})
132 STRING(REPLACE "${_global_source_dir}" "" _local_source_dir ${_source_dir})
133 SET(_binary_dir ${_global_binary_dir}${_local_source_dir})
135 ## -- Some useful variables
136 SET(_sources_extensions .c .cpp .cxx)
137 SET(_headers_extensions .h .hpp .hxx)
138 SET(_qt_ui_extensions .ui)
139 SET(_dirs ${_source_dir} ${_binary_dir})
144 ## -- Glob source code
146 FOREACH(_e ${_sources_extensions})
147 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
148 SET(_sources ${_sources} ${_f})
150 FOREACH(_e ${_headers_extensions})
151 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
152 SET(_headers ${_headers} ${_f})
154 FOREACH(_e ${_qt_ui_extensions})
155 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
156 SET(_qt_uis ${_qt_uis} ${_f})
160 ## -- Configure some files
161 FILE(GLOB_RECURSE _configs "${_source_dir}/*.in")
162 FOREACH(_c ${_configs})
164 ## -- Build input and output names
165 NormPaths(_input_file ${_c})
166 GET_FILENAME_COMPONENT(_input_name ${_input_file} NAME)
167 GET_FILENAME_COMPONENT(_input_dir ${_input_file} DIRECTORY)
168 STRING(REPLACE ".in" "" _output_name ${_input_name})
169 STRING(REPLACE "${_global_source_dir}" "" _output_dir ${_input_dir})
170 SET(_output_file "${_global_binary_dir}${_output_dir}/${_output_name}")
173 CONFIGURE_FILE(${_input_file} ${_output_file} @ONLY)
175 ## -- Add it to the correct list
176 GET_FILENAME_COMPONENT(_output_ext ${_output_name} EXT)
178 "${_output_ext}" STREQUAL ".h"
180 "${_output_ext}" STREQUAL ".hpp"
182 "${_output_ext}" STREQUAL ".hxx"
184 SET(_headers ${_headers})
187 "${_output_ext}" STREQUAL ".c"
189 "${_output_ext}" STREQUAL ".cpp"
191 "${_output_ext}" STREQUAL ".cxx"
193 SET(_sources ${_sources})
195 IF("${_output_ext}" STREQUAL ".ui")
196 SET(_qt_uis ${_qt_uis})
200 LIST(APPEND _sources ${ARGN})
205 ${lib_name} ${lib_dir} ${lib_type}
206 "${_sources}" "${_headers}" "${_qt_uis}"
207 "${lib_version}" "${lib_short_version}"
212 ## -------------------------------------------------------------------------
223 ## -- Configure inputs to be cmake-path compatible
224 NormPaths(_def_file ${def_file})
225 GET_FILENAME_COMPONENT(_def_name ${_def_file} NAME_WE)
226 GET_FILENAME_COMPONENT(_def_dir ${_def_file} DIRECTORY)
227 NormPaths(_global_source_dir ${PROJECT_SOURCE_DIR})
228 NormPaths(_global_binary_dir ${PROJECT_BINARY_DIR})
229 STRING(REPLACE "${_global_source_dir}" "" _out_dir ${_def_dir})
230 SET(_out_base "${_global_binary_dir}${_out_dir}")
231 SET(_out_header "${_out_base}/${_def_name}.h")
232 SET(_lib_name "${prefix}${_def_name}")
233 SET(_input_extra_code "${_global_source_dir}${_out_dir}/${_def_name}_extra.cxx")
235 ## -- Infere source code filenames
236 MATH(EXPR _last_range "${number_of_files}-1")
238 FOREACH(_n RANGE 0 ${_last_range})
239 LIST(APPEND _out_code ${_out_base}/${_def_name}_${_n}.cxx)
242 ## -- Add extra code, if any
243 SET(_all_out_code ${_out_code})
244 IF(EXISTS ${_input_extra_code})
245 LIST(APPEND _all_out_code ${_input_extra_code})
246 ENDIF(EXISTS ${_input_extra_code})
248 ## -- Command to write source code
250 OUTPUT ${_out_header} ${_out_code}
251 DEPENDS ${cpPlugins_bash_BuildInstances_APP} ${_def_file}
252 COMMAND ${cpPlugins_bash_BuildInstances_APP} ${_def_file} ${_lib_name} ${_out_base}/${_def_name} ${number_of_files}
257 "${_lib_name}" ${lib_dir} SHARED
258 "${_all_out_code}" "${_out_header}" ""
259 "${version}" "${short_version}"
263 SET(${out_lib_name} ${_lib_name} PARENT_SCOPE)
267 ## -------------------------------------------------------------------------
268 FUNCTION(Wrap_cpPlugins output_lib source_dir version short_version prefix)
270 ## -- Configure inputs to be cmake-path compatible
271 NormPaths(_source_dir ${source_dir})
272 NormPaths(_global_source_dir ${PROJECT_SOURCE_DIR})
273 NormPaths(_global_binary_dir ${PROJECT_BINARY_DIR})
274 STRING(REPLACE "${_global_source_dir}" "" _out_dir ${_source_dir})
275 SET(_out_dir "${_global_binary_dir}${_out_dir}")
276 FILE(MAKE_DIRECTORY ${_out_dir})
277 GET_FILENAME_COMPONENT(_lib_name ${_source_dir} NAME_WE)
278 SET(_lib_name ${prefix}${_lib_name})
280 ## -- Get source code
281 FILE(GLOB_RECURSE _hdr_h "${_source_dir}/*.h")
282 FILE(GLOB_RECURSE _hdr_hxx "${_source_dir}/*.hxx")
283 FILE(GLOB_RECURSE _hdr_hpp "${_source_dir}/*.hpp")
284 FILE(GLOB_RECURSE _src_c "${_source_dir}/*.c")
285 FILE(GLOB_RECURSE _src_cxx "${_source_dir}/*.cxx")
286 FILE(GLOB_RECURSE _src_cpp "${_source_dir}/*.cpp")
287 FILE(GLOB_RECURSE _qt_ui "${_source_dir}/*.ui")
289 ## -- Identify sources to wrap
291 FOREACH(_h ${_hdr_h})
292 FILE(READ ${_h} _txt)
293 STRING(FIND "${_txt}" "cpPluginsObject" _res)
294 IF(NOT ${_res} EQUAL -1)
295 LIST(APPEND _hdr_to_wrap ${_h})
296 ENDIF(NOT ${_res} EQUAL -1)
299 ## -- Integrate all source files
300 SET(_all_src ${_src_c} ${_src_cpp} ${_src_cxx})
301 SET(_all_hdr ${_hdr_h} ${_hdr_hpp} ${_hdr_hxx})
305 SET(_host ${_out_dir}/${_lib_name}_host.cxx)
308 DEPENDS ${cpPlugins_bash_HostCreator_APP} ${_hdr_to_wrap}
309 COMMAND ${cpPlugins_bash_HostCreator_APP} ${_lib_name} ${_host} ${_hdr_to_wrap}
311 SET(_all_src ${_all_src} ${_host})
314 ## -- Ok, build library
317 ${_lib_name} leo SHARED
318 "${_all_src}" "${_all_hdr}" "${_qt_ui}"
319 "${version}" "${short_version}"
322 SET(${output_lib} ${_lib_name} PARENT_SCOPE)
324 MESSAGE(FATAL_ERROR "No source code found to build \"${_lib_name}\"")
328 ## -------------------------------------------------------------------------
329 FUNCTION(AppFromDir output_app source_dir)
331 ## -- Configure inputs to be cmake-path compatible
332 NormPaths(_global_source_dir ${PROJECT_SOURCE_DIR})
333 NormPaths(_global_binary_dir ${PROJECT_BINARY_DIR})
334 NormPaths(_source_dir ${source_dir})
335 STRING(REPLACE "${_global_source_dir}" "" _local_source_dir ${_source_dir})
336 SET(_binary_dir ${_global_binary_dir}${_local_source_dir})
338 SET(_app_name ${${output_app}})
340 GET_FILENAME_COMPONENT(_app_name ${_source_dir} NAME_WE)
342 SET(_app_name_option OFF)
344 LIST(GET ARGN 0 _app_name_option)
348 "Build \"${_app_name}\" application"
352 ## -- Real build commands
353 IF(BUILD_${_app_name})
354 ## -- Some useful variables
355 SET(_sources_extensions .c .cpp .cxx)
356 SET(_headers_extensions .h .hpp .hxx)
357 SET(_qt_ui_extensions .ui)
358 SET(_dirs ${_source_dir} ${_binary_dir})
363 ## -- Glob source code
365 FOREACH(_e ${_sources_extensions})
366 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
367 SET(_sources ${_sources} ${_f})
369 FOREACH(_e ${_headers_extensions})
370 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
371 SET(_headers ${_headers} ${_f})
373 FOREACH(_e ${_qt_ui_extensions})
374 FILE(GLOB_RECURSE _f "${_d}/*${_e}")
375 SET(_qt_uis ${_qt_uis} ${_f})
379 ## -- Configure some files
380 FILE(GLOB_RECURSE _configs "${_source_dir}/*.in")
381 FOREACH(_c ${_configs})
383 ## -- Build input and output names
384 NormPaths(_input_file ${_c})
385 GET_FILENAME_COMPONENT(_input_name ${_input_file} NAME)
386 GET_FILENAME_COMPONENT(_input_dir ${_input_file} DIRECTORY)
387 STRING(REPLACE ".in" "" _output_name ${_input_name})
388 STRING(REPLACE "${_global_source_dir}" "" _output_dir ${_input_dir})
389 SET(_output_file "${_global_binary_dir}${_output_dir}/${_output_name}")
392 CONFIGURE_FILE(${_input_file} ${_output_file} @ONLY)
394 ## -- Add it to the correct list
395 GET_FILENAME_COMPONENT(_output_ext ${_output_name} EXT)
397 "${_output_ext}" STREQUAL ".h"
399 "${_output_ext}" STREQUAL ".hpp"
401 "${_output_ext}" STREQUAL ".hxx"
403 SET(_headers ${_headers})
406 "${_output_ext}" STREQUAL ".c"
408 "${_output_ext}" STREQUAL ".cpp"
410 "${_output_ext}" STREQUAL ".cxx"
412 SET(_sources ${_sources})
414 IF("${_output_ext}" STREQUAL ".ui")
415 SET(_qt_uis ${_qt_uis})
419 # -- Prepare Qt4-based code
422 ## -- Guess what headers sould be qt-moc'ed
423 Wrap_Qt_CPP(_qt_moc_sources ${_headers})
425 SET(_sources ${_sources} ${_qt_moc_sources})
426 ENDIF(_qt_moc_sources)
427 ## -- Guess what qt-ui's sould be qt-uic'ed
428 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to
429 ## -- change the output file
430 Wrap_Qt_UI(_qt_ui_headers ${_qt_uis})
432 SET(_headers ${_headers} ${_qt_ui_headers})
433 SET(_sources ${_sources} ${_qt_ui_headers})
434 ENDIF(_qt_ui_headers)
437 ## -- Ok, compile application
444 SET(_gui_type MACOSX_BUNDLE)
446 ADD_EXECUTABLE(${_app_name} ${_gui_type} ${_sources})
447 SET(${output_app} ${_app_name} PARENT_SCOPE)
449 SET(${output_app} "" PARENT_SCOPE)
450 MESSAGE(FATAL_ERROR "No source code found to build \"${_app_name}\"")
452 ENDIF(BUILD_${_app_name})