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()