config.cmake 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. function(detect_code_compiled code macro msg)
  2. message(STATUS "Detecting ${msg}")
  3. check_cxx_source_compiles("${code}" "${macro}" FAIL_REGEX "warning")
  4. if(${macro})
  5. message(STATUS "Detecting ${msg} - supported")
  6. else()
  7. message(STATUS "Detecting ${msg} - not supported")
  8. endif()
  9. endfunction(detect_code_compiled)
  10. include(CheckIncludeFileCXX)
  11. include(CheckFunctionExists)
  12. include(CheckSymbolExists)
  13. include(CMakeDetermineCompileFeatures)
  14. include(CheckCXXSourceCompiles)
  15. include(CMakeFindDependencyMacro)
  16. if(NOT PostgreSQL_FOUND)
  17. if(POLICY CMP0074)
  18. cmake_policy(PUSH)
  19. # CMP0074 is `OLD` by `cmake_minimum_required(VERSION 3.7)`,
  20. # sets `NEW` to enable support CMake variable `PostgreSQL_ROOT`.
  21. cmake_policy(SET CMP0074 NEW)
  22. endif()
  23. find_package(PostgreSQL REQUIRED)
  24. if(POLICY CMP0074)
  25. cmake_policy(POP)
  26. endif()
  27. endif()
  28. check_function_exists("poll" PQXX_HAVE_POLL)
  29. set(CMAKE_REQUIRED_LIBRARIES pq)
  30. check_symbol_exists(
  31. PQencryptPasswordConn
  32. "${PostgreSQL_INCLUDE_DIR}/libpq-fe.h"
  33. PQXX_HAVE_PQENCRYPTPASSWORDCONN)
  34. check_symbol_exists(
  35. PQenterPipelineMode
  36. "${PostgreSQL_INCLUDE_DIR}/libpq-fe.h"
  37. PQXX_HAVE_PQ_PIPELINE)
  38. cmake_determine_compile_features(CXX)
  39. cmake_policy(SET CMP0057 NEW)
  40. # check_cxx_source_compiles requires CMAKE_REQUIRED_DEFINITIONS to specify
  41. # compiling arguments.
  42. # Wordaround: Push CMAKE_REQUIRED_DEFINITIONS
  43. if(CMAKE_REQUIRED_DEFINITIONS)
  44. set(def "${CMAKE_REQUIRED_DEFINITIONS}")
  45. endif()
  46. set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION})
  47. set(CMAKE_REQUIRED_QUIET ON)
  48. try_compile(
  49. PQXX_HAVE_GCC_PURE
  50. ${PROJECT_BINARY_DIR}
  51. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/gcc_pure.cxx)
  52. try_compile(
  53. PQXX_HAVE_GCC_VISIBILITY
  54. ${PROJECT_BINARY_DIR}
  55. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/gcc_visibility.cxx)
  56. try_compile(
  57. PQXX_HAVE_LIKELY
  58. ${PROJECT_BINARY_DIR}
  59. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/likely.cxx)
  60. try_compile(
  61. PQXX_HAVE_CXA_DEMANGLE
  62. ${PROJECT_BINARY_DIR}
  63. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/cxa_demangle.cxx)
  64. try_compile(
  65. PQXX_HAVE_CONCEPTS
  66. ${PROJECT_BINARY_DIR}
  67. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/concepts.cxx)
  68. try_compile(
  69. PQXX_HAVE_SPAN
  70. ${PROJECT_BINARY_DIR}
  71. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/span.cxx)
  72. try_compile(
  73. PQXX_HAVE_MULTIDIMENSIONAL_SUBSCRIPT
  74. ${PROJECT_BINARY_DIR}
  75. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/multidim-subscript.cxx)
  76. try_compile(
  77. PQXX_HAVE_CHARCONV_FLOAT
  78. ${PROJECT_BINARY_DIR}
  79. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/charconv_float.cxx)
  80. try_compile(
  81. PQXX_HAVE_CHARCONV_INT
  82. ${PROJECT_BINARY_DIR}
  83. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/charconv_int.cxx)
  84. try_compile(
  85. PQXX_HAVE_PATH
  86. ${PROJECT_BINARY_DIR}
  87. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/fs.cxx)
  88. try_compile(
  89. PQXX_HAVE_THREAD_LOCAL
  90. ${PROJECT_BINARY_DIR}
  91. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/thread_local.cxx)
  92. try_compile(
  93. PQXX_HAVE_SLEEP_FOR
  94. ${PROJECT_BINARY_DIR}
  95. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/sleep_for.cxx)
  96. try_compile(
  97. PQXX_HAVE_STRERROR_R
  98. ${PROJECT_BINARY_DIR}
  99. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/strerror_r.cxx)
  100. try_compile(
  101. PQXX_HAVE_STRERROR_S
  102. ${PROJECT_BINARY_DIR}
  103. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/strerror_s.cxx)
  104. try_compile(
  105. PQXX_HAVE_YEAR_MONTH_DAY
  106. ${PROJECT_BINARY_DIR}
  107. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/year_month_day.cxx)
  108. try_compile(
  109. PQXX_HAVE_CMP
  110. ${PROJECT_BINARY_DIR}
  111. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/cmp.cxx)
  112. try_compile(
  113. need_fslib
  114. ${PROJECT_BINARY_DIR}
  115. SOURCES ${PROJECT_SOURCE_DIR}/config-tests/need_fslib.cxx)
  116. if(!need_fslib)
  117. # TODO: This may work for gcc 8, but some clang versions may need -lc++fs.
  118. link_libraries(stdc++fs)
  119. endif()
  120. # check_cxx_source_compiles requires CMAKE_REQUIRED_DEFINITIONS to specify
  121. # compiling arguments.
  122. # Workaround: Pop CMAKE_REQUIRED_DEFINITIONS
  123. if(def)
  124. set(CMAKE_REQUIRED_DEFINITIONS ${def})
  125. unset(def CACHE)
  126. else()
  127. unset(CMAKE_REQUIRED_DEFINITIONS CACHE)
  128. endif()
  129. set(CMAKE_REQUIRED_QUIET OFF)
  130. set(AC_CONFIG_H_IN "${PROJECT_SOURCE_DIR}/include/pqxx/config.h.in")
  131. set(CM_CONFIG_H_IN "${PROJECT_BINARY_DIR}/include/pqxx/config_cmake.h.in")
  132. set(CM_CONFIG_PUB "${PROJECT_BINARY_DIR}/include/pqxx/config-public-compiler.h")
  133. set(CM_CONFIG_INT "${PROJECT_BINARY_DIR}/include/pqxx/config-internal-compiler.h")
  134. set(CM_CONFIG_PQ "${PROJECT_BINARY_DIR}/include/pqxx/config-internal-libpq.h")
  135. message(STATUS "Generating config.h")
  136. file(WRITE "${CM_CONFIG_H_IN}" "")
  137. file(STRINGS "${AC_CONFIG_H_IN}" lines)
  138. foreach(line ${lines})
  139. string(REGEX REPLACE "^#undef" "#cmakedefine" l "${line}")
  140. file(APPEND "${CM_CONFIG_H_IN}" "${l}\n")
  141. endforeach()
  142. configure_file("${CM_CONFIG_H_IN}" "${CM_CONFIG_INT}" @ONLY)
  143. configure_file("${CM_CONFIG_H_IN}" "${CM_CONFIG_PUB}" @ONLY)
  144. configure_file("${CM_CONFIG_H_IN}" "${CM_CONFIG_PQ}" @ONLY)
  145. message(STATUS "Generating config.h - done")