gdal/autotest/cpp/CMakeLists.txt

327 строки
11 KiB
CMake

# CMake4GDAL project is distributed under MIT license. See accompanying file LICENSE.txt.
find_package(GTest 1.10.0)
if(GTest_FOUND)
option(USE_EXTERNAL_GTEST "Compile against external GTest" ON)
else()
option(USE_EXTERNAL_GTEST "Compile against external GTest" OFF)
endif()
if(USE_EXTERNAL_GTEST)
if(NOT GTest_FOUND)
message(FATAL_ERROR "External GTest >= 1.10.0 not found")
endif()
message(STATUS "Using external GTest")
# CMake < 3.20.0 uses GTest::GTest
# CMake >= 3.20 uses GTest::gtest
add_library(gtest_for_gdal INTERFACE IMPORTED)
if(NOT TARGET GTest::gtest)
set_target_properties(gtest_for_gdal PROPERTIES
INTERFACE_LINK_LIBRARIES "GTest::GTest")
else()
set_target_properties(gtest_for_gdal PROPERTIES
INTERFACE_LINK_LIBRARIES "GTest::gtest")
endif()
else()
message(STATUS "Using internal GTest")
#
# Build Google Test
#
# Source https://github.com/google/googletest/blob/master/googletest/README.md
# Download and unpack googletest at configure time
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/googletest/CMakeLists.txt.in
${CMAKE_CURRENT_BINARY_DIR}/googletest-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download)
if(result)
message(FATAL_ERROR "CMake step for googletest failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download)
if(result)
message(FATAL_ERROR "Build step for googletest failed: ${result}")
endif()
# Prevent overriding the parent project's compiler/linker
# settings on Windows
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Add googletest directly to our build. This defines
# the gtest and gtest_main targets.
#option(INSTALL_GTEST "Enable installation of googletest" OFF)
add_subdirectory(
${CMAKE_CURRENT_BINARY_DIR}/googletest-src
${CMAKE_CURRENT_BINARY_DIR}/googletest-build
EXCLUDE_FROM_ALL)
add_library(gtest_for_gdal ALIAS gtest)
endif() # USE_EXTERNAL_GTEST
set(GDAL_ROOT_TEST_DIR "${PROJECT_SOURCE_DIR}/autotest")
add_executable(
gdal_unit_test
gdal_unit_test.cpp
test_alg.cpp
test_cpl.cpp
test_gdal.cpp
test_gdal_aaigrid.cpp
test_gdal_dted.cpp
test_gdal_gtiff.cpp
test_gdal_pixelfn.cpp
test_ogr.cpp
test_ogr_geometry_stealing.cpp
test_ogr_lgpl.cpp
test_ogr_geos.cpp
test_ogr_shape.cpp
test_ogr_swq.cpp
test_osr.cpp
test_osr_pci.cpp
test_osr_ct.cpp
test_osr_proj4.cpp
test_triangulation.cpp
test_marching_squares_contour.cpp
test_marching_squares_polygon.cpp
test_marching_squares_square.cpp
test_marching_squares_tile.cpp)
if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.16)
set_property(TARGET gdal_unit_test PROPERTY UNITY_BUILD OFF)
endif ()
target_link_libraries(gdal_unit_test PRIVATE gtest_for_gdal)
target_link_libraries(gdal_unit_test PRIVATE $<TARGET_NAME:${GDAL_LIB_TARGET_NAME}>)
if(NOT MSVC AND CMAKE_THREAD_LIBS_INIT)
target_link_libraries(gdal_unit_test PRIVATE ${CMAKE_THREAD_LIBS_INIT})
endif()
add_dependencies(gdal_unit_test ${GDAL_LIB_TARGET_NAME} gdal_plugins)
gdal_standard_includes(gdal_unit_test)
target_compile_options(gdal_unit_test PRIVATE ${GDAL_CXX_WARNING_FLAGS})
target_compile_definitions(gdal_unit_test PRIVATE -DGDAL_TEST_ROOT_DIR="${GDAL_ROOT_TEST_DIR}")
target_include_directories(
gdal_unit_test PRIVATE $<TARGET_PROPERTY:appslib,SOURCE_DIR> $<TARGET_PROPERTY:gdal_vrt,SOURCE_DIR>)
if (GDAL_USE_SQLITE3)
target_compile_definitions(gdal_unit_test PRIVATE -DHAVE_SQLITE3)
target_include_directories(
gdal_unit_test PRIVATE $<TARGET_PROPERTY:SQLite::SQLite3,INTERFACE_INCLUDE_DIRECTORIES>)
endif()
target_compile_definitions(gdal_unit_test PRIVATE -DGDAL_TEST_ROOT_DIR="${GDAL_ROOT_TEST_DIR}")
if (GDAL_USE_GEOS)
target_compile_definitions(gdal_unit_test PRIVATE -DHAVE_GEOS=1)
target_link_libraries(gdal_unit_test PRIVATE ${GEOS_TARGET})
endif ()
if (GDAL_USE_CURL)
target_compile_definitions(gdal_unit_test PRIVATE -DHAVE_CURL)
endif ()
target_compile_definitions(gdal_unit_test PRIVATE "-DPROJ_DB_TMPDIR=\"${CMAKE_CURRENT_BINARY_DIR}/proj_db_tmpdir\"" "-DPROJ_GRIDS_PATH=\"${CMAKE_CURRENT_SOURCE_DIR}/../proj_grids\"")
# gtest with lots of assertion can be very slow to build in optimized mode.
# As we don't need optimizations for that unit test, override it with -O0 for gcc-style compilers
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# -D_FORTIFY_SOURCE can't be used with -O0
string(REPLACE "-D_FORTIFY_SOURCE=2" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ")
target_compile_options(gdal_unit_test PRIVATE -O0)
endif()
add_executable(gdallimits gdallimits.c)
gdal_standard_includes(gdallimits)
target_link_libraries(gdallimits PRIVATE $<TARGET_NAME:${GDAL_LIB_TARGET_NAME}>)
include(GdalSetRuntimeEnv)
gdal_set_runtime_env(TEST_ENV)
if (MINGW)
list(APPEND TEST_ENV SKIP_MEM_INTENSIVE_TEST=YES)
endif ()
if (WIN32)
# If running GDAL as a CustomBuild Command os MSBuild, "ERROR bla:" is considered as failing the job. This is rarely
# the intended behavior
list(APPEND TEST_ENV "CPL_ERROR_SEPARATOR=\\;")
endif ()
if (WIN32 OR APPLE)
# Recoding tests in test_cpl.cpp fail on Windows and Mac
list(APPEND TEST_ENV DO_NOT_FAIL_ON_RECODE_ERRORS=YES)
endif ()
macro (register_test_as_custom_target _test_name _binary_name)
if (NOT CMAKE_CROSSCOMPILING OR CMAKE_CROSSCOMPILING_EMULATOR)
add_custom_target(
${_test_name}
COMMAND ${CMAKE_COMMAND} -E env ${TEST_ENV} $<TARGET_FILE:${_binary_name}> ${ARGN}
DEPENDS ${_binary_name})
endif ()
endmacro ()
macro (register_test _test_name _binary_name)
register_test_as_custom_target(${_test_name} ${_binary_name} ${ARGN})
add_test(NAME ${_test_name} COMMAND ${_binary_name} ${ARGN})
set_property(TEST ${_test_name} PROPERTY ENVIRONMENT "${TEST_ENV}")
endmacro ()
register_test(test-unit gdal_unit_test)
include(GdalTestTarget)
gdal_test_target(testblockcache testblockcache.cpp)
target_sources(testblockcache PRIVATE main_gtest.cpp)
target_link_libraries(testblockcache PRIVATE gtest_for_gdal)
register_test(
test-block-cache-1
testblockcache
-check
-co
TILED=YES
--debug
TEST,LOCK
-loops
3
--config
GDAL_RB_LOCK_DEBUG_CONTENTION
YES)
register_test(
test-block-cache-2
testblockcache
-check
-co
TILED=YES
--debug
TEST,LOCK
-loops
3
--config
GDAL_RB_LOCK_DEBUG_CONTENTION
YES
--config
GDAL_RB_LOCK_TYPE
SPIN)
register_test(test-block-cache-3 testblockcache -check -co TILED=YES -migrate)
register_test(test-block-cache-4 testblockcache -check -memdriver)
register_test(
test-block-cache-5
testblockcache
--config
GDAL_BAND_BLOCK_CACHE
HASHSET
-check
-co
TILED=YES
--debug
TEST,LOCK
-loops
3
--config
GDAL_RB_LOCK_DEBUG_CONTENTION
YES)
register_test(
test-block-cache-6
testblockcache
--config
GDAL_BAND_BLOCK_CACHE
HASHSET
-check
-co
TILED=YES
--debug
TEST,LOCK
-loops
3
--config
GDAL_RB_LOCK_DEBUG_CONTENTION
YES
--config
GDAL_RB_LOCK_TYPE
SPIN)
if ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "(x86_64|AMD64)" AND CMAKE_SIZEOF_VOID_P EQUAL 8 AND HAVE_SSE_AT_COMPILE_TIME)
gdal_test_target(testsse2 testsse.cpp)
gdal_test_target(testsse2_emulation testsse.cpp)
target_compile_definitions(testsse2_emulation PRIVATE -DUSE_SSE2_EMULATION -DNO_WARN_USE_SSE2_EMULATION)
register_test(test-sse2 testsse2)
register_test(test-sse2-emulation testsse2_emulation)
if (HAVE_AVX_AT_COMPILE_TIME)
# Do not include in ctest as we aren't sure the target machine support this
gdal_test_target(testssse3 testsse.cpp)
gdal_test_target(testsse4_1 testsse.cpp)
gdal_test_target(testavx2 testsse.cpp)
target_compile_options(testssse3 PRIVATE ${GDAL_SSSE3_FLAG})
target_compile_options(testsse4_1 PRIVATE ${GDAL_SSSE3_FLAG} ${GDAL_SSE41_FLAG})
target_compile_options(testavx2 PRIVATE ${GDAL_AVX2_FLAG})
register_test_as_custom_target(test-ssse3 testssse3)
register_test_as_custom_target(test-sse41 testsse4_1)
register_test_as_custom_target(test-avx2 testavx2)
endif ()
endif ()
macro (gdal_autotest_target _target testlabel _source)
gdal_test_target(${_target} ${_source})
register_test(${testlabel} ${_target} ${ARGN})
endmacro ()
function (gdal_gtest_target _target testlabel _source)
gdal_autotest_target(${_target} ${testlabel} ${_source} ${ARGN})
target_sources(${_target} PRIVATE main_gtest.cpp)
target_link_libraries(${_target} PRIVATE gtest_for_gdal)
endfunction ()
set(QUICKTEST_LIST
test-unit
test-block-cache-1
test-block-cache-2
test-block-cache-3
test-block-cache-4
test-block-cache-5
test-block-cache-6
test-copy-words
test-closed-on-destroy-DM
test-threaded-condition
test-virtual-memory
test-block-cache-write
test-block-cache-limit
test-multi-threaded-writing
test-destroy
test-bug1488
test-log)
gdal_gtest_target(testcopywords test-copy-words testcopywords.cpp)
gdal_gtest_target(testclosedondestroydm test-closed-on-destroy-DM testclosedondestroydm.cpp)
gdal_gtest_target(testthreadcond test-threaded-condition testthreadcond.cpp)
gdal_gtest_target(testvirtualmem test-virtual-memory testvirtualmem.cpp)
gdal_gtest_target(testblockcachewrite test-block-cache-write testblockcachewrite.cpp --debug ON)
gdal_gtest_target(testblockcachelimits test-block-cache-limit testblockcachelimits.cpp --debug ON)
gdal_gtest_target(testmultithreadedwriting test-multi-threaded-writing testmultithreadedwriting.cpp)
gdal_gtest_target(testdestroy test-destroy testdestroy.cpp)
gdal_autotest_target(test_include_from_c_file test-include-from-C-file test_include_from_c_file.c "")
gdal_autotest_target(test_c_include_from_cpp_file test-C-include-from-CPP-file test_c_include_from_cpp_file.cpp "")
gdal_gtest_target(bug1488 test-bug1488 bug1488.cpp)
gdal_gtest_target(testlog test-log testlog.cpp)
if (UNIX)
list(APPEND QUICKTEST_LIST test-osr-set-proj-search-paths)
gdal_gtest_target(test_osr_set_proj_search_paths test-osr-set-proj-search-paths test_osr_set_proj_search_paths.cpp)
endif()
if (UNIX)
gdal_gtest_target(proj_with_fork test-proj-with-fork proj_with_fork.cpp)
list(APPEND QUICKTEST_LIST test-proj-with-fork)
endif ()
if (NOT CMAKE_CROSSCOMPILING OR CMAKE_CROSSCOMPILING_EMULATOR)
add_custom_target(quicktest DEPENDS ${QUICKTEST_LIST})
endif ()
foreach (_test IN LISTS QUICKTEST_LIST)
set_tests_properties(${_test} PROPERTIES LABELS "quicktest")
endforeach ()