kwsysPlatformTests.cmake 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing#kwsys for details.
  3. set(KWSYS_PLATFORM_TEST_FILE_C kwsysPlatformTestsC.c)
  4. set(KWSYS_PLATFORM_TEST_FILE_CXX kwsysPlatformTestsCXX.cxx)
  5. macro(KWSYS_PLATFORM_TEST lang var description invert)
  6. if(NOT DEFINED ${var}_COMPILED)
  7. message(STATUS "${description}")
  8. set(maybe_cxx_standard "")
  9. if(CMAKE_VERSION VERSION_LESS 3.8 AND CMAKE_CXX_STANDARD)
  10. set(maybe_cxx_standard "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}")
  11. endif()
  12. try_compile(${var}_COMPILED
  13. ${CMAKE_CURRENT_BINARY_DIR}
  14. ${CMAKE_CURRENT_SOURCE_DIR}/${KWSYS_PLATFORM_TEST_FILE_${lang}}
  15. COMPILE_DEFINITIONS -DTEST_${var} ${KWSYS_PLATFORM_TEST_DEFINES} ${KWSYS_PLATFORM_TEST_EXTRA_FLAGS}
  16. CMAKE_FLAGS "-DLINK_LIBRARIES:STRING=${KWSYS_PLATFORM_TEST_LINK_LIBRARIES}"
  17. ${maybe_cxx_standard}
  18. OUTPUT_VARIABLE OUTPUT)
  19. if(${var}_COMPILED)
  20. file(APPEND
  21. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
  22. "${description} compiled with the following output:\n${OUTPUT}\n\n")
  23. else()
  24. file(APPEND
  25. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  26. "${description} failed to compile with the following output:\n${OUTPUT}\n\n")
  27. endif()
  28. if(${invert} MATCHES INVERT)
  29. if(${var}_COMPILED)
  30. message(STATUS "${description} - no")
  31. else()
  32. message(STATUS "${description} - yes")
  33. endif()
  34. else()
  35. if(${var}_COMPILED)
  36. message(STATUS "${description} - yes")
  37. else()
  38. message(STATUS "${description} - no")
  39. endif()
  40. endif()
  41. endif()
  42. if(${invert} MATCHES INVERT)
  43. if(${var}_COMPILED)
  44. set(${var} 0)
  45. else()
  46. set(${var} 1)
  47. endif()
  48. else()
  49. if(${var}_COMPILED)
  50. set(${var} 1)
  51. else()
  52. set(${var} 0)
  53. endif()
  54. endif()
  55. endmacro()
  56. macro(KWSYS_PLATFORM_TEST_RUN lang var description invert)
  57. if(NOT DEFINED ${var})
  58. message(STATUS "${description}")
  59. try_run(${var} ${var}_COMPILED
  60. ${CMAKE_CURRENT_BINARY_DIR}
  61. ${CMAKE_CURRENT_SOURCE_DIR}/${KWSYS_PLATFORM_TEST_FILE_${lang}}
  62. COMPILE_DEFINITIONS -DTEST_${var} ${KWSYS_PLATFORM_TEST_DEFINES} ${KWSYS_PLATFORM_TEST_EXTRA_FLAGS}
  63. OUTPUT_VARIABLE OUTPUT)
  64. # Note that ${var} will be a 0 return value on success.
  65. if(${var}_COMPILED)
  66. if(${var})
  67. file(APPEND
  68. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  69. "${description} compiled but failed to run with the following output:\n${OUTPUT}\n\n")
  70. else()
  71. file(APPEND
  72. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
  73. "${description} compiled and ran with the following output:\n${OUTPUT}\n\n")
  74. endif()
  75. else()
  76. file(APPEND
  77. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  78. "${description} failed to compile with the following output:\n${OUTPUT}\n\n")
  79. set(${var} -1 CACHE INTERNAL "${description} failed to compile.")
  80. endif()
  81. if(${invert} MATCHES INVERT)
  82. if(${var}_COMPILED)
  83. if(${var})
  84. message(STATUS "${description} - yes")
  85. else()
  86. message(STATUS "${description} - no")
  87. endif()
  88. else()
  89. message(STATUS "${description} - failed to compile")
  90. endif()
  91. else()
  92. if(${var}_COMPILED)
  93. if(${var})
  94. message(STATUS "${description} - no")
  95. else()
  96. message(STATUS "${description} - yes")
  97. endif()
  98. else()
  99. message(STATUS "${description} - failed to compile")
  100. endif()
  101. endif()
  102. endif()
  103. if(${invert} MATCHES INVERT)
  104. if(${var}_COMPILED)
  105. if(${var})
  106. set(${var} 1)
  107. else()
  108. set(${var} 0)
  109. endif()
  110. else()
  111. set(${var} 1)
  112. endif()
  113. else()
  114. if(${var}_COMPILED)
  115. if(${var})
  116. set(${var} 0)
  117. else()
  118. set(${var} 1)
  119. endif()
  120. else()
  121. set(${var} 0)
  122. endif()
  123. endif()
  124. endmacro()
  125. macro(KWSYS_PLATFORM_C_TEST var description invert)
  126. set(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_C_TEST_DEFINES})
  127. set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_C_TEST_EXTRA_FLAGS})
  128. KWSYS_PLATFORM_TEST(C "${var}" "${description}" "${invert}")
  129. set(KWSYS_PLATFORM_TEST_DEFINES)
  130. set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
  131. endmacro()
  132. macro(KWSYS_PLATFORM_C_TEST_RUN var description invert)
  133. set(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_C_TEST_DEFINES})
  134. set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_C_TEST_EXTRA_FLAGS})
  135. KWSYS_PLATFORM_TEST_RUN(C "${var}" "${description}" "${invert}")
  136. set(KWSYS_PLATFORM_TEST_DEFINES)
  137. set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
  138. endmacro()
  139. macro(KWSYS_PLATFORM_CXX_TEST var description invert)
  140. set(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_CXX_TEST_DEFINES})
  141. set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS})
  142. set(KWSYS_PLATFORM_TEST_LINK_LIBRARIES ${KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES})
  143. KWSYS_PLATFORM_TEST(CXX "${var}" "${description}" "${invert}")
  144. set(KWSYS_PLATFORM_TEST_DEFINES)
  145. set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
  146. set(KWSYS_PLATFORM_TEST_LINK_LIBRARIES)
  147. endmacro()
  148. macro(KWSYS_PLATFORM_CXX_TEST_RUN var description invert)
  149. set(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_CXX_TEST_DEFINES})
  150. set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS})
  151. KWSYS_PLATFORM_TEST_RUN(CXX "${var}" "${description}" "${invert}")
  152. set(KWSYS_PLATFORM_TEST_DEFINES)
  153. set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
  154. endmacro()
  155. #-----------------------------------------------------------------------------
  156. # KWSYS_PLATFORM_INFO_TEST(lang var description)
  157. #
  158. # Compile test named by ${var} and store INFO strings extracted from binary.
  159. macro(KWSYS_PLATFORM_INFO_TEST lang var description)
  160. # We can implement this macro on CMake 2.6 and above.
  161. if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.6)
  162. set(${var} "")
  163. else()
  164. # Choose a location for the result binary.
  165. set(KWSYS_PLATFORM_INFO_FILE
  166. ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/${var}.bin)
  167. # Compile the test binary.
  168. if(NOT EXISTS ${KWSYS_PLATFORM_INFO_FILE})
  169. message(STATUS "${description}")
  170. try_compile(${var}_COMPILED
  171. ${CMAKE_CURRENT_BINARY_DIR}
  172. ${CMAKE_CURRENT_SOURCE_DIR}/${KWSYS_PLATFORM_TEST_FILE_${lang}}
  173. COMPILE_DEFINITIONS -DTEST_${var}
  174. ${KWSYS_PLATFORM_${lang}_TEST_DEFINES}
  175. ${KWSYS_PLATFORM_${lang}_TEST_EXTRA_FLAGS}
  176. OUTPUT_VARIABLE OUTPUT
  177. COPY_FILE ${KWSYS_PLATFORM_INFO_FILE}
  178. )
  179. if(${var}_COMPILED)
  180. file(APPEND
  181. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
  182. "${description} compiled with the following output:\n${OUTPUT}\n\n")
  183. else()
  184. file(APPEND
  185. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  186. "${description} failed to compile with the following output:\n${OUTPUT}\n\n")
  187. endif()
  188. if(${var}_COMPILED)
  189. message(STATUS "${description} - compiled")
  190. else()
  191. message(STATUS "${description} - failed")
  192. endif()
  193. endif()
  194. # Parse info strings out of the compiled binary.
  195. if(${var}_COMPILED)
  196. file(STRINGS ${KWSYS_PLATFORM_INFO_FILE} ${var} REGEX "INFO:[A-Za-z0-9]+\\[[^]]*\\]")
  197. else()
  198. set(${var} "")
  199. endif()
  200. set(KWSYS_PLATFORM_INFO_FILE)
  201. endif()
  202. endmacro()