2 ## =================================
3 ## == Function to build a library ==
4 ## =================================
6 FUNCTION(cpPlugins_ManageLibrary library_name type sources headers qt_files version short_version)
8 ## -- Configure some simple values
9 SET(_all_sources ${sources})
10 SET(_all_headers ${headers})
12 ## -- Guess what headers sould be qt-moc'ed
14 FOREACH(_h ${headers})
16 STRING(FIND "${_txt}" "Q_OBJECT" _r)
17 IF(NOT ${_r} EQUAL -1)
19 QT4_WRAP_CPP(_s ${_h})
20 SET(_all_sources ${_all_sources} ${_s})
21 ENDIF(NOT ${_r} EQUAL -1)
25 ## -- Guess what qt-ui's sould be qt-uic'ed
26 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change the
29 FOREACH(_ui ${qt_files})
30 SET(_base_dir ${CMAKE_CURRENT_SOURCE_DIR})
31 STRING(FIND "${_ui}" "${_base_dir}" _pos)
33 SET(_base_dir ${CMAKE_CURRENT_BINARY_DIR})
34 STRING(FIND "${_ui}" "${_base_dir}" _pos)
35 ENDIF(${_pos} EQUAL -1)
37 IF(NOT ${_pos} EQUAL -1)
38 FILE(TO_CMAKE_PATH ${_base_dir} _base_cmake_dir)
39 FILE(TO_CMAKE_PATH ${_ui} _ui_dir)
40 STRING(REPLACE "${_base_cmake_dir}/" "" _relative_dir ${_ui_dir})
41 ENDIF(NOT ${_pos} EQUAL -1)
42 GET_FILENAME_COMPONENT(_ui_name ${_ui} NAME_WE)
43 STRING(FIND "${_relative_dir}" "/" _pos REVERSE)
44 STRING(SUBSTRING "${_relative_dir}" 0 ${_pos} _o)
45 SET(_o_name ${CMAKE_CURRENT_BINARY_DIR}/${_o}/ui_${_ui_name}.h)
49 ARGS -o ${_o_name} ${_ui}
50 MAIN_DEPENDENCY ${_ui} VERBATIM
52 SET(_all_sources ${_all_sources} ${_o_name})
56 ## -- Ok, compile library
59 ## -- Try to guess the binary directory
61 FOREACH(_s ${_all_sources})
62 GET_FILENAME_COMPONENT(_d ${_s} DIRECTORY)
63 SET(_base_dir ${CMAKE_CURRENT_SOURCE_DIR})
64 STRING(FIND "${_d}" "${_base_dir}" _pos)
66 SET(_base_dir ${CMAKE_CURRENT_BINARY_DIR})
67 STRING(FIND "${_d}" "${_base_dir}" _pos)
68 ENDIF(${_pos} EQUAL -1)
69 IF(NOT ${_pos} EQUAL -1)
70 FILE(TO_CMAKE_PATH ${_base_dir} _base_cmake_dir)
71 FILE(TO_CMAKE_PATH ${_d} _d_dir)
72 STRING(REPLACE "${_base_cmake_dir}/" "" _almost_relative_dir ${_d_dir})
73 STRING(FIND "${_almost_relative_dir}" "/" _pos)
74 IF(NOT ${_pos} EQUAL -1)
75 STRING(SUBSTRING ${_almost_relative_dir} 0 ${_pos} _relative_dir)
76 ELSE(NOT ${_pos} EQUAL -1)
77 SET(_relative_dir ${_almost_relative_dir})
78 ENDIF(NOT ${_pos} EQUAL -1)
80 ENDIF(NOT ${_pos} EQUAL -1)
82 SET(_cur_binary_dir "${CMAKE_CURRENT_BINARY_DIR}/${_relative_dir}")
84 ADD_LIBRARY(${library_name} SHARED ${_all_sources})
85 SET_TARGET_PROPERTIES(
86 ${library_name} PROPERTIES
88 SOVERSION "${short_version}"
90 GENERATE_EXPORT_HEADER(
92 BASE_NAME ${library_name}
93 EXPORT_MACRO_NAME ${library_name}_EXPORT
94 EXPORT_FILE_NAME ${_cur_binary_dir}/${library_name}_Export.h
95 STATIC_DEFINE ${library_name}_BUILT_AS_STATIC
97 TARGET_LINK_LIBRARIES(${library_name} ${ARGN})
98 SET(${library_name}_LIB ${library_name} CACHE INTERNAL "Library ${name}")
103 ## ==================================================
104 ## == Function to build a library from a directory ==
105 ## ==================================================
107 FUNCTION(cpPlugins_CreateLibraryFromDirectory library_name type source_dir binary_dir version short_version)
109 ## -- Some useful variables
110 SET(_all_sources_extensions c cpp cxx)
111 SET(_all_headers_extensions h hpp hxx)
112 SET(_all_qt_ui_extensions ui)
113 SET(_all_dirs ${source_dir} ${binary_dir})
118 ## -- Configure some files
119 FILE(GLOB_RECURSE _all_configs "${source_dir}/*.in")
120 FOREACH(_c ${_all_configs})
121 SET(_base_dir ${CMAKE_CURRENT_SOURCE_DIR})
122 STRING(FIND "${_c}" "${_base_dir}" _pos)
124 SET(_base_dir ${CMAKE_CURRENT_BINARY_DIR})
125 STRING(FIND "${_c}" "${_base_dir}" _pos)
126 ENDIF(${_pos} EQUAL -1)
128 IF(NOT ${_pos} EQUAL -1)
129 FILE(TO_CMAKE_PATH ${_base_dir} _base_cmake_dir)
130 FILE(TO_CMAKE_PATH ${_c} _c_dir)
131 STRING(REPLACE "${_base_cmake_dir}/" "" _almost_relative_dir ${_c_dir})
132 STRING(FIND "${_almost_relative_dir}" "/" _pos)
133 SET(_relative_dir ${_almost_relative_dir})
134 IF(NOT ${_pos} EQUAL -1)
135 STRING(SUBSTRING ${_almost_relative_dir} 0 ${_pos} _relative_dir)
136 ENDIF(NOT ${_pos} EQUAL -1)
137 ENDIF(NOT ${_pos} EQUAL -1)
138 GET_FILENAME_COMPONENT(_c_name ${_c} NAME)
139 STRING(REGEX REPLACE ".in" "" _o_name ${_c_name})
141 ${_c} ${CMAKE_CURRENT_BINARY_DIR}/${_relative_dir}/${_o_name} @ONLY
143 SET(_all_headers ${_all_headers} ${CMAKE_CURRENT_BINARY_DIR}/${_relative_dir}/${_o_name})
146 ## -- Glob source code
147 FOREACH(_d ${_all_dirs})
148 FOREACH(_e ${_all_sources_extensions})
149 FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
150 SET(_all_sources ${_all_sources} ${_f})
152 FOREACH(_e ${_all_headers_extensions})
153 FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
154 SET(_all_headers ${_all_headers} ${_f})
156 FOREACH(_e ${_all_qt_ui_extensions})
157 FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
158 SET(_all_qt_ui ${_all_qt_ui} ${_f})
163 cpPlugins_ManageLibrary(
164 ${library_name} ${type}
165 "${_all_sources}" "${_all_headers}" "${_all_qt_ui}"
166 "${version}" "${short_version}"
172 ## ================================
173 ## == Function to wrap instances ==
174 ## ================================
176 FUNCTION(cpPlugins_WrapInstances def_file prefix version short_version)
178 ## -- Configure some simple values
179 SET(_def_canonical_file "${CMAKE_CURRENT_SOURCE_DIR}/${def_file}.i")
180 SET(_header_file "${CMAKE_CURRENT_BINARY_DIR}/${prefix}${def_file}.h")
181 SET(_code_file "${CMAKE_CURRENT_BINARY_DIR}/${prefix}${def_file}.cxx")
182 SET(_extra_code_file "${CMAKE_CURRENT_SOURCE_DIR}/${def_file}_extra.cxx")
183 SET(_library_name "${prefix}${def_file}")
185 ## -- Add extra code, if any
186 SET(_all_code_files ${_code_file})
187 IF(EXISTS ${_extra_code_file})
188 SET(_all_code_files ${_all_code_files} ${_extra_code_file})
189 ENDIF(EXISTS ${_extra_code_file})
191 ## -- Command to write source code
193 OUTPUT ${_header_file} ${_code_file}
194 DEPENDS ${cpPlugins_CreateInstances_APP} ${_def_canonical_file}
195 COMMAND ${cpPlugins_CreateInstances_APP} ${_def_canonical_file} ${_library_name} ${CMAKE_CURRENT_BINARY_DIR}
199 cpPlugins_ManageLibrary(
200 ${_library_name} SHARED
201 "${_all_code_files}" "" ""
202 "${version}" "${short_version}"
208 ## ====================================
209 ## == Function to wrap plugins hosts ==
210 ## ====================================
212 FUNCTION(cpPlugins_WrapPlugins source_dir version short_version prefix)
214 ## -- Some configuration values
215 SET(_source_dir ${CMAKE_CURRENT_SOURCE_DIR}/${source_dir})
216 SET(_binary_dir ${CMAKE_CURRENT_BINARY_DIR}/${source_dir})
217 SET(_lib_name ${prefix}${source_dir})
219 ## -- Get source code
220 FILE(GLOB_RECURSE _hdr_h "${_source_dir}/*.h")
221 FILE(GLOB_RECURSE _hdr_hxx "${_source_dir}/*.hxx")
222 FILE(GLOB_RECURSE _hdr_hpp "${_source_dir}/*.hpp")
223 FILE(GLOB_RECURSE _src_c "${_source_dir}/*.c")
224 FILE(GLOB_RECURSE _src_cxx "${_source_dir}/*.cxx")
225 FILE(GLOB_RECURSE _src_cpp "${_source_dir}/*.cpp")
226 FILE(GLOB_RECURSE _qt_ui "${_source_dir}/*.ui")
228 ## -- Identify sources to wrap
230 FOREACH(_h ${_hdr_h})
231 FILE(READ ${_h} _txt)
232 STRING(FIND "${_txt}" "cpPluginsObject;" _res)
233 IF(NOT ${_res} EQUAL -1)
234 LIST(APPEND _hdr_to_wrap ${_h})
235 ENDIF(NOT ${_res} EQUAL -1)
238 ## -- Integrate all source files
239 SET(_all_src ${_src_c} ${_src_cpp} ${_src_cxx})
240 SET(_all_hdr ${_hdr_h} ${_hdr_hpp} ${_hdr_hxx})
244 SET(_host ${_binary_dir}/${_lib_name}_host.cxx)
247 DEPENDS ${cpPlugins_HostCreator_APP} ${_hdr_to_wrap}
248 COMMAND ${cpPlugins_HostCreator_APP} ${_lib_name} ${_host} ${_hdr_to_wrap}
250 SET(_all_src ${_all_src} ${_host})
253 ## -- Ok, build library
255 cpPlugins_ManageLibrary(
257 "${_all_src}" "${_all_hdr}" "${_qt_ui}"
258 "${version}" "${short_version}"
262 MESSAGE(FATAL_ERROR "No source code found to build \"${_lib_name}\"")
267 ## ======================================
268 ## == Function to build an application ==
269 ## ======================================
271 FUNCTION(cpPlugins_BuildAppFromDirectory directory)
273 ## -- Some configuration values
274 FILE(TO_CMAKE_PATH ${directory} _src_dir)
275 STRING(REPLACE "${PROJECT_SOURCE_DIR}/" "" _bin_dir ${_src_dir})
276 SET(_bin_dir "${PROJECT_BINARY_DIR}/${_bin_dir}")
277 GET_FILENAME_COMPONENT(_app_name ${_src_dir} NAME)
278 SET(_all_sources_extensions c cpp cxx)
279 SET(_all_headers_extensions h hpp hxx)
280 SET(_all_qt_ui_extensions ui)
281 SET(_all_dirs ${_src_dir} ${_bin_dir})
286 ## -- Compilation option
287 OPTION(BUILD_${_app_name} "Build \"${_app_name}\" application" OFF)
289 ## -- Glob source code
290 FOREACH(_d ${_all_dirs})
291 FOREACH(_e ${_all_sources_extensions})
292 FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
293 SET(_all_sources ${_all_sources} ${_f})
295 FOREACH(_e ${_all_headers_extensions})
296 FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
297 SET(_all_headers ${_all_headers} ${_f})
299 FOREACH(_e ${_all_qt_ui_extensions})
300 FILE(GLOB_RECURSE _f "${_d}/*.${_e}")
301 SET(_all_qt_ui ${_all_qt_ui} ${_f})
305 ## -- Guess what headers sould be qt-moc'ed
306 FOREACH(_h ${_all_headers})
307 FILE(READ ${_h} _txt)
308 STRING(FIND "${_txt}" "Q_OBJECT" _r)
309 IF(NOT ${_r} EQUAL -1)
311 QT4_WRAP_CPP(_s ${_h})
312 SET(_all_sources ${_all_sources} ${_s})
313 ENDIF(NOT ${_r} EQUAL -1)
316 ## -- Guess what qt-ui's sould be qt-uic'ed
317 ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change the
319 FOREACH(_ui ${_all_qt_ui})
320 GET_FILENAME_COMPONENT(_r_ui ${_ui} NAME_WE)
321 SET(_o_ui ${_bin_dir}/ui_${_r_ui}.h)
325 ARGS -o ${_o_ui} ${_ui}
326 MAIN_DEPENDENCY ${_ui} VERBATIM
328 SET(_all_sources ${_all_sources} ${_o_ui})
329 SET(_all_headers ${_all_headers} ${_o_ui})
332 ## -- Ok, compile application
334 ADD_EXECUTABLE(${_app_name} ${_all_sources})
335 TARGET_LINK_LIBRARIES(${_app_name} ${ARGN})
337 MESSAGE(FATAL_ERROR "No source code found to build \"${_app_name}\"")