]> Creatis software - cpPlugins.git/blobdiff - cmake/cpPlgFunctions.cmake
Moved to version 1.0
[cpPlugins.git] / cmake / cpPlgFunctions.cmake
diff --git a/cmake/cpPlgFunctions.cmake b/cmake/cpPlgFunctions.cmake
new file mode 100644 (file)
index 0000000..e0ff9f8
--- /dev/null
@@ -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$