BASIS  r3148
GenerateConfig.cmake
Go to the documentation of this file.
00001 ##############################################################################
00002 # @file  GenerateConfig.cmake
00003 # @brief Generates package configuration files.
00004 #
00005 # This CMake script configures the \<package\>Config.cmake et al. files,
00006 # once for the build tree and once for the install tree. Variables with a
00007 # _CONFIG suffix are replaced in the default template file by either the
00008 # value for the build or the install tree, respectively.
00009 #
00010 # If present, this script includes the @c PROJECT_CONFIG_DIR/ConfigBuild.cmake
00011 # and/or @c PROJECT_CONFIG_DIR/ConfigInstall.cmake file before configuring the
00012 # Config.cmake.in template. If a file @c PROJECT_CONFIG_DIR/Config.cmake.in
00013 # exists, it is used as template. Otherwise, the default template file is used.
00014 #
00015 # Similarly, if the file @c PROJECT_CONFIG_DIR/ConfigVersion.cmake.in exists,
00016 # it is used as template for the \<package\>ConfigVersion.cmake file. The same
00017 # applies to ConfigUse.cmake.in.
00018 #
00019 # Copyright (c) 2011, 2012 University of Pennsylvania. All rights reserved.<br />
00020 # See https://www.cbica.upenn.edu/sbia/software/license.html or COPYING file.
00021 #
00022 # Contact: SBIA Group <sbia-software at uphs.upenn.edu>
00023 #
00024 # @ingroup CMakeTools
00025 ##############################################################################
00026 
00027 # ============================================================================
00028 # names of output files
00029 # ============================================================================
00030 
00031 # Attention: This has to be done before configuring any files such that these
00032 #            variables can be used by the template files.
00033 
00034 ## @addtogroup CMakeUtilities
00035 #  @{
00036 
00037 
00038 ## @brief Package name.
00039 set (CONFIG_PREFIX "${PROJECT_PACKAGE_CONFIG_PREFIX}")
00040 ## @brief Name of the CMake package configuration file.
00041 set (CONFIG_FILE "${CONFIG_PREFIX}Config.cmake")
00042 ## @brief Name of the CMake package version file.
00043 set (VERSION_FILE "${CONFIG_PREFIX}ConfigVersion.cmake")
00044 ## @brief Name of the CMake package use file.
00045 set (USE_FILE "${CONFIG_PREFIX}Use.cmake")
00046 ## @brief Name of the CMake target exports file.
00047 set (EXPORTS_FILE "${CONFIG_PREFIX}Exports.cmake")
00048 ## @brief Name of the CMake target exports file for custom targets.
00049 set (CUSTOM_EXPORTS_FILE "${CONFIG_PREFIX}CustomExports.cmake")
00050 
00051 
00052 ## @}
00053 # end of Doxygen group
00054 
00055 # ============================================================================
00056 # export build targets
00057 # ============================================================================
00058 
00059 basis_export_targets (
00060   FILE        "${EXPORTS_FILE}"
00061   CUSTOM_FILE "${CUSTOM_EXPORTS_FILE}"
00062 )
00063 
00064 # ============================================================================
00065 # namespace
00066 # ============================================================================
00067 
00068 # code used at top of packing configuration and use files to set package
00069 # namespace prefix used for configuration variables
00070 if (PROJECT_IS_MODULE)
00071   set (BASIS_NS "${PROJECT_NAME}")
00072 else ()
00073   set (BASIS_NS "${PROJECT_PACKAGE}")
00074 endif ()
00075 
00076 set (BASIS_NS
00077 "# prefix used for variable names
00078 set (NS \"${BASIS_NS}_\")
00079 
00080 # allow caller to change namespace - used by projects with modules
00081 if (\${NS}CONFIG_PREFIX)
00082   set (NS \"\${\${NS}CONFIG_PREFIX}\")
00083 endif ()"
00084 )
00085 
00086 # ============================================================================
00087 # project configuration file
00088 # ============================================================================
00089 
00090 # ----------------------------------------------------------------------------
00091 # choose template
00092 
00093 if (EXISTS "${PROJECT_CONFIG_DIR}/Config.cmake.in")
00094   set (TEMPLATE "${PROJECT_CONFIG_DIR}/Config.cmake.in")
00095 elseif (PROJECT_IS_MODULE)
00096   set (TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/ModuleConfig.cmake.in")
00097 else ()
00098   set (TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/Config.cmake.in")
00099 endif ()
00100 
00101 # ----------------------------------------------------------------------------
00102 # provide code of BASIS config file as variable
00103 
00104 if (NOT TEMPLATE MATCHES "^${CMAKE_CURRENT_LIST_DIR}/")
00105   if (PROJECT_IS_MODULE)
00106     file (READ "${CMAKE_CURRENT_LIST_DIR}/ModuleConfig.cmake.in" BASIS_TEMPLATE)
00107   else ()
00108     file (READ "${CMAKE_CURRENT_LIST_DIR}/Config.cmake.in"       BASIS_TEMPLATE)
00109   endif ()
00110   # remove file header
00111   string (REGEX REPLACE "^########.*########" "" BASIS_TEMPLATE "${BASIS_TEMPLATE}")
00112   string (STRIP "${BASIS_TEMPLATE}" BASIS_TEMPLATE)
00113 else ()
00114   set (BASIS_TEMPLATE "")
00115 endif ()
00116 
00117 # ----------------------------------------------------------------------------
00118 # build tree related configuration
00119 
00120 set (BUILD_CONFIG_SETTINGS 1)
00121 include ("${CMAKE_CURRENT_LIST_DIR}/BasisConfigSettings.cmake")
00122 include ("${PROJECT_CONFIG_DIR}/ConfigSettings.cmake" OPTIONAL)
00123 
00124 # ----------------------------------------------------------------------------
00125 # configure project configuration file for build tree
00126 
00127 string (CONFIGURE "${BASIS_TEMPLATE}" BASIS_CONFIG @ONLY)
00128 configure_file ("${TEMPLATE}" "${PROJECT_BINARY_DIR}/${CONFIG_FILE}" @ONLY)
00129 
00130 # ----------------------------------------------------------------------------
00131 # install tree related configuration
00132 
00133 set (BUILD_CONFIG_SETTINGS 0)
00134 include ("${CMAKE_CURRENT_LIST_DIR}/BasisConfigSettings.cmake")
00135 include ("${PROJECT_CONFIG_DIR}/ConfigSettings.cmake" OPTIONAL)
00136 
00137 # ----------------------------------------------------------------------------
00138 # configure project configuration file for install tree
00139 
00140 string (CONFIGURE "${BASIS_TEMPLATE}" BASIS_CONFIG @ONLY)
00141 configure_file ("${TEMPLATE}" "${BINARY_CONFIG_DIR}/${CONFIG_FILE}" @ONLY)
00142 
00143 # ----------------------------------------------------------------------------
00144 # install project configuration file
00145 
00146 install (
00147   FILES       "${BINARY_CONFIG_DIR}/${CONFIG_FILE}"
00148   DESTINATION "${INSTALL_CONFIG_DIR}"
00149 )
00150 
00151 # ============================================================================
00152 # project version file
00153 # ============================================================================
00154 
00155 # ----------------------------------------------------------------------------
00156 # choose template
00157 
00158 if (EXISTS "${PROJECT_CONFIG_DIR}/ConfigVersion.cmake.in")
00159   set (TEMPLATE "${PROJECT_CONFIG_DIR}/ConfigVersion.cmake.in")
00160 else ()
00161   set (TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/ConfigVersion.cmake.in")
00162 endif ()
00163 
00164 # ----------------------------------------------------------------------------
00165 # configure project configuration version file
00166 
00167 configure_file ("${TEMPLATE}" "${PROJECT_BINARY_DIR}/${VERSION_FILE}" @ONLY)
00168 
00169 # ----------------------------------------------------------------------------
00170 # install project configuration version file
00171 
00172 install (
00173   FILES       "${PROJECT_BINARY_DIR}/${VERSION_FILE}"
00174   DESTINATION "${INSTALL_CONFIG_DIR}"
00175 )
00176 
00177 # ============================================================================
00178 # project use file
00179 # ============================================================================
00180 
00181 # ----------------------------------------------------------------------------
00182 # choose template
00183 
00184 if (EXISTS "${PROJECT_CONFIG_DIR}/ConfigUse.cmake.in")
00185   set (TEMPLATE "${PROJECT_CONFIG_DIR}/ConfigUse.cmake.in")
00186 elseif (EXISTS "${PROJECT_CONFIG_DIR}/Use.cmake.in")
00187   # backwards compatibility to version <= 0.1.8 of BASIS
00188   set (TEMPLATE "${PROJECT_CONFIG_DIR}/Use.cmake.in")
00189 elseif (PROJECT_IS_MODULE)
00190   set (TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/ModuleConfigUse.cmake.in")
00191 else ()
00192   set (TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/ConfigUse.cmake.in")
00193 endif ()
00194 
00195 # ----------------------------------------------------------------------------
00196 # provide code of BASIS use file as variable
00197 if (NOT TEMPLATE MATCHES "^${CMAKE_CURRENT_LIST_DIR}/")
00198   if (PROJECT_IS_MODULE)
00199     file (READ "${CMAKE_CURRENT_LIST_DIR}/ModuleConfigUse.cmake.in" BASIS_USE)
00200   else ()
00201     file (READ "${CMAKE_CURRENT_LIST_DIR}/ConfigUse.cmake.in"       BASIS_USE)
00202   endif ()
00203   # remove file header
00204   string (REGEX REPLACE "^########.*########" "" BASIS_USE "${BASIS_USE}")
00205   string (STRIP "${BASIS_USE}" BASIS_USE)
00206 else ()
00207   set (BASIS_USE "")
00208 endif ()
00209 
00210 # ----------------------------------------------------------------------------
00211 # configure project use file
00212 
00213 string (CONFIGURE "${BASIS_USE}" BASIS_USE @ONLY)
00214 configure_file ("${TEMPLATE}" "${PROJECT_BINARY_DIR}/${USE_FILE}" @ONLY)
00215 
00216 # ----------------------------------------------------------------------------
00217 # install project use file
00218 
00219 install (
00220   FILES       "${PROJECT_BINARY_DIR}/${USE_FILE}"
00221   DESTINATION "${INSTALL_CONFIG_DIR}"
00222 )
00223 
00224 unset (BASIS_NS)
00225 unset (BASIS_TEMPLATE)
00226 unset (BASIS_CONFIG)
00227 unset (BASIS_USE)