BASIS  r3148
SlicerTools.cmake
Go to the documentation of this file.
00001 ##############################################################################
00002 # @file  SlicerTools.cmake
00003 # @brief Definition of tools for Slicer Extensions.
00004 #
00005 # Copyright (c) 2012 University of Pennsylvania. All rights reserved.<br />
00006 # See https://www.cbica.upenn.edu/sbia/software/license.html or COPYING file.
00007 #
00008 # Contact: SBIA Group <sbia-software at uphs.upenn.edu>
00009 ##############################################################################
00010 
00011 # ============================================================================
00012 # meta-data
00013 # ============================================================================
00014 
00015 # ----------------------------------------------------------------------------
00016 ## @brief Define project meta-data of Slicer module.
00017 #
00018 # This macro should be used instead of basis_project() for a Slicer module.
00019 # It extends the considered meta-data by some additional variables that
00020 # have to be set for a Slicer module and identifies this project as a Slicer
00021 # module.
00022 #
00023 # @ingroup CMakeAPI
00024 macro (basis_slicer_module)
00025   CMAKE_PARSE_ARGUMENTS (
00026     PROJECT
00027       "${BASIS_METADATA_LIST_SWITCH}"
00028       "${BASIS_METADATA_LIST_SINGLE};${BASIS_SLICER_METADATA_LIST_SINGLE}"
00029       "${BASIS_METADATA_LIST_MULTI};${BASIS_SLICER_METADATA_LIST_MULTI}"
00030     ${ARGN}
00031   )
00032   foreach (_L IN LISTS BASIS_SLICER_METADATA_LIST_MULTI)
00033     if (_L MATCHES "^(CATEGORY|CONTRIBUTORS)$")
00034       basis_list_to_delimited_string (PROJECT_${_L} ", " ${PROJECT_${_L}})
00035     else ()
00036       basis_list_to_string (PROJECT_${_L} ${PROJECT_${_L}})
00037     endif ()
00038   endforeach ()
00039   set (PROJECT_IS_SLICER_MODULE TRUE)
00040   basis_project_check_metadata ()
00041 endmacro ()
00042 
00043 
00044 ## @addtogroup CMakeUtilities
00045 # @{
00046 
00047 
00048 # ============================================================================
00049 # initialization
00050 # ============================================================================
00051 
00052 # ----------------------------------------------------------------------------
00053 ## @brief Initialize slicer module meta-data.
00054 #
00055 # At the moment, only one module, most often the top-level project can be a
00056 # Slicer module, i.e., call basis_slicer_module() either in the
00057 # BasisProject.cmake file of the top-level project or in the corresponding file
00058 # of at most one of the project modules.
00059 macro (basis_slicer_module_initialize)
00060   if (NOT PROJECT_IS_MODULE)
00061     set (_N 0)
00062     foreach (_M IN LISTS PROJECT_MODULES_ENABLED)
00063       if (${_M}_IS_SLICER_MODULE)
00064         math (EXPR _N "${_N} + 1")
00065       endif ()
00066     endforeach ()
00067     if (PROJECT_IS_SLICER_MODULE)
00068       if (_N GREATER 0)
00069         message (FATAL_ERROR "BASIS does not support projects with multiple Slicer modules!")
00070       endif ()
00071       set (_FIND_SLICER TRUE)
00072     elseif (_N GREATER 0)
00073       if (_N GREATER 1)
00074         message (FATAL_ERROR "BASIS does not support projects with multiple Slicer modules!")
00075       endif ()
00076       set (_FIND_SLICER TRUE)
00077     else ()
00078       set (_FIND_SLICER FALSE)
00079     endif ()
00080     # convert PROJECT_* or <Module>_* to MODULE_* variables
00081     if (PROJECT_IS_SLICER_MODULE)
00082       foreach (_D IN LISTS BASIS_SLICER_METADATA_LIST)
00083         if (DEFINED PROJECT_${_D})
00084           set (MODULE_${_D} "${PROJECT_${_D}}")
00085         endif ()
00086       endforeach ()
00087     else ()
00088       foreach (_M IN LISTS PROJECT_MODULES_ENABLED)
00089         if (${_M}_IS_SLICER_MODULE)
00090           foreach (_D IN LISTS BASIS_SLICER_METADATA_LIST)
00091             if (DEFINED ${_M}_${_D})
00092               set (MODULE_${_D} "${${_M}_${_D}}")
00093             endif ()
00094           endforeach ()
00095           break ()
00096         endif ()
00097       endforeach ()
00098     endif ()
00099     # find Slicer package
00100     if (_FIND_SLICER)
00101       # set metadata
00102       set (MODULE_DESCRIPTION   "${PROJECT_DESCRIPTION}")
00103       set (MODULE_NAME          "${PROJECT_NAME}")
00104       set (MODULE_README_FILE   "${PROJECT_SOURCE_DIR}/README.txt")
00105       set (MODULE_LICENSE_FILE  "${PROJECT_SOURCE_DIR}/COPYING.txt")
00106       set (MODULE_MAJOR_VERSION "${PROJECT_VERSION_MAJOR}")
00107       set (MODULE_MINOR_VERSION "${PROJECT_VERSION_MINOR}")
00108       set (MODULE_PATCH_VERSION "${PROJECT_VERSION_PATCH}")
00109       # skip project() command
00110       set (Slicer_SKIP_PROJECT_COMMAND        TRUE)
00111       set (Slicer_SKIP_USE_FILE_INCLUDE_CHECK TRUE)
00112       # work-around for bug 1901 in Slicer 4.1.0
00113       set (Slicer_SKIP_SlicerBlockModuleToExtensionMetadata TRUE)
00114       basis_slicer_module_to_extension_metadata ()
00115       # find Slicer
00116       basis_find_package (Slicer REQUIRED)
00117       basis_use_package  (Slicer REQUIRED)
00118     endif ()
00119     unset (_M)
00120     unset (_N)
00121     unset (_FIND_SLICER)
00122   endif ()
00123 endmacro ()
00124 
00125 # ============================================================================
00126 # auxiliary functions
00127 # ============================================================================
00128 
00129 # ----------------------------------------------------------------------------
00130 ## @brief Copy MODULE_* metadata to EXTENSION_* metadata of Slicer Extension.
00131 #
00132 # This function is required to work-around bug 1901 in Slicer 4.1.0. It basically
00133 # implements what the SlicerBlockModuleToExtensionMetadata.cmake module which
00134 # can be found in the Extensions/CMake/ directory of the Slicer 4 source tree
00135 # is implementing. The list of metadata has been copied from this particular
00136 # CMake module of the 4.1.0 release of Slicer.
00137 #
00138 # @sa http://www.na-mic.org/Bug/view.php?id=1901
00139 function (basis_slicer_module_to_extension_metadata)
00140   foreach (varname IN ITEMS ${BASIS_SLICER_METADATA_LIST} DESCRIPTION)
00141     if (DEFINED MODULE_${varname} AND NOT DEFINED EXTENSION_${varname})
00142       set (EXTENSION_${varname} ${MODULE_${varname}} PARENT_SCOPE)
00143     endif ()
00144   endforeach ()
00145 endfunction ()
00146 
00147 
00148 ## @}
00149 # Doxygen group CMakeUtilities