## ================================= ## == Function to build a library == ## ================================= FUNCTION(cpPlugins_ManageLibrary library_name type sources headers qt_files version short_version) ## -- Configure some simple values SET(_all_sources ${sources}) SET(_all_headers ${headers}) ## -- Guess what headers sould be qt-moc'ed IF(Qt4_FOUND) FOREACH(_h ${headers}) FILE(READ ${_h} _txt) STRING(FIND "${_txt}" "Q_OBJECT" _r) IF(NOT ${_r} EQUAL -1) SET(_s) QT4_WRAP_CPP(_s ${_h}) SET(_all_sources ${_all_sources} ${_s}) ENDIF(NOT ${_r} EQUAL -1) ENDFOREACH(_h) ENDIF(Qt4_FOUND) ## -- Guess what qt-ui's sould be qt-uic'ed ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change the ## -- output file IF(Qt4_FOUND) FOREACH(_ui ${qt_files}) SET(_base_dir ${CMAKE_CURRENT_SOURCE_DIR}) STRING(FIND "${_ui}" "${_base_dir}" _pos) IF(${_pos} EQUAL -1) SET(_base_dir ${CMAKE_CURRENT_BINARY_DIR}) STRING(FIND "${_ui}" "${_base_dir}" _pos) ENDIF(${_pos} EQUAL -1) SET(_relative_dir) IF(NOT ${_pos} EQUAL -1) FILE(TO_CMAKE_PATH ${_base_dir} _base_cmake_dir) FILE(TO_CMAKE_PATH ${_ui} _ui_dir) STRING(REPLACE "${_base_cmake_dir}/" "" _relative_dir ${_ui_dir}) ENDIF(NOT ${_pos} EQUAL -1) GET_FILENAME_COMPONENT(_ui_name ${_ui} NAME_WE) STRING(FIND "${_relative_dir}" "/" _pos REVERSE) STRING(SUBSTRING "${_relative_dir}" 0 ${_pos} _o) SET(_o_name ${CMAKE_CURRENT_BINARY_DIR}/${_o}/ui_${_ui_name}.h) ADD_CUSTOM_COMMAND( OUTPUT ${_o_name} COMMAND Qt4::uic ARGS -o ${_o_name} ${_ui} MAIN_DEPENDENCY ${_ui} VERBATIM ) SET(_all_sources ${_all_sources} ${_o_name}) ENDFOREACH(_ui) ENDIF(Qt4_FOUND) ## -- Ok, compile library IF(_all_sources) ## -- Try to guess the binary directory SET(_relative_dir) FOREACH(_s ${_all_sources}) GET_FILENAME_COMPONENT(_d ${_s} DIRECTORY) SET(_base_dir ${CMAKE_CURRENT_SOURCE_DIR}) STRING(FIND "${_d}" "${_base_dir}" _pos) IF(${_pos} EQUAL -1) SET(_base_dir ${CMAKE_CURRENT_BINARY_DIR}) STRING(FIND "${_d}" "${_base_dir}" _pos) ENDIF(${_pos} EQUAL -1) IF(NOT ${_pos} EQUAL -1) FILE(TO_CMAKE_PATH ${_base_dir} _base_cmake_dir) FILE(TO_CMAKE_PATH ${_d} _d_dir) STRING(REPLACE "${_base_cmake_dir}/" "" _almost_relative_dir ${_d_dir}) STRING(FIND "${_almost_relative_dir}" "/" _pos) IF(NOT ${_pos} EQUAL -1) STRING(SUBSTRING ${_almost_relative_dir} 0 ${_pos} _relative_dir) ELSE(NOT ${_pos} EQUAL -1) SET(_relative_dir ${_almost_relative_dir}) ENDIF(NOT ${_pos} EQUAL -1) BREAK() ENDIF(NOT ${_pos} EQUAL -1) ENDFOREACH(_s) SET(_cur_binary_dir "${CMAKE_CURRENT_BINARY_DIR}/${_relative_dir}") ADD_LIBRARY(${library_name} SHARED ${_all_sources}) SET_TARGET_PROPERTIES( ${library_name} PROPERTIES VERSION "${version}" SOVERSION "${short_version}" ) GENERATE_EXPORT_HEADER( ${library_name} BASE_NAME ${library_name} EXPORT_MACRO_NAME ${library_name}_EXPORT EXPORT_FILE_NAME ${_cur_binary_dir}/${library_name}_Export.h STATIC_DEFINE ${library_name}_BUILT_AS_STATIC ) TARGET_LINK_LIBRARIES(${library_name} ${ARGN}) SET(${library_name}_LIB ${library_name} CACHE INTERNAL "Library ${name}") ENDIF(_all_sources) ENDFUNCTION() ## ================================================== ## == Function to build a library from a directory == ## ================================================== FUNCTION(cpPlugins_CreateLibraryFromDirectory library_name type source_dir binary_dir version short_version) ## -- Some useful variables SET(_all_sources_extensions c cpp cxx) SET(_all_headers_extensions h hpp hxx) SET(_all_qt_ui_extensions ui) SET(_all_dirs ${source_dir} ${binary_dir}) SET(_all_sources) SET(_all_headers) SET(_all_qt_ui) ## -- Configure some files FILE(GLOB_RECURSE _all_configs "${source_dir}/*.in") FOREACH(_c ${_all_configs}) SET(_base_dir ${CMAKE_CURRENT_SOURCE_DIR}) STRING(FIND "${_c}" "${_base_dir}" _pos) IF(${_pos} EQUAL -1) SET(_base_dir ${CMAKE_CURRENT_BINARY_DIR}) STRING(FIND "${_c}" "${_base_dir}" _pos) ENDIF(${_pos} EQUAL -1) SET(_relative_dir) IF(NOT ${_pos} EQUAL -1) FILE(TO_CMAKE_PATH ${_base_dir} _base_cmake_dir) FILE(TO_CMAKE_PATH ${_c} _c_dir) STRING(REPLACE "${_base_cmake_dir}/" "" _almost_relative_dir ${_c_dir}) STRING(FIND "${_almost_relative_dir}" "/" _pos) SET(_relative_dir ${_almost_relative_dir}) IF(NOT ${_pos} EQUAL -1) STRING(SUBSTRING ${_almost_relative_dir} 0 ${_pos} _relative_dir) ENDIF(NOT ${_pos} EQUAL -1) ENDIF(NOT ${_pos} EQUAL -1) GET_FILENAME_COMPONENT(_c_name ${_c} NAME) STRING(REGEX REPLACE ".in" "" _o_name ${_c_name}) CONFIGURE_FILE( ${_c} ${CMAKE_CURRENT_BINARY_DIR}/${_relative_dir}/${_o_name} @ONLY ) SET(_all_headers ${_all_headers} ${CMAKE_CURRENT_BINARY_DIR}/${_relative_dir}/${_o_name}) ENDFOREACH(_c) ## -- Glob source code FOREACH(_d ${_all_dirs}) FOREACH(_e ${_all_sources_extensions}) FILE(GLOB_RECURSE _f "${_d}/*.${_e}") SET(_all_sources ${_all_sources} ${_f}) ENDFOREACH(_e) FOREACH(_e ${_all_headers_extensions}) FILE(GLOB_RECURSE _f "${_d}/*.${_e}") SET(_all_headers ${_all_headers} ${_f}) ENDFOREACH(_e) FOREACH(_e ${_all_qt_ui_extensions}) FILE(GLOB_RECURSE _f "${_d}/*.${_e}") SET(_all_qt_ui ${_all_qt_ui} ${_f}) ENDFOREACH(_e) ENDFOREACH(_d) ## -- Create library cpPlugins_ManageLibrary( ${library_name} ${type} "${_all_sources}" "${_all_headers}" "${_all_qt_ui}" "${version}" "${short_version}" ${ARGN} ) ENDFUNCTION() ## ================================ ## == Function to wrap instances == ## ================================ FUNCTION(cpPlugins_WrapInstances def_file prefix version short_version) ## -- Configure some simple values SET(_def_canonical_file "${CMAKE_CURRENT_SOURCE_DIR}/${def_file}.i") SET(_header_file "${CMAKE_CURRENT_BINARY_DIR}/${prefix}${def_file}.h") SET(_code_file "${CMAKE_CURRENT_BINARY_DIR}/${prefix}${def_file}.cxx") SET(_extra_code_file "${CMAKE_CURRENT_SOURCE_DIR}/${def_file}_extra.cxx") SET(_library_name "${prefix}${def_file}") ## -- Add extra code, if any SET(_all_code_files ${_code_file}) IF(EXISTS ${_extra_code_file}) SET(_all_code_files ${_all_code_files} ${_extra_code_file}) ENDIF(EXISTS ${_extra_code_file}) ## -- Command to write source code ADD_CUSTOM_COMMAND( OUTPUT ${_header_file} ${_code_file} DEPENDS ${cpPlugins_CreateInstances_APP} ${_def_canonical_file} COMMAND ${cpPlugins_CreateInstances_APP} ${_def_canonical_file} ${_library_name} ${CMAKE_CURRENT_BINARY_DIR} ) ## -- Create library cpPlugins_ManageLibrary( ${_library_name} SHARED "${_all_code_files}" "" "" "${version}" "${short_version}" ${ARGN} ) ENDFUNCTION() ## ==================================== ## == Function to wrap plugins hosts == ## ==================================== FUNCTION(cpPlugins_WrapPlugins source_dir version short_version prefix) ## -- Some configuration values SET(_source_dir ${CMAKE_CURRENT_SOURCE_DIR}/${source_dir}) SET(_binary_dir ${CMAKE_CURRENT_BINARY_DIR}/${source_dir}) SET(_lib_name ${prefix}${source_dir}) ## -- Get source code FILE(GLOB_RECURSE _hdr_h "${_source_dir}/*.h") FILE(GLOB_RECURSE _hdr_hxx "${_source_dir}/*.hxx") FILE(GLOB_RECURSE _hdr_hpp "${_source_dir}/*.hpp") FILE(GLOB_RECURSE _src_c "${_source_dir}/*.c") FILE(GLOB_RECURSE _src_cxx "${_source_dir}/*.cxx") FILE(GLOB_RECURSE _src_cpp "${_source_dir}/*.cpp") FILE(GLOB_RECURSE _qt_ui "${_source_dir}/*.ui") ## -- Identify sources to wrap SET(_hdr_to_wrap) FOREACH(_h ${_hdr_h}) FILE(READ ${_h} _txt) STRING(FIND "${_txt}" "cpPluginsObject;" _res) IF(NOT ${_res} EQUAL -1) LIST(APPEND _hdr_to_wrap ${_h}) ENDIF(NOT ${_res} EQUAL -1) ENDFOREACH(_h) ## -- Integrate all source files SET(_all_src ${_src_c} ${_src_cpp} ${_src_cxx}) SET(_all_hdr ${_hdr_h} ${_hdr_hpp} ${_hdr_hxx}) ## -- Wrap plugins IF(_hdr_to_wrap) SET(_host ${_binary_dir}/${_lib_name}_host.cxx) ADD_CUSTOM_COMMAND( OUTPUT ${_host} DEPENDS ${cpPlugins_HostCreator_APP} ${_hdr_to_wrap} COMMAND ${cpPlugins_HostCreator_APP} ${_lib_name} ${_host} ${_hdr_to_wrap} ) SET(_all_src ${_all_src} ${_host}) ENDIF(_hdr_to_wrap) ## -- Ok, build library IF(_all_src) cpPlugins_ManageLibrary( ${_lib_name} SHARED "${_all_src}" "${_all_hdr}" "${_qt_ui}" "${version}" "${short_version}" ${ARGN} ) ELSE(_all_src) MESSAGE(FATAL_ERROR "No source code found to build \"${_lib_name}\"") ENDIF(_all_src) ENDFUNCTION() ## ====================================== ## == Function to build an application == ## ====================================== FUNCTION(cpPlugins_BuildAppFromDirectory directory) ## -- Some configuration values FILE(TO_CMAKE_PATH ${directory} _src_dir) STRING(REPLACE "${PROJECT_SOURCE_DIR}/" "" _bin_dir ${_src_dir}) SET(_bin_dir "${PROJECT_BINARY_DIR}/${_bin_dir}") GET_FILENAME_COMPONENT(_app_name ${_src_dir} NAME) SET(_all_sources_extensions c cpp cxx) SET(_all_headers_extensions h hpp hxx) SET(_all_qt_ui_extensions ui) SET(_all_dirs ${_src_dir} ${_bin_dir}) SET(_all_sources) SET(_all_headers) SET(_all_qt_ui) ## -- Compilation option OPTION(BUILD_${_app_name} "Build \"${_app_name}\" application" OFF) ## -- Glob source code FOREACH(_d ${_all_dirs}) FOREACH(_e ${_all_sources_extensions}) FILE(GLOB_RECURSE _f "${_d}/*.${_e}") SET(_all_sources ${_all_sources} ${_f}) ENDFOREACH(_e) FOREACH(_e ${_all_headers_extensions}) FILE(GLOB_RECURSE _f "${_d}/*.${_e}") SET(_all_headers ${_all_headers} ${_f}) ENDFOREACH(_e) FOREACH(_e ${_all_qt_ui_extensions}) FILE(GLOB_RECURSE _f "${_d}/*.${_e}") SET(_all_qt_ui ${_all_qt_ui} ${_f}) ENDFOREACH(_e) ENDFOREACH(_d) ## -- Guess what headers sould be qt-moc'ed FOREACH(_h ${_all_headers}) FILE(READ ${_h} _txt) STRING(FIND "${_txt}" "Q_OBJECT" _r) IF(NOT ${_r} EQUAL -1) SET(_s) QT4_WRAP_CPP(_s ${_h}) SET(_all_sources ${_all_sources} ${_s}) ENDIF(NOT ${_r} EQUAL -1) ENDFOREACH(_h) ## -- Guess what qt-ui's sould be qt-uic'ed ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change the ## -- output file FOREACH(_ui ${_all_qt_ui}) GET_FILENAME_COMPONENT(_r_ui ${_ui} NAME_WE) SET(_o_ui ${_bin_dir}/ui_${_r_ui}.h) ADD_CUSTOM_COMMAND( OUTPUT ${_o_ui} COMMAND Qt4::uic ARGS -o ${_o_ui} ${_ui} MAIN_DEPENDENCY ${_ui} VERBATIM ) SET(_all_sources ${_all_sources} ${_o_ui}) SET(_all_headers ${_all_headers} ${_o_ui}) ENDFOREACH(_ui) ## -- Ok, compile application IF(_all_sources) ADD_EXECUTABLE(${_app_name} ${_all_sources}) TARGET_LINK_LIBRARIES(${_app_name} ${ARGN}) ELSE(_all_sources) MESSAGE(FATAL_ERROR "No source code found to build \"${_app_name}\"") ENDIF(_all_sources) ENDFUNCTION() ## eof - $RCSfile$