X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=cmake%2FcpPlgFunctions.cmake;fp=cmake%2FcpPlgFunctions.cmake;h=e0ff9f873e50fb4a70eba2c3ce84dc5093683f72;hb=2e142df11d6f312a2a2b5097b8da73571ed523e8;hp=0000000000000000000000000000000000000000;hpb=61b3659afe961ed248f30e26f9ca8f28fcfafddc;p=cpPlugins.git diff --git a/cmake/cpPlgFunctions.cmake b/cmake/cpPlgFunctions.cmake new file mode 100644 index 0000000..e0ff9f8 --- /dev/null +++ b/cmake/cpPlgFunctions.cmake @@ -0,0 +1,414 @@ +## ========================================================================= +## @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co) +## ========================================================================= + +## ------------------------------------------------------------------------- +function(cpPlugins_PrepareSources + inputs recurrent includes links src hdr dirs plg def + ) + +## -- Process targets include dirs +set(_dirs) +if(links) + foreach(_l ${links}) + if(TARGET ${_l}) + get_target_property( + _incl + ${_l} + INTERFACE_INCLUDE_DIRECTORIES + ) + if(_incl) + foreach(_d ${_incl}) + list(APPEND _dirs ${_d}) + endforeach(_d) + endif(_incl) + endif(TARGET ${_l}) + endforeach(_l) +endif(links) + +## -- Start by configuring _dflags for cpPlugins_MOC +set(_dflags) +get_property( + _global_dirs + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + PROPERTY INCLUDE_DIRECTORIES + ) +foreach(_i ${_global_dirs}) + set(_dflags ${_dflags} "-I${_i}") +endforeach() +foreach(_i ${includes}) + set(_dflags ${_dflags} "-I${_i}") +endforeach(_i) + +## -- Process all inputs +set(_files) +foreach(_s ${inputs}) + ## -- Canonicalize path + get_filename_component(_p "${_s}" ABSOLUTE) + + ## -- Check type of input + if(IS_DIRECTORY ${_p}) + list(APPEND _dirs ${_p}) + set(_dflags ${_dflags} "-I${_p}") + if(${recurrent}) + file(GLOB_RECURSE _f "${_p}/*") + else(${recurrent}) + file(GLOB _f "${_p}/*") + endif(${recurrent}) + foreach(_x ${_f}) + if(NOT IS_DIRECTORY ${_x}) + list(APPEND _files ${_x}) + endif(NOT IS_DIRECTORY ${_x}) + endforeach(_x) + else(IS_DIRECTORY ${_p}) + list(APPEND _files ${_p}) + endif(IS_DIRECTORY ${_p}) +endforeach(_s) + +## -- Process sources by extension +set(_def) +set(_cpp) +set(_hpp) +set(_qui) +set(_plg) + +foreach(_f ${_files}) + ## -- Separate filename from extension + string(REGEX REPLACE "\\.[^.]*$" "" _name ${_f}) + string(REPLACE ${_name} "" _ext ${_f}) + set(_out_name ${_name}) + set(_out_ext ${_ext}) + + if(_out_ext) + ## -- Process .in files + string(COMPARE EQUAL "${_ext}" ".in" _in_cmp) + if(_in_cmp) + string(REPLACE ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR} _out ${_name}) + configure_file(${_f} ${_out} @ONLY) + string(REGEX REPLACE "\\.[^.]*$" "" _out_name ${_out}) + string(REPLACE ${_out_name} "" _out_ext ${_out}) + get_filename_component(_dir ${_out} DIRECTORY) + list(APPEND _dirs ${_dir}) + endif(_in_cmp) + + ## -- Process .d files + string(COMPARE EQUAL "${_ext}" ".d" _d_cmp) + if(_d_cmp) + string(REPLACE ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR} _out ${_name}) + string(REGEX REPLACE "\\.[^.]*$" "" _out_name ${_out}) + string(REPLACE ${_out_name} "" _out_ext ${_out}) + get_filename_component(_dir ${_out} DIRECTORY) + list(APPEND _dirs ${_dir}) + add_custom_command( + OUTPUT ${_out} + COMMAND ${CMAKE_COMMAND} -E make_directory ${_dir} + COMMAND cpPlugins_MOC -i ${_f} -o ${_out} ${_dflags} + MAIN_DEPENDENCY ${_f} + DEPENDS cpPlugins_MOC + VERBATIM + ) + string(SUBSTRING ${_out_ext} 0 2 _ext_cmp) + endif(_d_cmp) + + ## -- Process .plg files + string(COMPARE EQUAL "${_ext}" ".plg" _plg_cmp) + if(_plg_cmp) + string(REPLACE ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR} _out ${_name}) + string(REGEX REPLACE "\\.[^.]*$" "" _out_name ${_out}) + string(REPLACE ${_out_name} "" _out_ext ${_out}) + set(_out "${_out}.cxx") + get_filename_component(_dir ${_out} DIRECTORY) + add_custom_command( + OUTPUT ${_out} + COMMAND ${CMAKE_COMMAND} -E make_directory ${_dir} + COMMAND cpPlugins_HostCreator -i ${_f} -o ${_out} + MAIN_DEPENDENCY ${_f} + DEPENDS cpPlugins_HostCreator + VERBATIM + ) + set(_out_ext ".cxx") + list(APPEND _plg ${_f}) + endif(_plg_cmp) + + ## -- Get real extension + string(SUBSTRING ${_out_ext} 0 2 _ext_cmp) + + ## -- Process .e files + string(COMPARE EQUAL "${_ext_cmp}" ".e" _e_cmp) + if(_e_cmp) + list(APPEND _def ${_out_name}${_out_ext}) + endif(_e_cmp) + + ## -- Process .c?? files + string(COMPARE EQUAL "${_ext_cmp}" ".c" _c_cmp) + if(_c_cmp) + list(APPEND _cpp ${_out_name}${_out_ext}) + endif(_c_cmp) + + ## -- Process .h?? files + string(COMPARE EQUAL "${_ext_cmp}" ".h" _h_cmp) + if(_h_cmp) + list(APPEND _hpp ${_out_name}${_out_ext}) + endif(_h_cmp) + + ## -- Process .ui files + string(COMPARE EQUAL "${_out_ext}" ".ui" _u_cmp) + if(_u_cmp) + list(APPEND _qui ${_out_name}${_out_ext}) + endif(_u_cmp) + endif(_out_ext) +endforeach(_f) + +## -- Process Qt ui files +list(LENGTH _qui _qui_len) +if(${_qui_len} GREATER 0) + qt5_wrap_ui(_qui_hpp ${_qui}) +endif(${_qui_len} GREATER 0) + +## -- Build output lists +if(_dirs) + list(REMOVE_DUPLICATES _dirs) +endif(_dirs) +set(${dirs} "${_dirs}" PARENT_SCOPE) +set(${src} "${_cpp}" PARENT_SCOPE) +set(${hdr} "${_hpp};${_qui_hpp}" PARENT_SCOPE) +set(${plg} "${_plg}" PARENT_SCOPE) +set(${def} "${_def}" PARENT_SCOPE) + +endfunction() + +## ------------------------------------------------------------------------- +function(cpPlugins_BuildLibrary lib typ) +set(options RECURRENT INSTALL_ALL INSTALL_BIN INSTALL_DEV) +set(multiValueArgs SOURCES VERSION LINKS INCLUDES) +cmake_parse_arguments( + cpPlugins_BuildLibrary + "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} + ) +string(TOLOWER ${lib} _lower_lib) + +## -- Some useful values +string(REPLACE ${PROJECT_SOURCE_DIR} "" _current_src_dir ${CMAKE_CURRENT_SOURCE_DIR}) +string(REPLACE ${PROJECT_SOURCE_DIR} "" _current_bin_dir ${CMAKE_CURRENT_BINARY_DIR}) + +## -- Process sources +cpPlugins_PrepareSources( + "${cpPlugins_BuildLibrary_SOURCES}" + "${cpPlugins_BuildLibrary_RECURRENT}" + "${cpPlugins_BuildLibrary_INCLUDES}" + "${cpPlugins_BuildLibrary_LINKS}" + _src _hdr _dirs _plg _def + ) + +## -- Configure installation directory +include_directories( + ${cpPlugins_BuildLibrary_INCLUDES} + ${_dirs} + ) + +## -- Installation rules +if(cpPlugins_BuildLibrary_INSTALL_ALL) + set(cpPlugins_BuildLibrary_INSTALL_BIN ${cpPlugins_BuildLibrary_INSTALL_ALL}) + set(cpPlugins_BuildLibrary_INSTALL_DEV ${cpPlugins_BuildLibrary_INSTALL_ALL}) +endif(cpPlugins_BuildLibrary_INSTALL_ALL) + +if(_src) + ## -- Process declared plugins + if(_plg) + set(_c ${PROJECT_BINARY_DIR}/${lib}.plg.cmake) + file(WRITE ${_c} "set(_classes)\n") + file(APPEND ${_c} "foreach(_p \${_plg})\n") + file(APPEND ${_c} " file(STRINGS \${_p} _c REGEX \"^\\\\s*@.*$\")\n") + file(APPEND ${_c} " foreach(_l \${_c})\n") + file(APPEND ${_c} " string(REPLACE \" \" \";\" _m \${_l})\n") + file(APPEND ${_c} " list(GET _m 0 _n)\n") + file(APPEND ${_c} " string(SUBSTRING \${_n} 1 -1 _d)\n") + file(APPEND ${_c} " set(_classes \"\${_classes}\\n\${_d}\")\n") + file(APPEND ${_c} " endforeach(_l)\n") + file(APPEND ${_c} "endforeach(_p)\n") + file(APPEND ${_c} "file(WRITE \${_out} \"\${_classes}\")\n") + add_custom_target( + ${lib}.plg ALL + COMMAND + ${CMAKE_COMMAND} + -D_out:STRING="${lib}.plg" + -D_plg::STRING="${_plg}" + -P ${_c} + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + DEPENDS "${_plg}" + SOURCES "${_plg}" + COMMENT "Building \"${lib}\" plugins interface" + ) + add_dependencies(${lib}.plg ${lib}) + if(cpPlugins_BuildLibrary_INSTALL_BIN) + install(FILES ${PROJECT_BINARY_DIR}/${lib}.plg DESTINATION "lib") + endif(cpPlugins_BuildLibrary_INSTALL_BIN) + endif(_plg) + + ## -- Real build + add_library(${lib} ${typ} ${_src} ${_hdr}) + generate_export_header( + ${lib} + EXPORT_FILE_NAME ${lib}_Export.h + ) + list(APPEND _hdr "${CMAKE_CURRENT_BINARY_DIR}/${lib}_Export.h") + + ## -- Put version strings + if(cpPlugins_BuildLibrary_VERSION) + list(GET cpPlugins_BuildLibrary_VERSION 0 _a) + list(GET cpPlugins_BuildLibrary_VERSION 1 _b) + list(GET cpPlugins_BuildLibrary_VERSION 2 _c) + set_property(TARGET ${lib} PROPERTY VERSION "${_a}.${_b}.${_c}") + set_property(TARGET ${lib} PROPERTY SOVERSION ${_a}) + set_property(TARGET ${lib} PROPERTY INTERFACE_${lib}_MAJOR_VERSION ${_a}) + set_property( + TARGET ${lib} APPEND PROPERTY COMPATIBLE_INTERFACE_STRING ${_a} + ) + endif(cpPlugins_BuildLibrary_VERSION) + + ## -- Link library + if(cpPlugins_BuildLibrary_LINKS) + target_link_libraries(${lib} PUBLIC ${cpPlugins_BuildLibrary_LINKS}) + endif(cpPlugins_BuildLibrary_LINKS) +endif(_src) + +## -- Installation rules: library +if(_src) + if(cpPlugins_BuildLibrary_INSTALL_BIN) + install( + TARGETS ${lib} + EXPORT "${targets_export_name}" + LIBRARY DESTINATION "lib" + ARCHIVE DESTINATION "lib" + RUNTIME DESTINATION "bin" + INCLUDES DESTINATION "${include_install_dir}" + ) + endif(cpPlugins_BuildLibrary_INSTALL_BIN) +endif(_src) + +## -- Installation rules: source files + +if(cpPlugins_BuildLibrary_INSTALL_DEV) + set(_install_hdr ${_hdr}) + if(_def) + list(APPEND _install_hdr ${_def}) + endif(_def) + set(_install_dirs) + + foreach(_h ${_install_hdr}) + string(REPLACE ${PROJECT_SOURCE_DIR} "" _h_name ${_h}) + string(COMPARE EQUAL "${_h_name}" "${_h}" _h_cmp) + if(_h_cmp) + string(REPLACE ${PROJECT_BINARY_DIR} "" _h_name ${_h}) + endif(_h_cmp) + string(REPLACE ${_current_bin_dir} "" _h_name ${_h_name}) + string(COMPARE EQUAL "${_h_name}" "${_h_name}" _h_cmp) + if(_h_cmp) + string(REPLACE ${_current_src_dir} "" _h_name ${_h_name}) + endif(_h_cmp) + get_filename_component(_h_dir ${_h_name} DIRECTORY) + string(SUBSTRING ${_h_dir} 0 1 _h_dir_first) + string(COMPARE EQUAL "${_h_dir_first}" "/" _h_cmp) + if(_h_cmp) + string(SUBSTRING ${_h_dir} 1 -1 _h_dir) + endif(_h_cmp) + install( + FILES "${_h}" + DESTINATION "include/${_h_dir}" + ) + endforeach(_h) +endif(cpPlugins_BuildLibrary_INSTALL_DEV) + +endfunction() + +## ------------------------------------------------------------------------- +function(cpPlugins_BuildExecutable app) +set(options RECURRENT INSTALL) +set(oneValueArgs) +set(multiValueArgs SOURCES LINKS INCLUDES) +cmake_parse_arguments( + cpPlugins_BuildExecutable + "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} + ) + +cpPlugins_PrepareSources( + "${cpPlugins_BuildExecutable_SOURCES}" + "${cpPlugins_BuildExecutable_RECURRENT}" + "${cpPlugins_BuildExecutable_INCLUDES}" + "${cpPlugins_BuildExecutable_LINKS}" + _src _hdr _dirs _plg _def + ) + +if(_src) + ## -- Real build + include_directories( + ${cpPlugins_BuildExecutable_INCLUDES} + ${_dirs} + ) + add_executable(${app} ${_src} ${_hdr}) + + ## -- Link library + if(cpPlugins_BuildExecutable_LINKS) + target_link_libraries(${app} PUBLIC ${cpPlugins_BuildExecutable_LINKS}) + endif(cpPlugins_BuildExecutable_LINKS) + + ## -- Installation rules + if(cpPlugins_BuildExecutable_INSTALL) + install( + TARGETS ${app} + EXPORT "${targets_export_name}" + LIBRARY DESTINATION "lib" + ARCHIVE DESTINATION "lib" + RUNTIME DESTINATION "bin" + INCLUDES DESTINATION "${include_install_dir}" + ) + endif(cpPlugins_BuildExecutable_INSTALL) +endif(_src) +endfunction() + +## ------------------------------------------------------------------------- +function(cpPlugins_BuildApplication app) +set(options RECURRENT INSTALL) +set(oneValueArgs) +set(multiValueArgs SOURCES LINKS INCLUDES) +cmake_parse_arguments( + cpPlugins_BuildApplication + "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} + ) + +cpPlugins_PrepareSources( + "${cpPlugins_BuildApplication_SOURCES}" + "${cpPlugins_BuildApplication_RECURRENT}" + "${cpPlugins_BuildApplication_INCLUDES}" + "${cpPlugins_BuildApplication_LINKS}" + _src _hdr _dirs _plg _def + ) + +if(_src) + ## -- Real build + include_directories( + ${cpPlugins_BuildApplication_INCLUDES} + ${_dirs} + ) + add_executable(${app} ${_src} ${_hdr}) + + ## -- Link library + if(cpPlugins_BuildApplication_LINKS) + target_link_libraries(${app} PUBLIC ${cpPlugins_BuildApplication_LINKS}) + endif(cpPlugins_BuildApplication_LINKS) + + ## -- Installation rules + if(cpPlugins_BuildApplication_INSTALL) + install( + TARGETS ${app} + EXPORT "${targets_export_name}" + LIBRARY DESTINATION "lib" + ARCHIVE DESTINATION "lib" + RUNTIME DESTINATION "bin" + INCLUDES DESTINATION "${include_install_dir}" + ) + endif(cpPlugins_BuildApplication_INSTALL) +endif(_src) +endfunction() + +## eof - $RCSfile$