compiler_tests.cmake 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. if(DRACO_CMAKE_COMPILER_TESTS_CMAKE_)
  2. return()
  3. endif()
  4. set(DRACO_CMAKE_COMPILER_TESTS_CMAKE_ 1)
  5. include(CheckCSourceCompiles)
  6. include(CheckCXXSourceCompiles)
  7. # The basic main() macro used in all compile tests.
  8. set(DRACO_C_MAIN "\nint main(void) { return 0; }")
  9. set(DRACO_CXX_MAIN "\nint main() { return 0; }")
  10. # Strings containing the names of passed and failed tests.
  11. set(DRACO_C_PASSED_TESTS)
  12. set(DRACO_C_FAILED_TESTS)
  13. set(DRACO_CXX_PASSED_TESTS)
  14. set(DRACO_CXX_FAILED_TESTS)
  15. macro(draco_push_var var new_value)
  16. set(SAVED_${var} ${var})
  17. set(${var} ${new_value})
  18. endmacro()
  19. macro(draco_pop_var var)
  20. set(var ${SAVED_${var}})
  21. unset(SAVED_${var})
  22. endmacro()
  23. # Confirms $test_source compiles and stores $test_name in one of
  24. # $DRACO_C_PASSED_TESTS or $DRACO_C_FAILED_TESTS depending on out come. When the
  25. # test passes $result_var is set to 1. When it fails $result_var is unset. The
  26. # test is not run if the test name is found in either of the passed or failed
  27. # test variables.
  28. macro(draco_check_c_compiles test_name test_source result_var)
  29. unset(C_TEST_PASSED CACHE)
  30. unset(C_TEST_FAILED CACHE)
  31. string(FIND "${DRACO_C_PASSED_TESTS}" "${test_name}" C_TEST_PASSED)
  32. string(FIND "${DRACO_C_FAILED_TESTS}" "${test_name}" C_TEST_FAILED)
  33. if(${C_TEST_PASSED} EQUAL -1 AND ${C_TEST_FAILED} EQUAL -1)
  34. unset(C_TEST_COMPILED CACHE)
  35. message("Running C compiler test: ${test_name}")
  36. check_c_source_compiles("${test_source} ${DRACO_C_MAIN}" C_TEST_COMPILED)
  37. set(${result_var} ${C_TEST_COMPILED})
  38. if(${C_TEST_COMPILED})
  39. set(DRACO_C_PASSED_TESTS "${DRACO_C_PASSED_TESTS} ${test_name}")
  40. else()
  41. set(DRACO_C_FAILED_TESTS "${DRACO_C_FAILED_TESTS} ${test_name}")
  42. message("C Compiler test ${test_name} failed.")
  43. endif()
  44. elseif(NOT ${C_TEST_PASSED} EQUAL -1)
  45. set(${result_var} 1)
  46. else() # ${C_TEST_FAILED} NOT EQUAL -1
  47. unset(${result_var})
  48. endif()
  49. endmacro()
  50. # Confirms $test_source compiles and stores $test_name in one of
  51. # $DRACO_CXX_PASSED_TESTS or $DRACO_CXX_FAILED_TESTS depending on out come. When
  52. # the test passes $result_var is set to 1. When it fails $result_var is unset.
  53. # The test is not run if the test name is found in either of the passed or
  54. # failed test variables.
  55. macro(draco_check_cxx_compiles test_name test_source result_var)
  56. unset(CXX_TEST_PASSED CACHE)
  57. unset(CXX_TEST_FAILED CACHE)
  58. string(FIND "${DRACO_CXX_PASSED_TESTS}" "${test_name}" CXX_TEST_PASSED)
  59. string(FIND "${DRACO_CXX_FAILED_TESTS}" "${test_name}" CXX_TEST_FAILED)
  60. if(${CXX_TEST_PASSED} EQUAL -1 AND ${CXX_TEST_FAILED} EQUAL -1)
  61. unset(CXX_TEST_COMPILED CACHE)
  62. message("Running CXX compiler test: ${test_name}")
  63. check_cxx_source_compiles("${test_source} ${DRACO_CXX_MAIN}"
  64. CXX_TEST_COMPILED)
  65. set(${result_var} ${CXX_TEST_COMPILED})
  66. if(${CXX_TEST_COMPILED})
  67. set(DRACO_CXX_PASSED_TESTS "${DRACO_CXX_PASSED_TESTS} ${test_name}")
  68. else()
  69. set(DRACO_CXX_FAILED_TESTS "${DRACO_CXX_FAILED_TESTS} ${test_name}")
  70. message("CXX Compiler test ${test_name} failed.")
  71. endif()
  72. elseif(NOT ${CXX_TEST_PASSED} EQUAL -1)
  73. set(${result_var} 1)
  74. else() # ${CXX_TEST_FAILED} NOT EQUAL -1
  75. unset(${result_var})
  76. endif()
  77. endmacro()
  78. # Convenience macro that confirms $test_source compiles as C and C++.
  79. # $result_var is set to 1 when both tests are successful, and 0 when one or both
  80. # tests fail. Note: This macro is intended to be used to write to result
  81. # variables that are expanded via configure_file(). $result_var is set to 1 or 0
  82. # to allow direct usage of the value in generated source files.
  83. macro(draco_check_source_compiles test_name test_source result_var)
  84. unset(C_PASSED)
  85. unset(CXX_PASSED)
  86. draco_check_c_compiles(${test_name} ${test_source} C_PASSED)
  87. draco_check_cxx_compiles(${test_name} ${test_source} CXX_PASSED)
  88. if(${C_PASSED} AND ${CXX_PASSED})
  89. set(${result_var} 1)
  90. else()
  91. set(${result_var} 0)
  92. endif()
  93. endmacro()