CheckLinkDirectories.cmake 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. cmake_policy(SET CMP0075 NEW)
  2. enable_language(C)
  3. enable_language(CXX)
  4. function(test_check_result isSucceed functionName)
  5. if(isSucceed AND NOT IS_NEED_SUCCESS)
  6. message(SEND_ERROR "${functionName}: check succeeded instead of failure")
  7. elseif((NOT isSucceed) AND IS_NEED_SUCCESS)
  8. message(SEND_ERROR "${functionName}: check failed instead of success")
  9. endif()
  10. endfunction()
  11. # Common variables
  12. set(validCSourceCode "int main() {return 0;}")
  13. ###
  14. # Checking checkers
  15. ###
  16. # It uses common internal function `CMAKE_CHECK_SOURCE_COMPILES()`
  17. # include(CheckCCompilerFlag)
  18. # Also checks common internal function `CMAKE_CHECK_SOURCE_COMPILES()`
  19. include(CheckCSourceCompiles)
  20. check_c_source_compiles("${validCSourceCode}" CHECK_C_SOURCE_COMPILES_SUCCEED)
  21. test_check_result("${CHECK_C_SOURCE_COMPILES_SUCCEED}" check_c_source_compiles)
  22. # Also checks common internal function `CMAKE_CHECK_SOURCE_RUNS()`
  23. include(CheckCSourceRuns)
  24. check_c_source_runs("${validCSourceCode}" CHECK_C_SOURCE_RUNS_SUCCEED)
  25. test_check_result("${CHECK_C_SOURCE_RUNS_SUCCEED}" check_c_source_runs)
  26. # Shares code with similar C checkers
  27. # include(CheckCXXCompilerFlag)
  28. # include(CheckCXXSourceCompiles)
  29. # include(CheckCXXSourceRuns)
  30. # include(CheckCXXSymbolExists)
  31. # Shares code with similar C checkers
  32. # include(CheckCompilerFlag)
  33. # include(CheckSourceCompiles)
  34. # include(CheckSourceRuns)
  35. # Shares code with similar C checkers
  36. # include(CheckFortranCompilerFlag)
  37. # include(CheckFortranFunctionExists) # No way to test it
  38. # include(CheckFortranSourceCompiles)
  39. # include(CheckFortranSourceRuns)
  40. include(CheckFunctionExists)
  41. check_function_exists (memcpy CHECK_FUNCTION_EXISTS_SUCCEED)
  42. test_check_result("${CHECK_FUNCTION_EXISTS_SUCCEED}" check_function_exists)
  43. include(CheckIncludeFile)
  44. check_include_file("stddef.h" CHECK_INCLUDE_FILE_SUCCEED)
  45. test_check_result("${CHECK_INCLUDE_FILE_SUCCEED}" check_include_file)
  46. include(CheckIncludeFileCXX)
  47. check_include_file_cxx("stddef.h" CHECK_INCLUDE_FILE_CXX_SUCCEED)
  48. test_check_result("${CHECK_INCLUDE_FILE_CXX_SUCCEED}" check_include_file_cxx)
  49. include(CheckIncludeFiles)
  50. check_include_files("stddef.h;stdlib.h" CHECK_INCLUDE_FILES_SUCCEED)
  51. test_check_result("${CHECK_INCLUDE_FILES_SUCCEED}" check_include_files)
  52. include(CheckLibraryExists)
  53. block(PROPAGATE HAVE_LIBM)
  54. unset(CMAKE_REQUIRED_LIBRARIES)
  55. unset(CMAKE_REQUIRED_LINK_DIRECTORIES)
  56. check_library_exists(m ceil "" HAVE_LIBM)
  57. endblock()
  58. if(HAVE_LIBM)
  59. check_library_exists(m ceil "" CHECK_LIBRARY_EXISTS_SUCCEED)
  60. test_check_result("${CHECK_LIBRARY_EXISTS_SUCCEED}" check_library_exists)
  61. endif()
  62. # Shares code with similar C checkers
  63. # include(CheckOBJCCompilerFlag)
  64. # include(CheckOBJCSourceCompiles)
  65. # include(CheckOBJCSourceRuns)
  66. # Shares code with similar C checkers
  67. # include(CheckOBJCXXCompilerFlag)
  68. # include(CheckOBJCXXSourceCompiles)
  69. # include(CheckOBJCXXSourceRuns)
  70. include(CheckPrototypeDefinition)
  71. block(PROPAGATE CHECK_PROTOTYPE_DEFINITION_WORKS)
  72. unset(CMAKE_REQUIRED_LIBRARIES)
  73. unset(CMAKE_REQUIRED_LINK_DIRECTORIES)
  74. check_prototype_definition(memmove
  75. "void *memmove(void *dest, const void *src, size_t n)"
  76. "NULL"
  77. "string.h"
  78. CHECK_PROTOTYPE_DEFINITION_SUCCEED)
  79. endblock()
  80. if (CHECK_PROTOTYPE_DEFINITION_WORKS)
  81. check_prototype_definition(memmove
  82. "void *memmove(void *dest, const void *src, size_t n)"
  83. "NULL"
  84. "string.h"
  85. CHECK_PROTOTYPE_DEFINITION_SUCCEED)
  86. test_check_result("${CHECK_PROTOTYPE_DEFINITION_SUCCEED}" check_prototype_definition)
  87. endif()
  88. # It uses common internal function `CMAKE_CHECK_SOURCE_COMPILES()`
  89. # include(CheckStructHasMember)
  90. include(CheckSymbolExists)
  91. check_symbol_exists(errno "errno.h" CHECK_SYMBOL_EXISTS_SUCCEED)
  92. test_check_result("${CHECK_SYMBOL_EXISTS_SUCCEED}" check_symbol_exists)
  93. include(CheckTypeSize)
  94. check_type_size(int SIZEOF_INT)
  95. test_check_result("${HAVE_SIZEOF_INT}" check_type_size)
  96. include(CheckVariableExists)
  97. check_variable_exists(myTestVar CHECK_VARIABLE_EXISTS_SUCCEED)
  98. test_check_result("${CHECK_VARIABLE_EXISTS_SUCCEED}" check_variable_exists)