| # This CMake module is supposed to give similar results to the | |
| # AC_USE_SYSTEM_EXTENSIONS Autoconf macro, which turns on a load of | |
| # system feature-check macros, including _ALL_SOURCE, _GNU_SOURCE, | |
| # _NETBSD_SOURCE, and many more. | |
| # | |
| # Because PCRE2 uses so few OS features, we don't seem to actually need to | |
| # enable many of these. Modern platforms with CMake users generally enable | |
| # all the basic POSIX features by default. | |
| # | |
| # So far, we know that we require: | |
| # - _ALL_SOURCE on IBM systems (z/OS, probably AIX) in order to call | |
| # getrlimit() in pcre2test. | |
| # - _GNU_SOURCE on Linux in order to call mkostemp() in some (non-default) | |
| # configurations of the JIT. | |
| # | |
| # Autoconf enables this unconditionally. However, our CMake script potentially | |
| # supports *more* platforms than Autoconf, so we use a feature check. | |
| function(pcre2_use_system_extensions) | |
| if(WIN32) | |
| return() | |
| endif() | |
| set(first_run FALSE) | |
| set(found_macro FALSE) | |
| if(NOT DEFINED HAVE_GETRLIMIT_NAKED) | |
| set(first_run TRUE) | |
| message(STATUS "Detecting platform feature test macros") | |
| endif() | |
| include(CheckSymbolExists) | |
| include(CheckCSourceCompiles) | |
| include(CMakePushCheckState) | |
| cmake_push_check_state(RESET) | |
| set( | |
| _pcre2_test_src | |
| [=[ | |
| #include <sys/time.h> | |
| #include <sys/resource.h> | |
| int main(void) { | |
| struct rlimit rlim; | |
| getrlimit(RLIMIT_STACK, &rlim); | |
| return 0; | |
| } | |
| ]=] | |
| ) | |
| set(CMAKE_REQUIRED_QUIET TRUE) | |
| check_c_source_compiles("${_pcre2_test_src}" HAVE_GETRLIMIT_NAKED) | |
| if(NOT HAVE_GETRLIMIT_NAKED) | |
| # Try again with _ALL_SOURCE | |
| set(CMAKE_REQUIRED_DEFINITIONS "-D_ALL_SOURCE") | |
| check_c_source_compiles("${_pcre2_test_src}" HAVE_GETRLIMIT_ALLSOURCE) | |
| unset(CMAKE_REQUIRED_DEFINITIONS) | |
| if(HAVE_GETRLIMIT_ALLSOURCE) | |
| add_compile_definitions(_ALL_SOURCE) | |
| set(found_macro TRUE) | |
| if(first_run) | |
| message(STATUS "Detecting platform feature test macros - _ALL_SOURCE") | |
| endif() | |
| endif() | |
| endif() | |
| check_symbol_exists(mkostemp stdlib.h HAVE_MKOSTEMP_NAKED) | |
| if(NOT HAVE_MKOSTEMP_NAKED) | |
| # Try again with _GNU_SOURCE | |
| set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE") | |
| check_symbol_exists(mkostemp stdlib.h HAVE_MKOSTEMP_GNUSOURCE) | |
| unset(CMAKE_REQUIRED_DEFINITIONS) | |
| if(HAVE_MKOSTEMP_GNUSOURCE) | |
| add_compile_definitions(_GNU_SOURCE) | |
| set(found_macro TRUE) | |
| if(first_run) | |
| message(STATUS "Detecting platform feature test macros - _GNU_SOURCE") | |
| endif() | |
| endif() | |
| endif() | |
| if(first_run AND NOT found_macro) | |
| message(STATUS "Detecting platform feature test macros - none") | |
| endif() | |
| cmake_pop_check_state() | |
| endfunction() |