372 строки
10 KiB
CMake
372 строки
10 KiB
CMake
# Distributed under the GDAL/OGR MIT style License. See accompanying file LICENSE.TXT.
|
|
|
|
#[=======================================================================[.rst:
|
|
configure
|
|
---------
|
|
|
|
Configure function for GDAL/OGR and generate gdal_config.h
|
|
|
|
#]=======================================================================]
|
|
|
|
# Include all the necessary files for macros
|
|
include(CheckFunctionExists)
|
|
include(CheckIncludeFile)
|
|
include(CheckIncludeFiles)
|
|
include(CheckLibraryExists)
|
|
include(CheckSymbolExists)
|
|
include(CheckTypeSize)
|
|
include(TestBigEndian)
|
|
include(CheckCSourceCompiles)
|
|
include(CheckCXXSourceCompiles)
|
|
# include (CompilerFlags)
|
|
include(CheckCXXSymbolExists)
|
|
|
|
set(GDAL_PREFIX ${CMAKE_INSTALL_PREFIX})
|
|
|
|
if (CMAKE_GENERATOR_TOOLSET MATCHES "v([0-9]+)_xp")
|
|
add_definitions(-D_WIN32_WINNT=0x0501)
|
|
endif ()
|
|
|
|
check_function_exists(vsnprintf HAVE_VSNPRINTF)
|
|
check_function_exists(getcwd HAVE_GETCWD)
|
|
|
|
check_include_file("fcntl.h" HAVE_FCNTL_H)
|
|
check_include_file("unistd.h" HAVE_UNISTD_H)
|
|
check_include_file("sys/types.h" HAVE_SYS_TYPES_H)
|
|
check_include_file("locale.h" HAVE_LOCALE_H)
|
|
check_include_file("xlocale.h" HAVE_XLOCALE_H)
|
|
check_include_file("direct.h" HAVE_DIRECT_H)
|
|
check_include_file("dlfcn.h" HAVE_DLFCN_H)
|
|
|
|
check_type_size("int" SIZEOF_INT)
|
|
check_type_size("unsigned long" SIZEOF_UNSIGNED_LONG)
|
|
check_type_size("long int" SIZEOF_LONG_INT)
|
|
check_type_size("void*" SIZEOF_VOIDP)
|
|
check_type_size("size_t" SIZEOF_SIZE_T)
|
|
|
|
if(MSVC AND NOT BUILD_SHARED_LIBS)
|
|
set(CPL_DISABLE_DLL 1)
|
|
endif()
|
|
|
|
if (MSVC)
|
|
set(HAVE_VSNPRINTF 1)
|
|
|
|
set(HAVE_FCNTL_H 1)
|
|
set(HAVE_UNISTD_H 0)
|
|
set(HAVE_SYS_TYPES_H 1)
|
|
set(HAVE_LOCALE_H 1)
|
|
set(HAVE_SEARCH_H 1)
|
|
set(HAVE_DIRECT_H 1)
|
|
|
|
set(HAVE_LOCALTIME_R 0)
|
|
set(HAVE_DLFCN_H 1)
|
|
|
|
set(VSI_STAT64 _stat64)
|
|
set(VSI_STAT64_T __stat64)
|
|
|
|
# Condition compilation of port/cpl_aws_win32.cpp
|
|
check_include_file_cxx("atlbase.h" HAVE_ATLBASE_H)
|
|
if (NOT HAVE_ATLBASE_H)
|
|
message(WARNING "Missing atlbase.h header: cpl_aws_win32.cpp (detection of AWS EC2 Windows hosts) will be missing")
|
|
endif()
|
|
|
|
else ()
|
|
# linux, mac and mingw/windows
|
|
test_big_endian(WORDS_BIGENDIAN)
|
|
if (MINGW)
|
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
|
endif ()
|
|
find_package(Threads)
|
|
if (Threads_FOUND)
|
|
set(_WITH_PT_OPTION_ON TRUE)
|
|
else ()
|
|
set(_WITH_PT_OPTION_ON FALSE)
|
|
endif ()
|
|
|
|
find_library(M_LIB m)
|
|
mark_as_advanced(M_LIB)
|
|
|
|
option(GDAL_USE_CPL_MULTIPROC_PTHREAD "Set to ON if you want to use pthreads based multiprocessing support."
|
|
${_WITH_PT_OPTION_ON})
|
|
mark_as_advanced(GDAL_USE_CPL_MULTIPROC_PTHREAD)
|
|
set(CPL_MULTIPROC_PTHREAD ${GDAL_USE_CPL_MULTIPROC_PTHREAD})
|
|
check_c_source_compiles(
|
|
"
|
|
#define _GNU_SOURCE
|
|
#include <pthread.h>
|
|
int main() { return (PTHREAD_MUTEX_RECURSIVE); }
|
|
"
|
|
HAVE_PTHREAD_MUTEX_RECURSIVE)
|
|
|
|
check_c_source_compiles(
|
|
"
|
|
#define _GNU_SOURCE
|
|
#include <pthread.h>
|
|
int main() { return (PTHREAD_MUTEX_ADAPTIVE_NP); }
|
|
"
|
|
HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
|
|
|
|
check_c_source_compiles(
|
|
"
|
|
#define _GNU_SOURCE
|
|
#include <pthread.h>
|
|
int main() { pthread_spinlock_t spin; return pthread_spin_lock(&spin); }
|
|
"
|
|
HAVE_PTHREAD_SPIN_LOCK)
|
|
|
|
check_c_source_compiles(
|
|
"
|
|
#define _GNU_SOURCE
|
|
#include <sys/mman.h>
|
|
int main() { return (mremap(0,0,0,0,0) != 0); }
|
|
"
|
|
HAVE_5ARGS_MREMAP)
|
|
|
|
check_c_source_compiles(
|
|
"
|
|
#include <pthread.h>
|
|
int main() { pthread_atfork(0,0,0); 0; }
|
|
"
|
|
HAVE_PTHREAD_ATFORK)
|
|
|
|
check_include_file("sys/stat.h" HAVE_SYS_STAT_H)
|
|
|
|
check_function_exists(readlink HAVE_READLINK)
|
|
check_function_exists(posix_spawnp HAVE_POSIX_SPAWNP)
|
|
check_function_exists(posix_memalign HAVE_POSIX_MEMALIGN)
|
|
check_function_exists(vfork HAVE_VFORK)
|
|
check_function_exists(mmap HAVE_MMAP)
|
|
check_function_exists(sigaction HAVE_SIGACTION)
|
|
check_function_exists(statvfs HAVE_STATVFS)
|
|
check_function_exists(statvfs64 HAVE_STATVFS64)
|
|
check_function_exists(lstat HAVE_LSTAT)
|
|
|
|
check_function_exists(getrlimit HAVE_GETRLIMIT)
|
|
check_symbol_exists(RLIMIT_AS "sys/resource.h" HAVE_RLIMIT_AS)
|
|
|
|
check_function_exists(ftell64 HAVE_FTELL64)
|
|
if (HAVE_FTELL64)
|
|
set(VSI_FTELL64 "ftell64")
|
|
else ()
|
|
check_function_exists(ftello64 HAVE_FTELLO64)
|
|
if (HAVE_FTELLO64)
|
|
set(VSI_FTELL64 "ftello64")
|
|
endif ()
|
|
endif ()
|
|
|
|
check_function_exists(fseek64 HAVE_FSEEK64)
|
|
if (HAVE_FSEEK64)
|
|
set(VSI_FSEEK64 "fseek64")
|
|
else ()
|
|
check_function_exists(fseeko64 HAVE_FSEEKO64)
|
|
if (HAVE_FSEEKO64)
|
|
set(VSI_FSEEK64 "fseeko64")
|
|
endif ()
|
|
endif ()
|
|
|
|
if (NOT VSI_FTELL64 AND NOT VSI_FSEEK64)
|
|
check_c_source_compiles(
|
|
"
|
|
#define _LARGEFILE64_SOURCE
|
|
#include <stdio.h>
|
|
int main() { long long off=0; fseeko64(NULL, off, SEEK_SET); off = ftello64(NULL); return 0; }
|
|
"
|
|
VSI_NEED_LARGEFILE64_SOURCE)
|
|
|
|
if (VSI_NEED_LARGEFILE64_SOURCE)
|
|
set(VSI_FTELL64 "ftello64")
|
|
set(VSI_FSEEK64 "fseeko64")
|
|
endif ()
|
|
endif ()
|
|
|
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
if (NOT VSI_FTELL64 AND NOT VSI_FSEEK64)
|
|
set(VSI_FTELL64 "ftello")
|
|
set(VSI_FSEEK64 "fseeko")
|
|
endif ()
|
|
set(VSI_STAT64 stat)
|
|
set(VSI_STAT64_T stat)
|
|
else ()
|
|
if (NOT VSI_FTELL64 AND NOT VSI_FSEEK64)
|
|
check_function_exists(ftello HAVE_FTELLO)
|
|
if (HAVE_FTELLO)
|
|
set(VSI_FTELL64 "ftello")
|
|
endif ()
|
|
|
|
check_function_exists(fseeko HAVE_FSEEKO)
|
|
if (HAVE_FSEEKO)
|
|
set(VSI_FSEEK64 "fseeko")
|
|
endif ()
|
|
endif ()
|
|
check_function_exists(stat64 HAVE_STAT64)
|
|
if (HAVE_STAT64)
|
|
set(VSI_STAT64 stat64)
|
|
set(VSI_STAT64_T stat64)
|
|
else ()
|
|
set(VSI_STAT64 stat)
|
|
set(VSI_STAT64_T stat)
|
|
endif ()
|
|
endif ()
|
|
|
|
check_c_source_compiles(
|
|
"
|
|
#if defined(__MINGW32__)
|
|
#ifndef __MSVCRT_VERSION__
|
|
#define __MSVCRT_VERSION__ 0x0601
|
|
#endif
|
|
#endif
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
int main() { struct _stat64 buf; _wstat64( \"\", &buf ); return 0; }
|
|
"
|
|
NO_UNIX_STDIO_64)
|
|
|
|
if (NO_UNIX_STDIO_64)
|
|
set(VSI_STAT64 _stat64)
|
|
set(VSI_STAT64_T __stat64)
|
|
endif ()
|
|
|
|
check_function_exists(fopen64 HAVE_FOPEN64)
|
|
if (HAVE_FOPEN64)
|
|
set(VSI_FOPEN64 "fopen64")
|
|
else ()
|
|
set(VSI_FOPEN64 "fopen")
|
|
endif ()
|
|
|
|
check_type_size("off_t" SIZEOF_OFF_T)
|
|
|
|
check_function_exists(pread64 HAVE_PREAD64)
|
|
|
|
check_function_exists(ftruncate64 HAVE_FTRUNCATE64)
|
|
if (HAVE_FTRUNCATE64)
|
|
set(VSI_FTRUNCATE64 "ftruncate64")
|
|
else ()
|
|
set(VSI_FTRUNCATE64 "ftruncate")
|
|
endif ()
|
|
|
|
# For some reason, above tests detect xxxx64 symbols for iOS, which are not
|
|
# available at build time.
|
|
# This is also necessary for Mac Catalyst builds.
|
|
# Cf https://lists.osgeo.org/pipermail/gdal-dev/2022-August/056174.html
|
|
if (${CMAKE_SYSTEM_NAME} MATCHES "iOS" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
set(VSI_FOPEN64 "fopen")
|
|
set(VSI_FTRUNCATE64 "ftruncate")
|
|
set(VSI_FTELL64 "ftell")
|
|
set(VSI_FSEEK64 "fseek")
|
|
set(VSI_STAT64 "stat")
|
|
set(VSI_STAT64_T "stat")
|
|
unset(HAVE_FOPEN64)
|
|
unset(HAVE_FOPEN64 CACHE)
|
|
unset(HAVE_FTRUNCATE64)
|
|
unset(HAVE_FTRUNCATE64 CACHE)
|
|
unset(HAVE_FTELL64)
|
|
unset(HAVE_FTELL64 CACHE)
|
|
unset(HAVE_FSEEK64)
|
|
unset(HAVE_FSEEK64 CACHE)
|
|
unset(HAVE_STATVFS64)
|
|
unset(HAVE_STATVFS64 CACHE)
|
|
unset(HAVE_PREAD64)
|
|
unset(HAVE_PREAD64 CACHE)
|
|
endif()
|
|
|
|
if( NOT HAVE_PREAD64 )
|
|
check_c_source_compiles(
|
|
"
|
|
#include <sys/types.h>
|
|
#include <sys/uio.h>
|
|
#include <unistd.h>
|
|
int main() { pread(0, NULL, 0, 0); return 0; }
|
|
"
|
|
HAVE_PREAD_BSD)
|
|
endif()
|
|
|
|
set(UNIX_STDIO_64 TRUE)
|
|
|
|
set(INCLUDE_XLOCALE_H)
|
|
if(HAVE_XLOCALE_H)
|
|
set(INCLUDE_XLOCALE_H "#include <xlocale.h>")
|
|
endif()
|
|
check_c_source_compiles(
|
|
"
|
|
#define _XOPEN_SOURCE 700
|
|
#include <locale.h>
|
|
${INCLUDE_XLOCALE_H}
|
|
int main() {
|
|
locale_t alocale = newlocale (LC_NUMERIC_MASK, \"C\", 0);
|
|
locale_t oldlocale = uselocale(alocale);
|
|
uselocale(oldlocale);
|
|
freelocale(alocale);
|
|
return 0;
|
|
}
|
|
"
|
|
HAVE_USELOCALE)
|
|
|
|
set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden")
|
|
check_c_source_compiles(
|
|
"
|
|
int visible() { return 0; } __attribute__ ((visibility(\"default\")))
|
|
int hidden() { return 0; }
|
|
int main() { return 0; }
|
|
"
|
|
HAVE_HIDE_INTERNAL_SYMBOLS)
|
|
unset(CMAKE_REQUIRED_FLAGS)
|
|
|
|
check_c_source_compiles(
|
|
"
|
|
int main() { int i; __sync_add_and_fetch(&i, 1); __sync_sub_and_fetch(&i, 1); __sync_bool_compare_and_swap(&i, 0, 1); return 0; }
|
|
"
|
|
HAVE_GCC_ATOMIC_BUILTINS)
|
|
|
|
check_c_source_compiles(
|
|
"
|
|
int main(int argc, char** argv) { (void)__builtin_bswap32(0); (void)__builtin_bswap64(0); return 0; }
|
|
"
|
|
HAVE_GCC_BSWAP)
|
|
|
|
check_c_source_compiles(
|
|
"
|
|
#include <unistd.h>
|
|
int main () { return (sysconf(_SC_PHYS_PAGES)); return 0; }
|
|
"
|
|
HAVE_SC_PHYS_PAGES)
|
|
|
|
check_c_source_compiles(
|
|
"
|
|
#define _GNU_SOURCE
|
|
#include <sched.h>
|
|
int main () { return sched_getaffinity(0,0,0); }
|
|
"
|
|
HAVE_SCHED_GETAFFINITY)
|
|
|
|
include(FindInt128)
|
|
if (INT128_FOUND)
|
|
set(HAVE_UINT128_T TRUE)
|
|
endif ()
|
|
|
|
if (HAVE_HIDE_INTERNAL_SYMBOLS)
|
|
option(GDAL_HIDE_INTERNAL_SYMBOLS "Set to ON to hide internal symbols." ON)
|
|
if (GDAL_HIDE_INTERNAL_SYMBOLS)
|
|
set(USE_GCC_VISIBILITY_FLAG TRUE)
|
|
endif ()
|
|
endif ()
|
|
|
|
message(STATUS "checking if sprintf can be overloaded for GDAL compilation")
|
|
check_cxx_source_compiles(
|
|
"#define _XOPEN_SOURCE\n#include <vector>\n#include <stdio.h>\nextern \"C\"\n {int sprintf(char *str, const char* fmt, ...);}"
|
|
DEPRECATE_SPRINTF)
|
|
if (NOT DEPRECATE_SPRINTF)
|
|
set(DONT_DEPRECATE_SPRINTF 1)
|
|
add_definitions(-DDONT_DEPRECATE_SPRINTF)
|
|
endif ()
|
|
|
|
check_include_file("linux/userfaultfd.h" HAVE_USERFAULTFD_H)
|
|
endif ()
|
|
|
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
set(MACOSX_FRAMEWORK ${GDAL_ENABLE_MACOSX_FRAMEWORK})
|
|
else ()
|
|
set(MACOSX_FRAMEWORK OFF)
|
|
endif ()
|
|
|
|
# vim: ts=4 sw=4 sts=4 et
|