CMakeImportBuildSettings.cmake 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. ENDIF(CMAKE_BUILD_TOOL)
  23. SET(CMAKE_BUILD_TOOL2 "")
  24. IF(CMAKE_BUILD_SETTING_BUILD_TOOL)
  25. GET_FILENAME_COMPONENT (CMAKE_BUILD_TOOL2 ${CMAKE_BUILD_SETTING_BUILD_TOOL} NAME_WE)
  26. ENDIF(CMAKE_BUILD_SETTING_BUILD_TOOL)
  27. STRING(COMPARE NOTEQUAL "x${CMAKE_BUILD_TOOL1}" "x${CMAKE_BUILD_TOOL2}"
  28. CMAKE_BUILD_TOOL_MISMATCH)
  29. IF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^msdev$")
  30. SET(CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO 1)
  31. ENDIF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^msdev$")
  32. IF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^devenv$")
  33. SET(CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO 1)
  34. ENDIF(CMAKE_BUILD_SETTING_BUILD_TOOL MATCHES "^devenv$")
  35. # Check the C++ compiler setting. If it is empty, the imported
  36. # project is not a C++ project, and doesn't need a matching compiler.
  37. IF(CMAKE_BUILD_SETTING_CXX_COMPILER)
  38. STRING(COMPARE NOTEQUAL
  39. "x${CMAKE_CXX_COMPILER}" "x${CMAKE_BUILD_SETTING_CXX_COMPILER}"
  40. CMAKE_CXX_COMPILER_MISMATCH)
  41. ENDIF(CMAKE_BUILD_SETTING_CXX_COMPILER)
  42. # Check the C build variation flags.
  43. STRING(COMPARE NOTEQUAL
  44. "x${CMAKE_C_FLAGS_DEBUG}" "x${CMAKE_BUILD_SETTING_C_FLAGS_DEBUG}"
  45. CMAKE_C_FLAGS_DEBUG_MISMATCH)
  46. STRING(COMPARE NOTEQUAL
  47. "x${CMAKE_C_FLAGS_RELEASE}" "x${CMAKE_BUILD_SETTING_C_FLAGS_RELEASE}"
  48. CMAKE_C_FLAGS_RELEASE_MISMATCH)
  49. STRING(COMPARE NOTEQUAL
  50. "x${CMAKE_C_FLAGS_MINSIZEREL}" "x${CMAKE_BUILD_SETTING_C_FLAGS_MINSIZEREL}"
  51. CMAKE_C_FLAGS_MINSIZEREL_MISMATCH)
  52. STRING(COMPARE NOTEQUAL
  53. "x${CMAKE_C_FLAGS_RELWITHDEBINFO}" "x${CMAKE_BUILD_SETTING_C_FLAGS_RELWITHDEBINFO}"
  54. CMAKE_C_FLAGS_RELWITHDEBINFO_MISMATCH)
  55. # Check the C++ build variation flags.
  56. STRING(COMPARE NOTEQUAL
  57. "x${CMAKE_CXX_FLAGS_DEBUG}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_DEBUG}"
  58. CMAKE_CXX_FLAGS_DEBUG_MISMATCH)
  59. STRING(COMPARE NOTEQUAL
  60. "x${CMAKE_CXX_FLAGS_RELEASE}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_RELEASE}"
  61. CMAKE_CXX_FLAGS_RELEASE_MISMATCH)
  62. STRING(COMPARE NOTEQUAL
  63. "x${CMAKE_CXX_FLAGS_MINSIZEREL}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_MINSIZEREL}"
  64. CMAKE_CXX_FLAGS_MINSIZEREL_MISMATCH)
  65. STRING(COMPARE NOTEQUAL
  66. "x${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" "x${CMAKE_BUILD_SETTING_CXX_FLAGS_RELWITHDEBINFO}"
  67. CMAKE_CXX_FLAGS_RELWITHDEBINFO_MISMATCH)
  68. # Check the build type.
  69. SET(CMAKE_BUILD_TYPE_MISMATCH 0)
  70. IF(WIN32)
  71. IF(NOT CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO)
  72. STRING(COMPARE NOTEQUAL
  73. "x${CMAKE_BUILD_TYPE}" "x${CMAKE_BUILD_SETTING_BUILD_TYPE}"
  74. CMAKE_BUILD_TYPE_MISMATCH)
  75. ENDIF(NOT CMAKE_IMPORT_BUILD_SETTINGS_IMPORTING_FROM_MS_STUDIO)
  76. ENDIF(WIN32)
  77. # Build tool must match on Windows.
  78. IF(WIN32)
  79. IF(CMAKE_BUILD_TOOL_MISMATCH)
  80. MESSAGE(SEND_ERROR
  81. "${CMAKE_BUILD_SETTING_PROJECT_NAME} was built using "
  82. "\"${CMAKE_BUILD_SETTING_BUILD_TOOL}\", but ${PROJECT_NAME} "
  83. "is using \"${CMAKE_BUILD_TOOL}\". The build will fail. "
  84. "Try selecting a different CMake Generator.")
  85. ENDIF(CMAKE_BUILD_TOOL_MISMATCH)
  86. ENDIF(WIN32)
  87. # Enforce the C++ compiler setting.
  88. IF(CMAKE_CXX_COMPILER_MISMATCH)
  89. MESSAGE("Warning: CMake is forcing CMAKE_CXX_COMPILER to "
  90. "\"${CMAKE_BUILD_SETTING_CXX_COMPILER}\" to match that imported "
  91. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. This is required "
  92. "because C++ projects must use the same compiler. "
  93. "If this message appears for more than one imported project, "
  94. "you have conflicting C++ compilers and will have to "
  95. "re-build one of those projects.")
  96. SET(CMAKE_CXX_COMPILER ${CMAKE_BUILD_SETTING_CXX_COMPILER}
  97. CACHE STRING "C++ compiler imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  98. ENDIF(CMAKE_CXX_COMPILER_MISMATCH)
  99. # Enforce the build type.
  100. IF(CMAKE_BUILD_TYPE_MISMATCH)
  101. MESSAGE("Warning: CMake is forcing CMAKE_BUILD_TYPE to "
  102. "\"${CMAKE_BUILD_SETTING_BUILD_TYPE}\" to match that imported "
  103. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. This is required "
  104. "because projects must use the same compiler settings. "
  105. "If this message appears for more than one imported project, "
  106. "you have conflicting compiler settings and will have to "
  107. "re-build one of those projects.")
  108. SET(CMAKE_BUILD_TYPE ${CMAKE_BUILD_SETTING_BUILD_TYPE}
  109. CACHE STRING "Build type imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  110. ENDIF(CMAKE_BUILD_TYPE_MISMATCH)
  111. # Enforce the C build variation flags.
  112. IF(CMAKE_C_FLAGS_DEBUG_MISMATCH)
  113. MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_DEBUG to "
  114. "\"${CMAKE_BUILD_SETTING_C_FLAGS_DEBUG}\" to match that imported "
  115. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  116. "If this message appears for more than one imported project, "
  117. "you have conflicting options and will have to "
  118. "re-build one of those projects.")
  119. SET(CMAKE_C_FLAGS_DEBUG ${CMAKE_BUILD_SETTING_C_FLAGS_DEBUG}
  120. CACHE STRING "C DEBUG flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  121. ENDIF(CMAKE_C_FLAGS_DEBUG_MISMATCH)
  122. IF(CMAKE_C_FLAGS_RELEASE_MISMATCH)
  123. MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_RELEASE to "
  124. "\"${CMAKE_BUILD_SETTING_C_FLAGS_RELEASE}\" to match that imported "
  125. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  126. "If this message appears for more than one imported project, "
  127. "you have conflicting options and will have to "
  128. "re-build one of those projects.")
  129. SET(CMAKE_C_FLAGS_RELEASE ${CMAKE_BUILD_SETTING_C_FLAGS_RELEASE}
  130. CACHE STRING "C RELEASE flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  131. ENDIF(CMAKE_C_FLAGS_RELEASE_MISMATCH)
  132. IF(CMAKE_C_FLAGS_MINSIZEREL_MISMATCH)
  133. MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_MINSIZEREL to "
  134. "\"${CMAKE_BUILD_SETTING_C_FLAGS_MINSIZEREL}\" to match that imported "
  135. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  136. "If this message appears for more than one imported project, "
  137. "you have conflicting options and will have to "
  138. "re-build one of those projects.")
  139. SET(CMAKE_C_FLAGS_MINSIZEREL ${CMAKE_BUILD_SETTING_C_FLAGS_MINSIZEREL}
  140. CACHE STRING "C MINSIZEREL flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  141. ENDIF(CMAKE_C_FLAGS_MINSIZEREL_MISMATCH)
  142. IF(CMAKE_C_FLAGS_RELWITHDEBINFO_MISMATCH)
  143. MESSAGE("Warning: CMake is forcing CMAKE_C_FLAGS_RELWITHDEBINFO to "
  144. "\"${CMAKE_BUILD_SETTING_C_FLAGS_RELWITHDEBINFO}\" to match that imported "
  145. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  146. "If this message appears for more than one imported project, "
  147. "you have conflicting options and will have to "
  148. "re-build one of those projects.")
  149. SET(CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_BUILD_SETTING_C_FLAGS_RELWITHDEBINFO}
  150. CACHE STRING "C RELWITHDEBINFO flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  151. ENDIF(CMAKE_C_FLAGS_RELWITHDEBINFO_MISMATCH)
  152. # Enforce the C++ build variation flags.
  153. IF(CMAKE_CXX_FLAGS_DEBUG_MISMATCH)
  154. MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_DEBUG to "
  155. "\"${CMAKE_BUILD_SETTING_CXX_FLAGS_DEBUG}\" to match that imported "
  156. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  157. "If this message appears for more than one imported project, "
  158. "you have conflicting options and will have to "
  159. "re-build one of those projects.")
  160. SET(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_BUILD_SETTING_CXX_FLAGS_DEBUG}
  161. CACHE STRING "C++ DEBUG flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  162. ENDIF(CMAKE_CXX_FLAGS_DEBUG_MISMATCH)
  163. IF(CMAKE_CXX_FLAGS_RELEASE_MISMATCH)
  164. MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_RELEASE to "
  165. "\"${CMAKE_BUILD_SETTING_CXX_FLAGS_RELEASE}\" to match that imported "
  166. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  167. "If this message appears for more than one imported project, "
  168. "you have conflicting options and will have to "
  169. "re-build one of those projects.")
  170. SET(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_BUILD_SETTING_CXX_FLAGS_RELEASE}
  171. CACHE STRING "C++ RELEASE flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  172. ENDIF(CMAKE_CXX_FLAGS_RELEASE_MISMATCH)
  173. IF(CMAKE_CXX_FLAGS_MINSIZEREL_MISMATCH)
  174. MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_MINSIZEREL to "
  175. "\"${CMAKE_BUILD_SETTING_CXX_FLAGS_MINSIZEREL}\" to match that imported "
  176. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  177. "If this message appears for more than one imported project, "
  178. "you have conflicting options and will have to "
  179. "re-build one of those projects.")
  180. SET(CMAKE_CXX_FLAGS_MINSIZEREL ${CMAKE_BUILD_SETTING_CXX_FLAGS_MINSIZEREL}
  181. CACHE STRING "C++ MINSIZEREL flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  182. ENDIF(CMAKE_CXX_FLAGS_MINSIZEREL_MISMATCH)
  183. IF(CMAKE_CXX_FLAGS_RELWITHDEBINFO_MISMATCH)
  184. MESSAGE("Warning: CMake is forcing CMAKE_CXX_FLAGS_RELWITHDEBINFO to "
  185. "\"${CMAKE_BUILD_SETTING_CXX_FLAGS_RELWITHDEBINFO}\" to match that imported "
  186. "from ${CMAKE_BUILD_SETTING_PROJECT_NAME}. "
  187. "If this message appears for more than one imported project, "
  188. "you have conflicting options and will have to "
  189. "re-build one of those projects.")
  190. SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_BUILD_SETTING_CXX_FLAGS_RELWITHDEBINFO}
  191. CACHE STRING "C++ RELWITHDEBINFO flags imported from ${CMAKE_BUILD_SETTING_PROJECT_NAME}." FORCE)
  192. ENDIF(CMAKE_CXX_FLAGS_RELWITHDEBINFO_MISMATCH)
  193. ELSE(${SETTINGS_FILE} MATCHES ".+")
  194. MESSAGE(SEND_ERROR "CMAKE_IMPORT_BUILD_SETTINGS called with no argument.")
  195. ENDIF(${SETTINGS_FILE} MATCHES ".+")
  196. ENDMACRO(CMAKE_IMPORT_BUILD_SETTINGS)