X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fcmake%2FCMakeCreateFindPackage.cmake;fp=kernel%2Fcmake%2FCMakeCreateFindPackage.cmake;h=ca33a0c8a952eb033430f1190fe68446f0c0c35e;hb=8ab3078737deb219443554b0df6be43b3bd82d11;hp=0000000000000000000000000000000000000000;hpb=f1575da9353486cb8dcc2cf260201334fbba3599;p=bbtk.git diff --git a/kernel/cmake/CMakeCreateFindPackage.cmake b/kernel/cmake/CMakeCreateFindPackage.cmake new file mode 100644 index 0000000..ca33a0c --- /dev/null +++ b/kernel/cmake/CMakeCreateFindPackage.cmake @@ -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) +#-----------------------------------------------------------------------------