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 ## -------------------------------------------------------------------------
67 SET(_config_extensions .c.in .cpp.in .cxx.in .h.in .hpp.in .hxx.in .ui.in)
68 SET(_sources_extensions .c .cpp .cxx)
69 SET(_headers_extensions .h .hpp .hxx)
70 SET(_qt_ui_extensions .ui)
71 SET(_demangler_extensions .d)
73 ## -- Configure inputs
75 FOREACH(_file ${ARGN})
76 GET_FILENAME_COMPONENT(_ext ${_file} EXT)
77 LIST(FIND _config_extensions ${_ext} _cfg)
78 IF(NOT ${_cfg} EQUAL -1)
86 STRING(LENGTH ${_file_bin} _file_bin_len)
87 MATH(EXPR _file_bin_len "${_file_bin_len}-3")
88 STRING(SUBSTRING ${_file_bin} 0 ${_file_bin_len} _file_bin)
89 CONFIGURE_FILE(${_file} ${_file_bin} @ONLY)
90 LIST(APPEND _all_files ${_file_bin})
91 ELSE(NOT ${_cfg} EQUAL -1)
92 LIST(APPEND _all_files ${_file})
93 ENDIF(NOT ${_cfg} EQUAL -1)
101 FOREACH(_file ${_all_files})
102 GET_FILENAME_COMPONENT(_ext ${_file} EXT)
103 LIST(FIND _sources_extensions ${_ext} _src)
104 LIST(FIND _headers_extensions ${_ext} _hdr)
105 LIST(FIND _qt_ui_extensions ${_ext} _ui)
106 LIST(FIND _demangler_extensions ${_ext} _dem)
107 IF(NOT ${_src} EQUAL -1)
108 LIST(APPEND _srcs ${_file})
109 ENDIF(NOT ${_src} EQUAL -1)
110 IF(NOT ${_hdr} EQUAL -1)
111 LIST(APPEND _hdrs ${_file})
112 ENDIF(NOT ${_hdr} EQUAL -1)
113 IF(NOT ${_ui} EQUAL -1)
114 LIST(APPEND _qts ${_file})
115 ENDIF(NOT ${_ui} EQUAL -1)
116 IF(NOT ${_dem} EQUAL -1)
117 LIST(APPEND _demanglers ${_file})
118 ENDIF(NOT ${_dem} EQUAL -1)
121 # -- Prepare Qt4-based code
123 ## -- Guess what headers sould be qt-moc'ed
124 Wrap_Qt_CPP(_moc ${_hdrs})
126 LIST(APPEND _srcs ${_moc})
129 ## -- Guess what qt-ui's sould be qt-uic'ed
130 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change
131 ## -- the output file
132 Wrap_Qt_UI(_qt_hdrs ${_qts})
134 LIST(APPEND _hdrs ${_qt_hdrs})
138 ## -- Create demanglers
139 FOREACH(_d ${_demanglers})
142 ${PROJECT_SOURCE_DIR}
143 ${PROJECT_BINARY_DIR}
147 GET_FILENAME_COMPONENT(_d_path ${_d_bin} DIRECTORY)
148 GET_FILENAME_COMPONENT(_out_name ${_d_bin} NAME_WE)
149 SET(_d_out ${_d_path}/${_out_name}_Demanglers.h)
152 COMMAND ${CMAKE_COMMAND} -E make_directory ${_d_path}
153 COMMAND ${cpPlugins_bash_CreateDemanglers_APP} ${_d} ${_out_name} ${_d_out}
154 DEPENDS ${cpPlugins_bash_CreateDemanglers_APP} ${_d}
156 LIST(APPEND _hdrs ${_d_out})
159 ## -- Real compilation
161 FOREACH(_hdr ${_hdrs})
162 GET_FILENAME_COMPONENT(_path ${_hdr} DIRECTORY)
163 LIST(FIND _hdrs_paths ${_path} _path_idx)
164 IF(${_path_idx} EQUAL -1)
165 LIST(APPEND _hdrs_paths ${_path})
166 ENDIF(${_path_idx} EQUAL -1)
169 SET(${out_sources_list} ${_srcs} PARENT_SCOPE)
170 SET(${out_headers_list} ${_hdrs} PARENT_SCOPE)
171 SET(${out_headers_paths} ${_hdrs_paths} PARENT_SCOPE)
175 ## -------------------------------------------------------------------------
181 PrepareSourceFiles(_srcs _hdrs _paths ${ARGN})
184 ${CMAKE_CURRENT_SOURCE_DIR}
185 ${CMAKE_CURRENT_BINARY_DIR}
188 ADD_LIBRARY(${lib_name} ${lib_type} ${_srcs} ${_hdrs})
189 GENERATE_EXPORT_HEADER(
191 BASE_NAME ${lib_name}
192 EXPORT_MACRO_NAME ${lib_name}_EXPORT
193 EXPORT_FILE_NAME ${lib_name}_Export.h
194 STATIC_DEFINE ${lib_name}_BUILT_AS_STATIC
196 IF(${prj_NAME}_All_Headers)
197 SET(_hdr_tmp "${${prj_NAME}_All_Headers};${_hdrs}")
198 ELSE(${prj_NAME}_All_Headers)
199 SET(_hdr_tmp "${_hdrs}")
200 ENDIF(${prj_NAME}_All_Headers)
201 LIST(REMOVE_DUPLICATES _hdr_tmp)
202 SET(${prj_NAME}_All_Headers ${_hdr_tmp} CACHE INTERNAL "All headers." FORCE)
206 ## -------------------------------------------------------------------------
213 FILE(GLOB_RECURSE _files "${lib_dir}/*")
214 CreateLib(${lib_name} ${lib_type} ${_files} ${ARGN})
217 ## -------------------------------------------------------------------------
225 ### -- Configure inputs to be cmake-path compatible
226 SET(_src_dir ${CMAKE_CURRENT_SOURCE_DIR})
227 SET(_bin_dir ${CMAKE_CURRENT_BINARY_DIR})
228 SET(_def_file "${_src_dir}/${def_file}")
230 ## -- Infere source code filenames
231 MATH(EXPR _last_range "${number_of_files}-1")
232 SET(_out_code "${_bin_dir}/${out_lib_name}.h")
233 FOREACH(_n RANGE 0 ${_last_range})
234 LIST(APPEND _out_code ${_bin_dir}/${out_lib_name}_${_n}.cxx)
237 ## -- Command to write source code
240 DEPENDS ${cpPlugins_bash_CreateInstances_APP} ${_def_file}
241 COMMAND ${cpPlugins_bash_CreateInstances_APP} ${_def_file} ${out_lib_name} ${_bin_dir} ${number_of_files}
245 CreateLib(${out_lib_name} SHARED "${_out_code}")
249 ## -------------------------------------------------------------------------
257 GET_FILENAME_COMPONENT(_lib_dir ${lib_dir} REALPATH)
258 FILE(GLOB_RECURSE _files "${_lib_dir}/*")
261 FOREACH(_file ${_files})
262 FILE(READ ${_file} _txt)
263 STRING(FIND "${_txt}" "cpPluginsObject" _res)
264 IF(NOT ${_res} EQUAL -1)
265 LIST(APPEND _hdr_to_wrap ${_file})
266 ENDIF(NOT ${_res} EQUAL -1)
267 GET_FILENAME_COMPONENT(_ext ${_file} EXT)
268 IF(${_ext} STREQUAL ".i")
269 LIST(APPEND _instances ${_file})
270 ENDIF(${_ext} STREQUAL ".i")
274 FOREACH(_instance ${_instances})
277 ${PROJECT_SOURCE_DIR}
278 ${PROJECT_BINARY_DIR}
282 MATH(EXPR _last_range "${number_of_files}-1")
283 SET(_out_code "${_out_dir}/${lib_name}.h")
284 FOREACH(_n RANGE 0 ${_last_range})
285 LIST(APPEND _out_code ${_out_dir}/${lib_name}_${_n}.cxx)
290 DEPENDS ${cpPlugins_bash_CreateInstances_APP} ${_instance}
291 COMMAND ${CMAKE_COMMAND} -E make_directory ${_out_dir}
292 COMMAND ${cpPlugins_bash_CreateInstances_APP} ${_instance} ${lib_name} ${_out_dir} ${number_of_files}
294 LIST(APPEND _files ${_out_code})
295 ENDFOREACH(_instance)
301 ${PROJECT_SOURCE_DIR}
302 ${PROJECT_BINARY_DIR}
306 SET(_host ${_out_dir}/${lib_name}_host.cxx)
309 DEPENDS ${cpPlugins_bash_HostCreator_APP} ${_hdr_to_wrap}
310 COMMAND ${CMAKE_COMMAND} -E make_directory ${_out_dir}
311 COMMAND ${cpPlugins_bash_HostCreator_APP} ${lib_name} ${_host} ${_hdr_to_wrap}
313 LIST(APPEND _files ${_host})
316 CreateLib(${lib_name} SHARED ${_files})
320 ## -------------------------------------------------------------------------
326 OPTION(BUILD_${app_name} "Build ${app_name}" OFF)
327 IF(BUILD_${app_name})
328 FILE(GLOB_RECURSE _files "${app_dir}/*")
329 PrepareSourceFiles(_srcs _hdrs _paths ${_files} ${ARGN})
332 ${CMAKE_CURRENT_SOURCE_DIR}
333 ${CMAKE_CURRENT_BINARY_DIR}
337 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
338 SET(_app_os_target WIN32)
339 ELSEIF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
340 SET(_app_os_target MACOSX_BUNDLE)
341 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
342 ADD_EXECUTABLE(${app_name} ${_app_os_target} ${_srcs} ${_hdrs})
344 ENDIF(BUILD_${app_name})