--- /dev/null
+## =========================================================================
+## @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$