| # Macro to import the build settings from another project. Provide as |
| # an argument the file created by the other project's |
| # CMAKE_EXPORT_BUILD_SETTINGS command. |
| 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) |