CMake/Modules/CMakeImportBuildSettings.cmake

236 lines
13 KiB
CMake

# - import build settings from another project
# CMAKE_IMPORT_BUILD_SETTINGS(SETTINGS_FILE) - macro defined to import the
# build settings from another project.
# SETTINGS_FILE - a file created by the other project's call to the
# CMAKE_EXPORT_BUILD_SETTINGS macro, see CMakeExportBuildSettings.
MACRO(CMAKE_IMPORT_BUILD_SETTINGS SETTINGS_FILE)
IF(${SETTINGS_FILE} MATCHES ".+")
# Load the settings.
INCLUDE(${SETTINGS_FILE})
# Check the CMake version that stored the settings.
IF(${CMAKE_BUILD_SETTING_CMAKE_MAJOR_VERSION}.${CMAKE_BUILD_SETTING_CMAKE_MINOR_VERSION}
GREATER ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
MESSAGE(SEND_ERROR
"${CMAKE_BUILD_SETTING_PROJECT_NAME} was built using CMake "
"${CMAKE_BUILD_SETTING_CMAKE_MAJOR_VERSION}.${CMAKE_BUILD_SETTING_CMAKE_MINOR_VERSION}, "
"but this is CMake${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}. "
"Please upgrade CMake to a more recent version.")
ENDIF(${CMAKE_BUILD_SETTING_CMAKE_MAJOR_VERSION}.${CMAKE_BUILD_SETTING_CMAKE_MINOR_VERSION}
GREATER ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
# Check the build tool.
SET(CMAKE_BUILD_TOOL1 "")
IF(CMAKE_BUILD_TOOL)
GET_FILENAME_COMPONENT (CMAKE_BUILD_TOOL1 ${CMAKE_BUILD_TOOL} NAME_WE)
STRING(TOLOWER ${CMAKE_BUILD_TOOL1} CMAKE_BUILD_TOOL1)
ENDIF(CMAKE_BUILD_TOOL)
SET(CMAKE_BUILD_TOOL2 "")
IF(CMAKE_BUILD_SETTING_BUILD_TOOL)
GET_FILENAME_COMPONENT (CMAKE_BUILD_TOOL2 ${CMAKE_BUILD_SETTING_BUILD_TOOL} NAME_WE)
STRING(TOLOWER ${CMAKE_BUILD_TOOL2} CMAKE_BUILD_TOOL2)
ENDIF(CMAKE_BUILD_SETTING_BUILD_TOOL)
STRING(COMPARE NOTEQUAL "x${CMAKE_BUILD_TOOL1}" "x${CMAKE_BUILD_TOOL2}"
CMAKE_BUILD_TOOL_MISMATCH)
IF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^msdev$")
SET(CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO 1)
ENDIF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^msdev$")
IF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^devenv$")
SET(CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO 1)
ENDIF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^devenv$")
# Check the C++ compiler setting. If it is empty, the imported
# project is not a C++ project, and doesn't need a matching compiler.
IF(CMAKE_BUILD_SETTING_CXX_COMPILER)
STRING(COMPARE NOTEQUAL
"x${CMAKE_CXX_COMPILER}" "x${CMAKE_BUILD_SETTING_CXX_COMPILER}"
CMAKE_CXX_COMPILER_MISMATCH)
ENDIF(CMAKE_BUILD_SETTING_CXX_COMPILER)
# Check the C build variation flags.
STRING(COMPARE NOTEQUAL
"x${CMAKE_C_FLAGS_DEBUG}" "x${CMAKE_BUILD_SETTING_C_FLAGS_DEBUG}"
CMAKE_C_FLAGS_DEBUG_MISMATCH)
STRING(COMPARE NOTEQUAL
"x${CMAKE_C_FLAGS_RELEASE}" "x${CMAKE_BUILD_SETTING_C_FLAGS_RELEASE}"
CMAKE_C_FLAGS_RELEASE_MISMATCH)
STRING(COMPARE NOTEQUAL
"x${CMAKE_C_FLAGS_MINSIZEREL}" "x${CMAKE_BUILD_SETTING_C_FLAGS_MINSIZEREL}"
CMAKE_C_FLAGS_MINSIZEREL_MISMATCH)
STRING(COMPARE NOTEQUAL
"x${CMAKE_C_FLAGS_RELWITHDEBINFO}" "x${CMAKE_BUILD_SETTING_C_FLAGS_RELWITHDEBINFO}"
CMAKE_C_FLAGS_RELWITHDEBINFO_MISMATCH)
# Check the C++ build variation flags.
STRING(COMPARE NOTEQUAL
"x${CMAKE_CXX_FLAGS_DEBUG}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_DEBUG}"
CMAKE_CXX_FLAGS_DEBUG_MISMATCH)
STRING(COMPARE NOTEQUAL
"x${CMAKE_CXX_FLAGS_RELEASE}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_RELEASE}"
CMAKE_CXX_FLAGS_RELEASE_MISMATCH)
STRING(COMPARE NOTEQUAL
"x${CMAKE_CXX_FLAGS_MINSIZEREL}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_MINSIZEREL}"
CMAKE_CXX_FLAGS_MINSIZEREL_MISMATCH)
STRING(COMPARE NOTEQUAL
"x${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_RELWITHDEBINFO}"
CMAKE_CXX_FLAGS_RELWITHDEBINFO_MISMATCH)
# Check the build type.
SET(CMAKE_BUILD_TYPE_MISMATCH 0)
IF(WIN32)
IF(NOT CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO)
STRING(COMPARE NOTEQUAL
"x${CMAKE_BUILD_TYPE}" "x${CMAKE_BUILD_SETTING_BUILD_TYPE}"
CMAKE_BUILD_TYPE_MISMATCH)
ENDIF(NOT CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO)
ENDIF(WIN32)
# Build tool must match on Windows.
IF(WIN32)
IF(CMAKE_BUILD_TOOL_MISMATCH)
MESSAGE(SEND_ERROR
"This project, ${PROJECT_NAME}, depends on the project "
"${CMAKE_BUILD_SETTING_PROJECT_NAME}. Unfortunately "
"${CMAKE_BUILD_SETTING_PROJECT_NAME} was built using "
"\"${CMAKE_BUILD_TOOL2}\", but you are trying to build "
"${PROJECT_NAME} using \"${CMAKE_BUILD_TOOL1}\"."
"In order for this build to succeed, both projects must be "
"built with the same Generator. To change the Generator you "
"are using for the project ${PROJECT_NAME}, you must "
"delete the cache, and then rerun cmake and this "
"time select the same Generator that was used to build "
"${CMAKE_BUILD_SETTING_PROJECT_NAME}. If "
"${CMAKE_BUILD_SETTING_PROJECT_NAME} was built using a "
"generator that you do not have (for example it was built "
"with Visual Studio 6 and you only have 7) then you will "
"need to select a different version of "
"${CMAKE_BUILD_SETTING_PROJECT_NAME} or rebuild "
"${CMAKE_BUILD_SETTING_PROJECT_NAME} with the correct "
"generator. ")
ENDIF(CMAKE_BUILD_TOOL_MISMATCH)
ENDIF(WIN32)
# Enforce the C++ compiler setting.
IF(CMAKE_CXX_COMPILER_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_CXX_COMPILER to "
"\"${CMAKE_BUILD_SETTING_CXX_COMPILER}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. This is required "
"because C++ projects must use the same compiler. "
"If this message appears for more than one imported project, "
"you have conflicting C++ compilers and will have to "
"re-build one of those projects.")
SET(CMAKE_CXX_COMPILER ${CMAKE_BUILD_SETTING_CXX_COMPILER}
CACHE STRING "C++ compiler imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_CXX_COMPILER_MISMATCH)
# Enforce the build type.
IF(CMAKE_BUILD_TYPE_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_BUILD_TYPE to "
"\"${CMAKE_BUILD_SETTING_BUILD_TYPE}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. This is required "
"because projects must use the same compiler settings. "
"If this message appears for more than one imported project, "
"you have conflicting compiler settings and will have to "
"re-build one of those projects.")
SET(CMAKE_BUILD_TYPE ${CMAKE_BUILD_SETTING_BUILD_TYPE}
CACHE STRING "Build type imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_BUILD_TYPE_MISMATCH)
# Enforce the C build variation flags.
IF(CMAKE_C_FLAGS_DEBUG_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_DEBUG to "
"\"${CMAKE_BUILD_SETTING_C_FLAGS_DEBUG}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
"If this message appears for more than one imported project, "
"you have conflicting options and will have to "
"re-build one of those projects.")
SET(CMAKE_C_FLAGS_DEBUG ${CMAKE_BUILD_SETTING_C_FLAGS_DEBUG}
CACHE STRING "C DEBUG flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_C_FLAGS_DEBUG_MISMATCH)
IF(CMAKE_C_FLAGS_RELEASE_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_RELEASE to "
"\"${CMAKE_BUILD_SETTING_C_FLAGS_RELEASE}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
"If this message appears for more than one imported project, "
"you have conflicting options and will have to "
"re-build one of those projects.")
SET(CMAKE_C_FLAGS_RELEASE ${CMAKE_BUILD_SETTING_C_FLAGS_RELEASE}
CACHE STRING "C RELEASE flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_C_FLAGS_RELEASE_MISMATCH)
IF(CMAKE_C_FLAGS_MINSIZEREL_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_MINSIZEREL to "
"\"${CMAKE_BUILD_SETTING_C_FLAGS_MINSIZEREL}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
"If this message appears for more than one imported project, "
"you have conflicting options and will have to "
"re-build one of those projects.")
SET(CMAKE_C_FLAGS_MINSIZEREL ${CMAKE_BUILD_SETTING_C_FLAGS_MINSIZEREL}
CACHE STRING "C MINSIZEREL flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_C_FLAGS_MINSIZEREL_MISMATCH)
IF(CMAKE_C_FLAGS_RELWITHDEBINFO_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_RELWITHDEBINFO to "
"\"${CMAKE_BUILD_SETTING_C_FLAGS_RELWITHDEBINFO}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
"If this message appears for more than one imported project, "
"you have conflicting options and will have to "
"re-build one of those projects.")
SET(CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_BUILD_SETTING_C_FLAGS_RELWITHDEBINFO}
CACHE STRING "C RELWITHDEBINFO flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_C_FLAGS_RELWITHDEBINFO_MISMATCH)
# Enforce the C++ build variation flags.
IF(CMAKE_CXX_FLAGS_DEBUG_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_DEBUG to "
"\"${CMAKE_BUILD_SETTING_CXX_FLAGS_DEBUG}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
"If this message appears for more than one imported project, "
"you have conflicting options and will have to "
"re-build one of those projects.")
SET(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_BUILD_SETTING_CXX_FLAGS_DEBUG}
CACHE STRING "C++ DEBUG flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_CXX_FLAGS_DEBUG_MISMATCH)
IF(CMAKE_CXX_FLAGS_RELEASE_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_RELEASE to "
"\"${CMAKE_BUILD_SETTING_CXX_FLAGS_RELEASE}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
"If this message appears for more than one imported project, "
"you have conflicting options and will have to "
"re-build one of those projects.")
SET(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_BUILD_SETTING_CXX_FLAGS_RELEASE}
CACHE STRING "C++ RELEASE flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_CXX_FLAGS_RELEASE_MISMATCH)
IF(CMAKE_CXX_FLAGS_MINSIZEREL_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_MINSIZEREL to "
"\"${CMAKE_BUILD_SETTING_CXX_FLAGS_MINSIZEREL}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
"If this message appears for more than one imported project, "
"you have conflicting options and will have to "
"re-build one of those projects.")
SET(CMAKE_CXX_FLAGS_MINSIZEREL ${CMAKE_BUILD_SETTING_CXX_FLAGS_MINSIZEREL}
CACHE STRING "C++ MINSIZEREL flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_CXX_FLAGS_MINSIZEREL_MISMATCH)
IF(CMAKE_CXX_FLAGS_RELWITHDEBINFO_MISMATCH)
MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_RELWITHDEBINFO to "
"\"${CMAKE_BUILD_SETTING_CXX_FLAGS_RELWITHDEBINFO}\" to match that imported "
"from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
"If this message appears for more than one imported project, "
"you have conflicting options and will have to "
"re-build one of those projects.")
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_BUILD_SETTING_CXX_FLAGS_RELWITHDEBINFO}
CACHE STRING "C++ RELWITHDEBINFO flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
ENDIF(CMAKE_CXX_FLAGS_RELWITHDEBINFO_MISMATCH)
ELSE(${SETTINGS_FILE} MATCHES ".+")
MESSAGE(SEND_ERROR "CMAKE_IMPORT_BUILD_SETTINGS called with no argument.")
ENDIF(${SETTINGS_FILE} MATCHES ".+")
ENDMACRO(CMAKE_IMPORT_BUILD_SETTINGS)