267 lines
8.2 KiB
CMake
267 lines
8.2 KiB
CMake
# CMake4GDAL project is distributed under MIT license. See accompanying file LICENSE.txt.
|
|
include(cmake/helpers/GdalCMakeMinimumRequired.cmake)
|
|
cmake_minimum_required(VERSION ${GDAL_CMAKE_VERSION_MIN}...${GDAL_CMAKE_VERSION_MAX})
|
|
|
|
project(gdal LANGUAGES C CXX)
|
|
|
|
set(GDAL_LIB_TARGET_NAME GDAL)
|
|
|
|
#
|
|
# setup cmake modules paths
|
|
include(cmake/modules/init.cmake)
|
|
|
|
#
|
|
# template files path
|
|
set(GDAL_CMAKE_TEMPLATE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/template)
|
|
#
|
|
# Custom global properties
|
|
define_property(
|
|
GLOBAL
|
|
PROPERTY GDAL_FORMATS
|
|
BRIEF_DOCS "Builtin format"
|
|
FULL_DOCS "Builtin format")
|
|
define_property(
|
|
GLOBAL
|
|
PROPERTY OGR_FORMATS
|
|
BRIEF_DOCS "Builtin ogr drivers"
|
|
FULL_DOCS "Builtin ogr drivers")
|
|
define_property(
|
|
GLOBAL
|
|
PROPERTY PLUGIN_MODULES
|
|
BRIEF_DOCS "Plugin modules"
|
|
FULL_DOCS "Plugin modules")
|
|
define_property(
|
|
TARGET
|
|
PROPERTY PLUGIN_OUTPUT_DIR
|
|
BRIEF_DOCS "Plugin modules build directories"
|
|
FULL_DOCS "Plugin modules build directories")
|
|
|
|
include(GdalCAndCXXStandards)
|
|
include(CheckCompilerMachineOption)
|
|
include(CheckCompilerSIMDFeature)
|
|
|
|
option(USE_PRECOMPILED_HEADERS "Use precompiled headers (does not work with MSVC)" OFF)
|
|
if (USE_PRECOMPILED_HEADERS AND MSVC)
|
|
message(FATAL_ERROR "USE_PRECOMPILED_HEADERS=ON does not currently work with Visual Studio C++ compiler")
|
|
endif()
|
|
|
|
include(Ccache)
|
|
|
|
#
|
|
if ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "(x86|AMD64)")
|
|
check_compiler_machine_option(flag SSE)
|
|
if (NOT ${flag} STREQUAL "")
|
|
set(HAVE_SSE_AT_COMPILE_TIME 1)
|
|
add_definitions(-DHAVE_SSE_AT_COMPILE_TIME)
|
|
if (NOT ${flag} STREQUAL " ")
|
|
set(GDAL_SSE_FLAG ${flag})
|
|
endif ()
|
|
endif ()
|
|
|
|
check_compiler_machine_option(flag SSE2)
|
|
if (NOT ${flag} STREQUAL "")
|
|
set(HAVE_SSE2_AT_COMPILE_TIME 1)
|
|
if (NOT ${flag} STREQUAL " ")
|
|
set(GDAL_SSE2_FLAG ${flag})
|
|
endif ()
|
|
endif ()
|
|
|
|
check_compiler_machine_option(flag SSSE3)
|
|
if (NOT ${flag} STREQUAL "")
|
|
set(HAVE_SSSE3_AT_COMPILE_TIME 1)
|
|
add_definitions(-DHAVE_SSSE3_AT_COMPILE_TIME)
|
|
if (NOT ${flag} STREQUAL " ")
|
|
set(GDAL_SSSE3_FLAG ${flag})
|
|
endif ()
|
|
endif ()
|
|
|
|
check_compiler_machine_option(flag SSE4_1)
|
|
if (NOT ${flag} STREQUAL "")
|
|
set(HAVE_SSE41_AT_COMPILE_TIME 1)
|
|
if (NOT ${flag} STREQUAL " ")
|
|
set(GDAL_SSE41_FLAG ${flag})
|
|
endif ()
|
|
endif ()
|
|
|
|
check_compiler_machine_option(flag AVX)
|
|
if (NOT ${flag} STREQUAL "")
|
|
set(HAVE_AVX_AT_COMPILE_TIME 1)
|
|
add_definitions(-DHAVE_AVX_AT_COMPILE_TIME)
|
|
if (NOT ${flag} STREQUAL " ")
|
|
set(GDAL_AVX_FLAG ${flag})
|
|
endif ()
|
|
endif ()
|
|
|
|
check_compiler_machine_option(flag AVX2)
|
|
if (NOT ${flag} STREQUAL "")
|
|
set(HAVE_AVX2_AT_COMPILE_TIME 1)
|
|
if (NOT ${flag} STREQUAL " ")
|
|
set(GDAL_AVX2_FLAG ${flag})
|
|
endif ()
|
|
endif ()
|
|
|
|
else()
|
|
|
|
# Check ability to use Arm Neon optimizations
|
|
include(CheckCXXSourceCompiles)
|
|
include(CMakePushCheckState)
|
|
cmake_push_check_state(RESET)
|
|
set(CMAKE_REQUIRED_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/gcore")
|
|
check_cxx_source_compiles("#include \"include_sse2neon.h\"\nint main() { return 0; }" SSE2NEON_COMPILES)
|
|
cmake_pop_check_state()
|
|
|
|
endif ()
|
|
#
|
|
option(CLANG_TIDY_ENABLED "Run clang-tidy with the compiler." OFF)
|
|
set(CLANG_TIDY_CHECKS
|
|
"-*,clang-analyzer-alpha.unix.cstring.*"
|
|
CACHE STRING "clang-tidy checks")
|
|
set(CLANG_TIDY_WARNINGS_AS_ERRORS
|
|
"clang-analyzer-alpha.unix.cstring.*"
|
|
CACHE STRING "clang-tidy warnings as errors.")
|
|
if (RUN_CLANG_TIDY)
|
|
if (PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
|
|
message(FATAL_ERROR "RUN_CLANG_TIDY requires an out-of-source build!")
|
|
endif ()
|
|
find_program(CLANG_TIDY_COMMAND NAMES clang-tidy)
|
|
if (NOT CLANG_TIDY_COMMAND)
|
|
message(WARNING "RUN_CLANG_TIDY is ON but clang-tidy is not found!")
|
|
set(CMAKE_CXX_CLANG_TIDY)
|
|
else ()
|
|
set(CMAKE_CXX_CLANG_TIDY
|
|
"${CLANG_TIDY_COMMAND}" "-checks='${CLANG_TIDY_CHECKS}'" "-header-filter='${PROJECT_SOURCE_DIR}/*'"
|
|
"-warnings-as-errors='${CLANG_TIDY_WARNINGS_AS_ERRORS}'")
|
|
endif ()
|
|
endif ()
|
|
|
|
if (APPLE)
|
|
# To avoid the issue mentioned at
|
|
# https://stackoverflow.com/questions/36523911/osx-homebrew-cmake-libpng-version-mismatch-issue on github action
|
|
# MacOSX workers that have the Mono framework installed, whose libpng headers will be used instead of the homebrew
|
|
# ones
|
|
get_property(
|
|
result
|
|
CACHE CMAKE_FIND_FRAMEWORK
|
|
PROPERTY TYPE)
|
|
if (NOT result)
|
|
set(CMAKE_FIND_FRAMEWORK LAST)
|
|
message(STATUS "Setting CMAKE_FIND_FRAMEWORK=${CMAKE_FIND_FRAMEWORK}")
|
|
endif ()
|
|
endif ()
|
|
|
|
#
|
|
# Developer may want to specify some variable to find proper version.
|
|
# ~~~
|
|
# Priority is as same order as follows:
|
|
# 1. `Python_LOOKUP_VERSION`: specify major.minor version to find.
|
|
# 2. 'Python_FIND_VIRTUALENV': specify 'ONLY' to use virtualenv activated.
|
|
# 3. `Python_ROOT`: specify installed location.
|
|
# 4. If nothing specified, use default behavior.
|
|
#
|
|
# for example
|
|
# $ cmake -DPython_LOOKUP_VERSION=3.8.0 ..
|
|
# $ cmake -DPython_FIND_VIRTUALENV=ONLY ..
|
|
# $ cmake -DPython_ROOT=C:\Python38 ..
|
|
# ~~~
|
|
#
|
|
include(FeatureSummary)
|
|
|
|
find_package(SWIG)
|
|
set_package_properties(
|
|
SWIG PROPERTIES
|
|
DESCRIPTION
|
|
"Software development tool that connects programs written in C and C++ with a variety of high-level programming languages."
|
|
URL "http://swig.org/"
|
|
TYPE RECOMMENDED)
|
|
|
|
# Workaround Intel MKL library outputting a message in stdout, which cause
|
|
# incorrect detection of numpy.get_include() and numpy.__version__
|
|
# See https://github.com/numpy/numpy/issues/23775
|
|
# Fix also proposed to upstream CMake FindPython per
|
|
# https://gitlab.kitware.com/cmake/cmake/-/merge_requests/9359/
|
|
if(DEFINED ENV{MKL_ENABLE_INSTRUCTIONS})
|
|
set(BACKUP_ENV_VAR_MKL_ENABLE_INSTRUCTIONS ENV{MKL_ENABLE_INSTRUCTIONS})
|
|
endif()
|
|
set(ENV{MKL_ENABLE_INSTRUCTIONS} "SSE4_2")
|
|
|
|
if (Python_LOOKUP_VERSION)
|
|
set(Python_FIND_STRATEGY VERSION)
|
|
find_package(Python ${Python_LOOKUP_VERSION} EXACT COMPONENTS Interpreter Development NumPy)
|
|
else ()
|
|
set(Python_FIND_STRATEGY LOCATION)
|
|
find_package(Python 3.8 COMPONENTS Interpreter Development NumPy)
|
|
endif ()
|
|
set_package_properties(Python PROPERTIES PURPOSE "SWIG_PYTHON: Python binding")
|
|
|
|
if (Python_Interpreter_FOUND)
|
|
file(
|
|
GENERATE
|
|
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/python_executable.txt"
|
|
CONTENT "${Python_EXECUTABLE}")
|
|
if(NOT Python_NumPy_FOUND)
|
|
# Detect numpy
|
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/get_numpy.py
|
|
"try:\n import numpy\n print(numpy.get_include())\nexcept:\n pass\n")
|
|
execute_process(
|
|
COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/get_numpy.py
|
|
OUTPUT_VARIABLE _numpy_include
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
if (NOT _numpy_include STREQUAL "")
|
|
set(Python_NumPy_FOUND TRUE)
|
|
set(Python_NumPy_INCLUDE_DIRS ${Python_NumPy_INCLUDE_DIRS})
|
|
endif ()
|
|
endif()
|
|
endif()
|
|
|
|
# Restore previous value of MKL_ENABLE_INSTRUCTIONS
|
|
if(DEFINED BACKUP_ENV_VAR_MKL_ENABLE_INSTRUCTIONS)
|
|
set(ENV{MKL_ENABLE_INSTRUCTIONS} ${BACKUP_ENV_VAR_MKL_ENABLE_INSTRUCTIONS})
|
|
else()
|
|
unset(ENV{MKL_ENABLE_INSTRUCTIONS})
|
|
endif()
|
|
|
|
|
|
if (SWIG_FOUND AND (Python_Interpreter_FOUND OR Python_FOUND))
|
|
option(BUILD_PYTHON_BINDINGS "Build Python bindings" ON)
|
|
else()
|
|
option(BUILD_PYTHON_BINDINGS "Build Python bindings" OFF)
|
|
endif()
|
|
|
|
if (BUILD_PYTHON_BINDINGS)
|
|
if (NOT (Python_Interpreter_FOUND OR Python_FOUND))
|
|
message(FATAL_ERROR "Python is a requirement to build the Python bindings")
|
|
endif()
|
|
if (NOT SWIG_FOUND)
|
|
message(FATAL_ERROR "SWIG is a requirement to build the Python bindings")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_TESTING "Build the testing tree." ON)
|
|
# Make sure enable_testing() is defined before including gdal.cmake for
|
|
# Java and CSharp tests
|
|
if (BUILD_TESTING)
|
|
enable_testing()
|
|
endif()
|
|
|
|
#
|
|
include(${CMAKE_CURRENT_SOURCE_DIR}/gdal.cmake)
|
|
|
|
if (BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/autotest")
|
|
# unit tests
|
|
add_subdirectory(autotest/cpp)
|
|
if(BUILD_PYTHON_BINDINGS)
|
|
add_subdirectory(autotest)
|
|
endif()
|
|
endif ()
|
|
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/fuzzers")
|
|
# Google OSS-Fuzz project utilities
|
|
add_subdirectory(fuzzers)
|
|
if (BUILD_TESTING)
|
|
add_subdirectory(fuzzers/tests)
|
|
endif()
|
|
endif()
|
|
if (BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/perftests")
|
|
add_subdirectory(perftests)
|
|
endif ()
|
|
# vim: ts=4 sw=4 sts=4 et
|