]> Creatis software - bbtk.git/blobdiff - kernel/cmake/CMakeCreateFindPackage.cmake
Install Mechanism
[bbtk.git] / kernel / cmake / CMakeCreateFindPackage.cmake
diff --git a/kernel/cmake/CMakeCreateFindPackage.cmake b/kernel/cmake/CMakeCreateFindPackage.cmake
new file mode 100644 (file)
index 0000000..ca33a0c
--- /dev/null
@@ -0,0 +1,254 @@
+#-----------------------------------------------------------------------------
+# Macro CREATE_FIND_PACKAGE
+# Creates and install the cmake files which allow 
+# to find a library by the cmake command FIND_PACKAGE.
+#
+# Inputs :
+# --------
+#  LIBRARY_NAME : name of the library to find 
+#
+# The following variables **MUST** have been set previously :
+#
+# * ${LIBRARY_NAME}_BUILD_TREE_RELATIVE_INCLUDE_PATHS
+#    The list of include paths 
+#    when someone uses a *BUILD TREE* version of ${LIBRARY_NAME}.
+#    NB : 
+#     THE PATHS *MUST BE RELATIVE* TO THE ROOT DIR OF THE PROJECT **SOURCES** !
+#    Assume your project architecture is :
+#     install/ : directory in which CREATE_FIND_PACKAGE is invoked
+#     src/part1/include/ : first include dir
+#     src/part2/include/ : second include dir
+#    Then you should set the var with :
+#    SET(${LIBRARY_NAME}_BUILD_TREE_RELATIVE_INCLUDE_PATHS
+#     src/part1/include
+#     src/part2/include )
+#    Which will result in actual include paths :
+#     ${PROJECT_SOURCE_DIR}/src/part1/include;
+#     ${PROJECT_SOURCE_DIR}/src/part2/include
+# * ${LIBRARY_NAME}_BUILD_TREE_RELATIVE_LIBRARY_PATHS
+#    Like the previous var but for the library paths.
+#    NB : 
+#     THE PATHS *MUST BE RELATIVE* TO THE ROOT DIR OF THE **BUILD TREE** 
+#     THAT IS POINT TO THE FOLDERS WHERE THE LIBS WILL BE BUILD
+#    Assume that your project architecture is :
+#     src/part1/src/ : first source dir, in which the lib 'part1' is built
+#     src/part2/src/ : first source dir, in which the lib 'part2' is built
+#    Then you should set the var with 
+#    SET(${LIBRARY_NAME}_BUILD_TREE_RELATIVE_LIBRARY_PATHS
+#     src/part1/src
+#     src/part2/src
+#     )
+#    Which will result in actual library paths :
+#     ${PROJECT_BINARY_DIR}/src/part1/src
+#     ${PROJECT_BINARY_DIR}/src/part2/src
+# * ${LIBRARY_NAME}_INSTALL_TREE_RELATIVE_INCLUDE_PATHS
+#    The list of include paths 
+#    when someone uses an *INSTALLED* version of ${LIBRARY_NAME} 
+#    The paths *MUST BE RELATIVE* to INSTALL_PREFIX
+#  #    A typical example is "include/${LIBRARY_NAME}"
+# * ${LIBRARY_NAME}_INSTALL_TREE_RELATIVE_LIBRARY_PATHS
+#    Like the previous var but for library paths.
+#    A typical example is ".."
+# * ${LIBRARY_NAME}_LIBRARIES
+#    The list of libraries to link against when using ${LIBRARY_NAME}
+#
+# The following variables can be set optionally :
+#
+# * ${LIBRARY_NAME}_REQUIRED_C_FLAGS
+# * ${LIBRARY_NAME}_REQUIRED_CXX_FLAGS
+# * ${LIBRARY_NAME}_REQUIRED_LINK_FLAGS
+# * ${LIBRARY_NAME}_MAJOR_VERSION
+# * ${LIBRARY_NAME}_MINOR_VERSION
+# * ${LIBRARY_NAME}_BUILD_VERSION
+# * ${LIBRARY_NAME}_INSTALL_FOLDER : if set then install the stuff 
+#   in INSTALL_PREFIX/lib/${LIBRARY_NAME}_INSTALL_FOLDER 
+#   instead of INSTALL_PREFIX/lib/${LIBRARY_NAME}
+#
+# 
+# To provide a user defined 
+# couple of Config/Use file (in addition to the standard one) use :
+#  SET( ${LIBRARY_NAME}_HAS_ADDITIONAL_CONFIG_FILE  TRUE )
+# and store the *ABSOLUTE* paths to the additional files in the vars :
+#  ${LIBRARY_NAME}_ADDITIONAL_CONFIG_FILE
+#  ${LIBRARY_NAME}_ADDITIONAL_USE_FILE
+# (e.g. ${CMAKE_CURRENT_SOURCE_DIR}/MyConfig.cmake)
+#
+# Outputs :
+# --------
+# At cmake run-time, the macro creates the following files 
+# in the current dir of the build tree (where the macro is invoked) :
+#  Use${LIBRARY_NAME}.cmake
+#  ${LIBRARY_NAME}Config.cmake
+#  ${LIBRARY_NAME}BuildSettings.cmake
+# And if the vars ${LIBRARY_NAME}_ADDITIONAL_CONFIG_FILE and
+# ${LIBRARY_NAME}_ADDITIONAL_USE_FILE are set, it also creates :
+#  Additional${LIBRARY_NAME}Config.cmake
+#  AdditionalUse${LIBRARY_NAME}.cmake
+# 
+# At install-time, the same files are installed 
+# in INSTALL_PREFIX/lib/${LIBRARY_NAME}
+# and the file :
+#  Find${LIBRARY_NAME}.cmake
+# is installed in ${CMAKE_ROOT}/Modules/
+#
+#
+#-----------------------------------------------------------------------------
+
+MACRO(CMAKE_CREATE_FIND_PACKAGE LIBRARY_NAME)
+
+  #---------------------------------------------------------------------------
+  # Sets the common values to build tree and install tree configs
+  SET(CFP_LIB_REQUIRED_C_FLAGS    ${${LIBRARY_NAME}_REQUIRED_C_FLAGS})
+  SET(CFP_LIB_REQUIRED_CXX_FLAGS  ${${LIBRARY_NAME}_REQUIRED_CXX_FLAGS})
+  SET(CFP_LIB_REQUIRED_LINK_FLAGS ${${LIBRARY_NAME}_REQUIRED_LINK_FLAGS})
+  SET(CFP_LIB_MAJOR_VERSION       ${${LIBRARY_NAME}_MAJOR_VERSION})
+  SET(CFP_LIB_MINOR_VERSION       ${${LIBRARY_NAME}_MINOR_VERSION})
+  SET(CFP_LIB_BUILD_VERSION       ${${LIBRARY_NAME}_BUILD_VERSION})
+  SET(CFP_LIB_VERSION             
+    ${CFP_LIB_MAJOR_VERSION}.${CFP_LIB_MINOR_VERSION}.${CFP_LIB_BUILD_VERSION})
+  SET(CFP_LIB_LIBRARIES ${${LIBRARY_NAME}_LIBRARIES})
+  IF (${LIBRARY_NAME}_HAS_ADDITIONAL_CONFIG_FILE)
+    SET(CFP_LIB_HAS_ADDITIONAL_CONFIG_FILE TRUE)
+  ELSE (${LIBRARY_NAME}_HAS_ADDITIONAL_CONFIG_FILE)
+    SET(CFP_LIB_HAS_ADDITIONAL_CONFIG_FILE FALSE)
+  ENDIF (${LIBRARY_NAME}_HAS_ADDITIONAL_CONFIG_FILE)
+  #---------------------------------------------------------------------------
+
+
+  #---------------------------------------------------------------------------
+  #-- BUILD TREE configuration 
+  SET(CFP_BUILD_TREE_CONFIGURATION TRUE)
+  # UseLIBRARY_NAME.cmake 
+  CONFIGURE_FILE(
+    ${CMakeCreateFindPackage_DIR}/CMakeCreateFindPackage_UseLibrary.cmake.in
+    ${PROJECT_BINARY_DIR}/Use${LIBRARY_NAME}.cmake
+    @ONLY IMMEDIATE
+    )
+  # LIBRARY_NAMEConfig.cmake 
+  SET(CFP_LIB_RELATIVE_INCLUDE_PATHS 
+    ${${LIBRARY_NAME}_BUILD_TREE_RELATIVE_INCLUDE_PATHS})
+  SET(CFP_LIB_RELATIVE_LIBRARY_PATHS 
+    ${${LIBRARY_NAME}_BUILD_TREE_RELATIVE_LIBRARY_PATHS})
+  CONFIGURE_FILE(
+    ${CMakeCreateFindPackage_DIR}/CMakeCreateFindPackage_LibraryConfig.cmake.in
+    ${PROJECT_BINARY_DIR}/${LIBRARY_NAME}Config.cmake
+    @ONLY IMMEDIATE
+    )
+  # LIBRARY_NAMEBuildSettings.cmake :
+  # Save the compiler settings so another project can import them.
+  INCLUDE(${CMAKE_ROOT}/Modules/CMakeExportBuildSettings.cmake)
+  CMAKE_EXPORT_BUILD_SETTINGS(${PROJECT_BINARY_DIR}/${LIBRARY_NAME}BuildSettings.cmake)
+  # Additional Config and Use files
+  IF(CFP_LIB_HAS_ADDITIONAL_CONFIG_FILE)
+    CONFIGURE_FILE(
+      ${${LIBRARY_NAME}_ADDITIONAL_CONFIG_FILE}
+      ${PROJECT_BINARY_DIR}/Additional${LIBRARY_NAME}Config.cmake
+      @ONLY IMMEDIATE
+      )
+    CONFIGURE_FILE(
+      ${${LIBRARY_NAME}_ADDITIONAL_USE_FILE}
+      ${PROJECT_BINARY_DIR}/AdditionalUse${LIBRARY_NAME}.cmake
+      @ONLY IMMEDIATE
+      )
+  ENDIF(CFP_LIB_HAS_ADDITIONAL_CONFIG_FILE)
+  #---------------------------------------------------------------------------
+  
+
+  #---------------------------------------------------------------------------
+  #-- INSTALL TREE configuration 
+  SET(CFP_BUILD_TREE_CONFIGURATION FALSE)
+  # Create work directory to put the configured files because 
+  # if the user invoked the macro at the root of the build tree the files 
+  # would overwrite those configured for the build tree
+  SET(CFP_WORK_DIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeCreateFindPackage_stuff)
+  IF(NOT IS_DIRECTORY ${CFP_WORK_DIR})
+    FILE(MAKE_DIRECTORY ${CFP_WORK_DIR})
+  ENDIF(NOT IS_DIRECTORY ${CFP_WORK_DIR})
+  
+  #----------------------------------------------------------------------------
+  #INSTALLATION PATH
+  IF(WIN32)
+    SET(INSTALL_PATH .)
+  ELSE(WIN32)
+    IF(${LIBRARY_NAME}_INSTALL_FOLDER)
+      SET(INSTALL_PATH lib/${${LIBRARY_NAME}_INSTALL_FOLDER})
+    ELSE(${LIBRARY_NAME}_INSTALL_FOLDER)
+      SET(INSTALL_PATH lib/${LIBRARY_NAME})
+    ENDIF(${LIBRARY_NAME}_INSTALL_FOLDER)
+  ENDIF(WIN32)
+
+
+  # UseLIBRARY_NAME.cmake 
+  CONFIGURE_FILE(
+    ${CMakeCreateFindPackage_DIR}/CMakeCreateFindPackage_UseLibrary.cmake.in
+    ${CFP_WORK_DIR}/Use${LIBRARY_NAME}.cmake
+    @ONLY IMMEDIATE
+    )
+  INSTALL(
+    FILES 
+    ${CFP_WORK_DIR}/Use${LIBRARY_NAME}.cmake
+    DESTINATION ${INSTALL_PATH}
+    )
+  # LIBRARY_NAMEConfig.cmake 
+  SET(CFP_LIB_RELATIVE_INCLUDE_PATHS 
+    ${${LIBRARY_NAME}_INSTALL_TREE_RELATIVE_INCLUDE_PATHS})
+  SET(CFP_LIB_RELATIVE_LIBRARY_PATHS 
+    ${${LIBRARY_NAME}_INSTALL_TREE_RELATIVE_LIBRARY_PATHS})
+  CONFIGURE_FILE(
+    ${CMakeCreateFindPackage_DIR}/CMakeCreateFindPackage_LibraryConfig.cmake.in
+    ${CFP_WORK_DIR}/${LIBRARY_NAME}Config.cmake
+    @ONLY IMMEDIATE
+    )
+  INSTALL(
+    FILES 
+    ${CFP_WORK_DIR}/${LIBRARY_NAME}Config.cmake
+    DESTINATION ${INSTALL_PATH}
+    )
+  # LIBRARY_NAMEBuildSettings.cmake :
+  CMAKE_EXPORT_BUILD_SETTINGS(${CFP_WORK_DIR}/${LIBRARY_NAME}BuildSettings.cmake)
+  INSTALL(
+    FILES 
+    ${CFP_WORK_DIR}/${LIBRARY_NAME}BuildSettings.cmake
+    DESTINATION  ${INSTALL_PATH}
+    )
+  # Additional Config and Use files
+  IF(CFP_LIB_HAS_ADDITIONAL_CONFIG_FILE)
+    CONFIGURE_FILE(
+      ${${LIBRARY_NAME}_ADDITIONAL_CONFIG_FILE}
+      ${CFP_WORK_DIR}/Additional${LIBRARY_NAME}Config.cmake
+      @ONLY IMMEDIATE
+      )
+    INSTALL(
+      FILES 
+      ${CFP_WORK_DIR}/Additional${LIBRARY_NAME}Config.cmake
+      DESTINATION ${INSTALL_PATH}
+      )
+    CONFIGURE_FILE(
+      ${${LIBRARY_NAME}_ADDITIONAL_USE_FILE}
+      ${CFP_WORK_DIR}/AdditionalUse${LIBRARY_NAME}.cmake
+      @ONLY IMMEDIATE
+      )
+    INSTALL(
+      FILES 
+      ${CFP_WORK_DIR}/AdditionalUse${LIBRARY_NAME}.cmake
+      DESTINATION  ${INSTALL_PATH}
+      )
+  ENDIF(CFP_LIB_HAS_ADDITIONAL_CONFIG_FILE)
+  # Specific to install tree
+  # FindLIBRARY_NAME.cmake in CMake/Modules dir
+  CONFIGURE_FILE(
+    ${CMakeCreateFindPackage_DIR}/CMakeCreateFindPackage_FindLibrary.cmake.in
+    ${CFP_WORK_DIR}/Find${LIBRARY_NAME}.cmake
+    @ONLY IMMEDIATE
+    )
+  INSTALL( 
+    FILES ${CFP_WORK_DIR}/Find${LIBRARY_NAME}.cmake
+    DESTINATION ${CMAKE_ROOT}/Modules 
+    )
+  #---------------------------------------------------------------------------
+  
+
+
+
+ENDMACRO(CMAKE_CREATE_FIND_PACKAGE)
+#-----------------------------------------------------------------------------