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