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 ## -------------------------------------------------------------------------
68 SET(_config_extensions .c.in .cpp.in .cxx.in .h.in .hpp.in .hxx.in .ui.in)
69 SET(_sources_extensions .c .cpp .cxx)
70 SET(_headers_extensions .h .hpp .hxx)
71 SET(_qt_ui_extensions .ui)
72 SET(_demangler_extensions .d)
73 SET(_instances_extensions .i)
75 ## -- Configure inputs
77 FOREACH(_file ${ARGN})
78 GET_FILENAME_COMPONENT(_ext ${_file} EXT)
79 LIST(FIND _config_extensions ${_ext} _cfg)
80 IF(NOT ${_cfg} EQUAL -1)
88 STRING(LENGTH ${_file_bin} _file_bin_len)
89 MATH(EXPR _file_bin_len "${_file_bin_len}-3")
90 STRING(SUBSTRING ${_file_bin} 0 ${_file_bin_len} _file_bin)
91 CONFIGURE_FILE(${_file} ${_file_bin} @ONLY)
92 LIST(APPEND _all_files ${_file_bin})
93 ELSE(NOT ${_cfg} EQUAL -1)
94 LIST(APPEND _all_files ${_file})
95 ENDIF(NOT ${_cfg} EQUAL -1)
104 FOREACH(_file ${_all_files})
105 GET_FILENAME_COMPONENT(_ext ${_file} EXT)
106 LIST(FIND _sources_extensions ${_ext} _src)
107 LIST(FIND _headers_extensions ${_ext} _hdr)
108 LIST(FIND _qt_ui_extensions ${_ext} _ui)
109 LIST(FIND _demangler_extensions ${_ext} _dem)
110 LIST(FIND _instances_extensions ${_ext} _ins)
111 IF(NOT ${_src} EQUAL -1)
112 LIST(APPEND _srcs ${_file})
113 ENDIF(NOT ${_src} EQUAL -1)
114 IF(NOT ${_hdr} EQUAL -1)
115 LIST(APPEND _hdrs ${_file})
116 ENDIF(NOT ${_hdr} EQUAL -1)
117 IF(NOT ${_ui} EQUAL -1)
118 LIST(APPEND _qts ${_file})
119 ENDIF(NOT ${_ui} EQUAL -1)
120 IF(NOT ${_dem} EQUAL -1)
121 LIST(APPEND _demanglers ${_file})
122 ENDIF(NOT ${_dem} EQUAL -1)
123 IF(NOT ${_ins} EQUAL -1)
124 LIST(APPEND _instances ${_file})
125 ENDIF(NOT ${_ins} EQUAL -1)
128 # -- Prepare Qt4-based code
130 ## -- Guess what headers sould be qt-moc'ed
131 Wrap_Qt_CPP(_moc ${_hdrs})
133 LIST(APPEND _srcs ${_moc})
136 ## -- Guess what qt-ui's sould be qt-uic'ed
137 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change
138 ## -- the output file
139 Wrap_Qt_UI(_qt_hdrs ${_qts})
141 LIST(APPEND _hdrs ${_qt_hdrs})
145 ## -- Create demanglers
146 FOREACH(_d ${_demanglers})
149 ${PROJECT_SOURCE_DIR}
150 ${PROJECT_BINARY_DIR}
154 GET_FILENAME_COMPONENT(_d_path ${_d_bin} DIRECTORY)
155 GET_FILENAME_COMPONENT(_out_name ${_d_bin} NAME_WE)
156 SET(_d_out ${_d_path}/${_out_name}_Demanglers.h)
159 COMMAND ${CMAKE_COMMAND} -E make_directory ${_d_path}
160 COMMAND ${cpPlugins_bash_CreateDemanglers_APP} ${_d} ${_out_name} ${_d_out}
161 DEPENDS ${cpPlugins_bash_CreateDemanglers_APP} ${_d}
163 LIST(APPEND _hdrs ${_d_out})
166 ## -- Create instances
167 FOREACH(_i ${_instances})
170 ${PROJECT_SOURCE_DIR}
171 ${PROJECT_BINARY_DIR}
175 GET_FILENAME_COMPONENT(_i_path ${_i_bin} DIRECTORY)
176 GET_FILENAME_COMPONENT(_out_name ${_i} NAME_WE)
178 ## -- Infere source code filenames
179 MATH(EXPR _last_range "${cpPlugins_NUMBER_OF_FILES}-1")
181 FOREACH(_n RANGE 0 ${_last_range})
182 LIST(APPEND _out_code ${_i_path}/${_out_name}_${_n}.cxx)
183 LIST(APPEND _srcs ${_i_path}/${_out_name}_${_n}.cxx)
186 ## -- Command to write source code
189 DEPENDS ${cpPlugins_bash_CreateInstances_APP} ${_i}
190 COMMAND ${CMAKE_COMMAND} -E make_directory ${_i_path}
191 COMMAND ${cpPlugins_bash_CreateInstances_APP} ${_i} ${lib_name} ${_i_path}/${_out_name}
195 ## -- Real compilation
197 FOREACH(_hdr ${_hdrs})
198 GET_FILENAME_COMPONENT(_path ${_hdr} DIRECTORY)
199 LIST(FIND _hdrs_paths ${_path} _path_idx)
200 IF(${_path_idx} EQUAL -1)
201 LIST(APPEND _hdrs_paths ${_path})
202 ENDIF(${_path_idx} EQUAL -1)
205 SET(${out_sources_list} ${_srcs} PARENT_SCOPE)
206 SET(${out_headers_list} ${_hdrs} PARENT_SCOPE)
207 SET(${out_headers_paths} ${_hdrs_paths} PARENT_SCOPE)
211 ## -------------------------------------------------------------------------
212 FUNCTION(cpPlugins_BuildLibrary lib_name lib_type)
213 # -- Detect all source files
216 GET_FILENAME_COMPONENT(_cname ${_c} ABSOLUTE)
218 IF(IS_DIRECTORY ${_cname})
219 FILE(GLOB_RECURSE _files "${_cname}/*")
220 ELSE(IS_DIRECTORY ${_cname})
221 SET(_files ${_cname})
222 ENDIF(IS_DIRECTORY ${_cname})
223 LIST(APPEND _all_files ${_files})
224 ENDFOREACH(_c ${ARGN})
226 ## -- Prepare sources by types
227 PrepareSourceFiles(${lib_name} _srcs _hdrs _paths ${_all_files})
232 ${CMAKE_CURRENT_SOURCE_DIR}
233 ${CMAKE_CURRENT_BINARY_DIR}
235 ADD_LIBRARY(${lib_name} ${lib_type} ${_srcs} ${_hdrs})
236 GENERATE_EXPORT_HEADER(
238 BASE_NAME ${lib_name}
239 EXPORT_MACRO_NAME ${lib_name}_EXPORT
240 EXPORT_FILE_NAME ${lib_name}_Export.h
241 STATIC_DEFINE ${lib_name}_BUILT_AS_STATIC
247 ## -------------------------------------------------------------------------
248 FUNCTION(cpPlugins_BuildPluginsLibrary lib_name)
249 # -- Detect all source files
252 GET_FILENAME_COMPONENT(_cname ${_c} ABSOLUTE)
254 IF(IS_DIRECTORY ${_cname})
255 FILE(GLOB_RECURSE _files "${_cname}/*")
256 ELSE(IS_DIRECTORY ${_cname})
257 SET(_files ${_cname})
258 ENDIF(IS_DIRECTORY ${_cname})
259 LIST(APPEND _all_files ${_files})
260 ENDFOREACH(_c ${ARGN})
262 ## -- Prepare sources by types
263 PrepareSourceFiles(${lib_name} _srcs _hdrs _paths ${_all_files})
265 ## -- Check which headers need to be wrapped to build host code
267 FOREACH(_hdr ${_hdrs})
269 FILE(READ ${_hdr} _txt)
270 STRING(FIND "${_txt}" "cpPluginsObject" _res)
271 IF(NOT ${_res} EQUAL -1)
272 LIST(APPEND _hdrs_to_wrap ${_hdr})
273 ENDIF(NOT ${_res} EQUAL -1)
274 ENDIF(EXISTS ${_hdr})
279 SET(_host ${CMAKE_CURRENT_BINARY_DIR}/${lib_name}_host.cxx)
282 DEPENDS ${cpPlugins_bash_HostCreator_APP} ${_hdrs_to_wrap}
283 COMMAND ${cpPlugins_bash_HostCreator_APP} ${lib_name} ${_host} ${_hdrs_to_wrap}
285 LIST(APPEND _all_files ${_host})
288 cpPlugins_BuildLibrary(${lib_name} SHARED ${_all_files})
291 ## -------------------------------------------------------------------------
292 FUNCTION(cpPlugins_BuildApplication app_name)
293 OPTION(BUILD_${app_name} "Build \"${app_name}\" application?" OFF)
294 IF(BUILD_${app_name})
295 # -- Detect all source files
298 GET_FILENAME_COMPONENT(_cname ${_c} ABSOLUTE)
300 IF(IS_DIRECTORY ${_cname})
301 FILE(GLOB_RECURSE _files "${_cname}/*")
302 ELSE(IS_DIRECTORY ${_cname})
303 SET(_files ${_cname})
304 ENDIF(IS_DIRECTORY ${_cname})
305 LIST(APPEND _all_files ${_files})
306 ENDFOREACH(_c ${ARGN})
308 ## -- Prepare sources by types
309 PrepareSourceFiles(${app_name} _srcs _hdrs _paths ${_all_files})
314 ${CMAKE_CURRENT_SOURCE_DIR}
315 ${CMAKE_CURRENT_BINARY_DIR}
318 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
319 SET(_app_os_target WIN32)
320 ELSEIF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
321 SET(_app_os_target MACOSX_BUNDLE)
322 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
323 ADD_EXECUTABLE(${app_name} ${_app_os_target} ${_srcs} ${_hdrs})
325 ENDIF(BUILD_${app_name})