CMakeImportBuildSettings.cmake 12 KB

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