CMakeImportBuildSettings.cmake 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. # - import build settings from another project
  2. # CMAKE_IMPORT_BUILD_SETTINGS(SETTINGS_FILE)
  3. # macro defined to import the build settings from another project.
  4. # SETTINGS_FILE is a file created by the other project's call to the
  5. # CMAKE_EXPORT_BUILD_SETTINGS macro, see CMakeExportBuildSettings.
  6. MACRO(CMAKE_IMPORT_BUILD_SETTINGS SETTINGS_FILE)
  7. IF(${SETTINGS_FILE} MATCHES ".+")
  8. # Load the settings.
  9. INCLUDE(${SETTINGS_FILE})
  10. # Check the CMake version that stored the settings.
  11. IF(${CMAKE_BUILD_SETTING_CMAKE_MAJOR_VERSION}.${CMAKE_BUILD_SETTING_CMAKE_MINOR_VERSION}
  12. GREATER ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
  13. MESSAGE(SEND_ERROR
  14. "${CMAKE_BUILD_SETTING_PROJECT_NAME} was built using CMake "
  15. "${CMAKE_BUILD_SETTING_CMAKE_MAJOR_VERSION}.${CMAKE_BUILD_SETTING_CMAKE_MINOR_VERSION}, "
  16. "but this is CMake${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}. "
  17. "Please upgrade CMake to a more recent version.")
  18. ENDIF(${CMAKE_BUILD_SETTING_CMAKE_MAJOR_VERSION}.${CMAKE_BUILD_SETTING_CMAKE_MINOR_VERSION}
  19. GREATER ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
  20. # Check the build tool.
  21. SET(CMAKE_BUILD_TOOL1 "")
  22. IF(CMAKE_BUILD_TOOL)
  23. GET_FILENAME_COMPONENT (CMAKE_BUILD_TOOL1 ${CMAKE_BUILD_TOOL} NAME_WE)
  24. STRING(TOLOWER ${CMAKE_BUILD_TOOL1} CMAKE_BUILD_TOOL1)
  25. ENDIF(CMAKE_BUILD_TOOL)
  26. SET(CMAKE_BUILD_TOOL2 "")
  27. IF(CMAKE_BUILD_SETTING_BUILD_TOOL)
  28. GET_FILENAME_COMPONENT (CMAKE_BUILD_TOOL2 ${CMAKE_BUILD_SETTING_BUILD_TOOL} NAME_WE)
  29. STRING(TOLOWER ${CMAKE_BUILD_TOOL2} CMAKE_BUILD_TOOL2)
  30. ENDIF(CMAKE_BUILD_SETTING_BUILD_TOOL)
  31. STRING(COMPARE NOTEQUAL "x${CMAKE_BUILD_TOOL1}" "x${CMAKE_BUILD_TOOL2}"
  32. CMAKE_BUILD_TOOL_MISMATCH)
  33. IF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^msdev$")
  34. SET(CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO 1)
  35. ENDIF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^msdev$")
  36. IF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^devenv$")
  37. SET(CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO 1)
  38. ENDIF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^devenv$")
  39. # Check the C++ compiler setting. If it is empty, the imported
  40. # project is not a C++ project, and doesn't need a matching compiler.
  41. IF(CMAKE_BUILD_SETTING_CXX_COMPILER)
  42. IF(WIN32)
  43. STRING(TOLOWER "x${CMAKE_CXX_COMPILER}" COMPARE_CXX_LOCAL)
  44. STRING(TOLOWER "x${CMAKE_BUILD_SETTING_CXX_COMPILER}" COMPARE_CXX_REMOTE)
  45. STRING(COMPARE NOTEQUAL "${COMPARE_CXX_LOCAL}" "${COMPARE_CXX_REMOTE}"
  46. CMAKE_CXX_COMPILER_MISMATCH)
  47. ELSE(WIN32)
  48. STRING(COMPARE NOTEQUAL
  49. "x${CMAKE_CXX_COMPILER}" "x${CMAKE_BUILD_SETTING_CXX_COMPILER}"
  50. CMAKE_CXX_COMPILER_MISMATCH)
  51. ENDIF(WIN32)
  52. ENDIF(CMAKE_BUILD_SETTING_CXX_COMPILER)
  53. # Check the C build variation flags.
  54. STRING(COMPARE NOTEQUAL
  55. "x${CMAKE_C_FLAGS_DEBUG}" "x${CMAKE_BUILD_SETTING_C_FLAGS_DEBUG}"
  56. CMAKE_C_FLAGS_DEBUG_MISMATCH)
  57. STRING(COMPARE NOTEQUAL
  58. "x${CMAKE_C_FLAGS_RELEASE}" "x${CMAKE_BUILD_SETTING_C_FLAGS_RELEASE}"
  59. CMAKE_C_FLAGS_RELEASE_MISMATCH)
  60. STRING(COMPARE NOTEQUAL
  61. "x${CMAKE_C_FLAGS_MINSIZEREL}" "x${CMAKE_BUILD_SETTING_C_FLAGS_MINSIZEREL}"
  62. CMAKE_C_FLAGS_MINSIZEREL_MISMATCH)
  63. STRING(COMPARE NOTEQUAL
  64. "x${CMAKE_C_FLAGS_RELWITHDEBINFO}" "x${CMAKE_BUILD_SETTING_C_FLAGS_RELWITHDEBINFO}"
  65. CMAKE_C_FLAGS_RELWITHDEBINFO_MISMATCH)
  66. # Check the C++ build variation flags.
  67. STRING(COMPARE NOTEQUAL
  68. "x${CMAKE_CXX_FLAGS_DEBUG}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_DEBUG}"
  69. CMAKE_CXX_FLAGS_DEBUG_MISMATCH)
  70. STRING(COMPARE NOTEQUAL
  71. "x${CMAKE_CXX_FLAGS_RELEASE}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_RELEASE}"
  72. CMAKE_CXX_FLAGS_RELEASE_MISMATCH)
  73. STRING(COMPARE NOTEQUAL
  74. "x${CMAKE_CXX_FLAGS_MINSIZEREL}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_MINSIZEREL}"
  75. CMAKE_CXX_FLAGS_MINSIZEREL_MISMATCH)
  76. STRING(COMPARE NOTEQUAL
  77. "x${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_RELWITHDEBINFO}"
  78. CMAKE_CXX_FLAGS_RELWITHDEBINFO_MISMATCH)
  79. # Check the build type.
  80. SET(CMAKE_BUILD_TYPE_MISMATCH 0)
  81. IF(WIN32)
  82. IF(NOT CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO)
  83. STRING(COMPARE NOTEQUAL
  84. "x${CMAKE_BUILD_TYPE}" "x${CMAKE_BUILD_SETTING_BUILD_TYPE}"
  85. CMAKE_BUILD_TYPE_MISMATCH)
  86. ENDIF(NOT CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO)
  87. ENDIF(WIN32)
  88. # Build tool must match on Windows.
  89. IF(WIN32)
  90. IF(CMAKE_BUILD_TOOL_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  91. MESSAGE(SEND_ERROR
  92. "This project, ${PROJECT_NAME}, depends on the project "
  93. "${CMAKE_BUILD_SETTING_PROJECT_NAME}. Unfortunately "
  94. "${CMAKE_BUILD_SETTING_PROJECT_NAME} was built using "
  95. "\"${CMAKE_BUILD_TOOL2}\", but you are trying to build "
  96. "${PROJECT_NAME} using \"${CMAKE_BUILD_TOOL1}\"."
  97. "In order for this build to succeed, both projects must be "
  98. "built with the same Generator. To change the Generator you "
  99. "are using for the project ${PROJECT_NAME}, you must "
  100. "delete the cache, and then rerun cmake and this "
  101. "time select the same Generator that was used to build "
  102. "${CMAKE_BUILD_SETTING_PROJECT_NAME}. If "
  103. "${CMAKE_BUILD_SETTING_PROJECT_NAME} was built using a "
  104. "generator that you do not have (for example it was built "
  105. "with Visual Studio 6 and you only have 7) then you will "
  106. "need to select a different version of "
  107. "${CMAKE_BUILD_SETTING_PROJECT_NAME} or rebuild "
  108. "${CMAKE_BUILD_SETTING_PROJECT_NAME} with the correct "
  109. "generator. ")
  110. ENDIF(CMAKE_BUILD_TOOL_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  111. ENDIF(WIN32)
  112. # Enforce the C++ compiler setting.
  113. # CMAKE_OVERRIDE_COMPILER_MISMATCH allow advanced user to override cmake detection of
  114. # compiler mismatch between imported projects. Typical case on UNIX could be:
  115. # 1. Compile a project with g++-3.3 while the imported project was configured
  116. # using the 'c++' alias (which at the time meant g++-3.3)
  117. # 2. This variable also becomes handy when the project your are importing has been
  118. # compiled with a compiler you do not have access to, but offer a compatible ABI with
  119. # yours.
  120. # WARNING: Do not use this variable with C++ compiler with incompatible ABI
  121. IF(CMAKE_CXX_COMPILER_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  122. MESSAGE("Warning: CMake is forcing CMAKE_CXX_COMPILER to "
  123. "\"${CMAKE_BUILD_SETTING_CXX_COMPILER}\" to match that imported "
  124. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. This is required "
  125. "because C++ projects must use the same compiler. "
  126. "If this message appears for more than one imported project, "
  127. "you have conflicting C++ compilers and will have to "
  128. "re-build one of those projects. Was set to ${CMAKE_CXX_COMPILER}")
  129. SET(CMAKE_CXX_COMPILER ${CMAKE_BUILD_SETTING_CXX_COMPILER}
  130. CACHE STRING "C++ compiler imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  131. ENDIF(CMAKE_CXX_COMPILER_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  132. # Enforce the build type.
  133. IF(CMAKE_BUILD_TYPE_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  134. MESSAGE("Warning: CMake is forcing CMAKE_BUILD_TYPE to "
  135. "\"${CMAKE_BUILD_SETTING_BUILD_TYPE}\" to match that imported "
  136. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. This is required "
  137. "because projects must use the same compiler settings. "
  138. "If this message appears for more than one imported project, "
  139. "you have conflicting compiler settings and will have to "
  140. "re-build one of those projects.")
  141. SET(CMAKE_BUILD_TYPE ${CMAKE_BUILD_SETTING_BUILD_TYPE}
  142. CACHE STRING "Build type imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  143. ENDIF(CMAKE_BUILD_TYPE_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  144. # Enforce the C build variation flags.
  145. IF(CMAKE_C_FLAGS_DEBUG_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  146. MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_DEBUG to "
  147. "\"${CMAKE_BUILD_SETTING_C_FLAGS_DEBUG}\" to match that imported "
  148. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  149. "If this message appears for more than one imported project, "
  150. "you have conflicting options and will have to "
  151. "re-build one of those projects.")
  152. SET(CMAKE_C_FLAGS_DEBUG ${CMAKE_BUILD_SETTING_C_FLAGS_DEBUG}
  153. CACHE STRING "C DEBUG flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  154. ENDIF(CMAKE_C_FLAGS_DEBUG_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  155. IF(CMAKE_C_FLAGS_RELEASE_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  156. MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_RELEASE to "
  157. "\"${CMAKE_BUILD_SETTING_C_FLAGS_RELEASE}\" to match that imported "
  158. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  159. "If this message appears for more than one imported project, "
  160. "you have conflicting options and will have to "
  161. "re-build one of those projects.")
  162. SET(CMAKE_C_FLAGS_RELEASE ${CMAKE_BUILD_SETTING_C_FLAGS_RELEASE}
  163. CACHE STRING "C RELEASE flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  164. ENDIF(CMAKE_C_FLAGS_RELEASE_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  165. IF(CMAKE_C_FLAGS_MINSIZEREL_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  166. MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_MINSIZEREL to "
  167. "\"${CMAKE_BUILD_SETTING_C_FLAGS_MINSIZEREL}\" to match that imported "
  168. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  169. "If this message appears for more than one imported project, "
  170. "you have conflicting options and will have to "
  171. "re-build one of those projects.")
  172. SET(CMAKE_C_FLAGS_MINSIZEREL ${CMAKE_BUILD_SETTING_C_FLAGS_MINSIZEREL}
  173. CACHE STRING "C MINSIZEREL flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  174. ENDIF(CMAKE_C_FLAGS_MINSIZEREL_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  175. IF(CMAKE_C_FLAGS_RELWITHDEBINFO_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  176. MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_RELWITHDEBINFO to "
  177. "\"${CMAKE_BUILD_SETTING_C_FLAGS_RELWITHDEBINFO}\" to match that imported "
  178. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  179. "If this message appears for more than one imported project, "
  180. "you have conflicting options and will have to "
  181. "re-build one of those projects.")
  182. SET(CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_BUILD_SETTING_C_FLAGS_RELWITHDEBINFO}
  183. CACHE STRING "C RELWITHDEBINFO flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  184. ENDIF(CMAKE_C_FLAGS_RELWITHDEBINFO_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  185. # Enforce the C++ build variation flags.
  186. IF(CMAKE_CXX_FLAGS_DEBUG_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  187. MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_DEBUG to "
  188. "\"${CMAKE_BUILD_SETTING_CXX_FLAGS_DEBUG}\" to match that imported "
  189. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  190. "If this message appears for more than one imported project, "
  191. "you have conflicting options and will have to "
  192. "re-build one of those projects.")
  193. SET(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_BUILD_SETTING_CXX_FLAGS_DEBUG}
  194. CACHE STRING "C++ DEBUG flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  195. ENDIF(CMAKE_CXX_FLAGS_DEBUG_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  196. IF(CMAKE_CXX_FLAGS_RELEASE_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  197. MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_RELEASE to "
  198. "\"${CMAKE_BUILD_SETTING_CXX_FLAGS_RELEASE}\" to match that imported "
  199. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  200. "If this message appears for more than one imported project, "
  201. "you have conflicting options and will have to "
  202. "re-build one of those projects.")
  203. SET(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_BUILD_SETTING_CXX_FLAGS_RELEASE}
  204. CACHE STRING "C++ RELEASE flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  205. ENDIF(CMAKE_CXX_FLAGS_RELEASE_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  206. IF(CMAKE_CXX_FLAGS_MINSIZEREL_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  207. MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_MINSIZEREL to "
  208. "\"${CMAKE_BUILD_SETTING_CXX_FLAGS_MINSIZEREL}\" to match that imported "
  209. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  210. "If this message appears for more than one imported project, "
  211. "you have conflicting options and will have to "
  212. "re-build one of those projects.")
  213. SET(CMAKE_CXX_FLAGS_MINSIZEREL ${CMAKE_BUILD_SETTING_CXX_FLAGS_MINSIZEREL}
  214. CACHE STRING "C++ MINSIZEREL flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  215. ENDIF(CMAKE_CXX_FLAGS_MINSIZEREL_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  216. IF(CMAKE_CXX_FLAGS_RELWITHDEBINFO_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  217. MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_RELWITHDEBINFO to "
  218. "\"${CMAKE_BUILD_SETTING_CXX_FLAGS_RELWITHDEBINFO}\" to match that imported "
  219. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  220. "If this message appears for more than one imported project, "
  221. "you have conflicting options and will have to "
  222. "re-build one of those projects.")
  223. SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_BUILD_SETTING_CXX_FLAGS_RELWITHDEBINFO}
  224. CACHE STRING "C++ RELWITHDEBINFO flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  225. ENDIF(CMAKE_CXX_FLAGS_RELWITHDEBINFO_MISMATCH AND NOT CMAKE_OVERRIDE_COMPILER_MISMATCH)
  226. ELSE(${SETTINGS_FILE} MATCHES ".+")
  227. MESSAGE(SEND_ERROR "CMAKE_IMPORT_BUILD_SETTINGS called with no argument.")
  228. ENDIF(${SETTINGS_FILE} MATCHES ".+")
  229. ENDMACRO(CMAKE_IMPORT_BUILD_SETTINGS)