-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCMakeLists.txt
142 lines (123 loc) · 5.4 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
cmake_minimum_required (VERSION 3.14)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Define _WIN32_WINNT to be at least Windows 8.1
# (Needed for virtual memory management)
add_compile_definitions(_WIN32_WINNT=0x0603)
if (MSVC)
add_compile_options(/Zc:__cplusplus)
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
project (libgeodesk)
# TODO: What should be the default?
set(BUILD_SHARED_LIBS OFF)
option(GEODESK_PYTHON "Build GeoDesk with Python support" OFF)
option(GEODESK_PYTHON_WHEELS "Enable Support for Python Wheels" OFF)
option(GEODESK_EXAMPLES "Build example applications" ON)
option(GEODESK_MULTITHREADED "Allow multiple threads to use the same GOL" OFF)
# Option to choose between static or shared library
# Only set the option if BUILD_SHARED_LIBS is not already defined
if (NOT DEFINED BUILD_SHARED_LIBS)
option(BUILD_SHARED_LIBS "Build shared library" ON)
endif()
include(FetchContent)
FetchContent_Declare(boost_crc
GIT_REPOSITORY https://github.com/boostorg/crc.git
GIT_TAG boost-1.86.0
)
FetchContent_MakeAvailable(boost_crc)
set(PREVIOUS_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
set(BUILD_SHARED_LIBS OFF)
set(CATCH_BUILD_STATIC_LIBRARY ON)
# Fetch Catch2 from its GitHub repository
FetchContent_Declare(Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.7.1
)
FetchContent_MakeAvailable(Catch2)
set(BUILD_SHARED_LIBS ${PREVIOUS_BUILD_SHARED_LIBS})
# Set the CMAKE_CXX_FLAGS_RELWITHDEBINFO variable to remove the NDEBUG definition
# This approach ensures that assertions are enabled in RelWithDebInfo configuration
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -U NDEBUG")
file(GLOB_RECURSE SOURCE_FILES "src/*.cpp")
# Create the library
add_library(geodesk ${SOURCE_FILES})
if(GEODESK_MULTITHREADED)
message(STATUS "GeoDesk: Multi-threaded query access")
target_compile_definitions(geodesk PUBLIC GEODESK_MULTITHREADED)
else()
message(STATUS "GeoDesk: Single-threaded query access")
endif()
target_compile_features(geodesk INTERFACE cxx_std_20)
set_target_properties(geodesk PROPERTIES CXX_VISIBILITY_PRESET hidden)
set(INCLUDES include src ${boost_crc_SOURCE_DIR}/include)
if(GEODESK_WITH_GEOS)
message(STATUS "GeoDesk: Building with GEOS support.")
target_compile_definitions(geodesk PUBLIC GEODESK_WITH_GEOS)
if(NOT DEFINED GEOS_INCLUDE_PATHS)
message(FATAL_ERROR "GeoDesk: GEOS_INCLUDE_PATHS must be set to the location of GEOS.")
endif()
message(STATUS "GEOS_INCLUDE_PATHS = ${GEOS_INCLUDE_PATHS}")
list(APPEND INCLUDES ${GEOS_INCLUDE_PATHS})
target_link_libraries(geodesk PUBLIC geos geos_c)
else()
message(STATUS "GeoDesk: Building *without* GEOS support.")
endif()
message(STATUS "GeoDesk: INCLUDES = ${INCLUDES}")
if(GEODESK_PYTHON)
target_compile_definitions(geodesk PUBLIC GEODESK_PYTHON)
# Use Python paths set by cibuildwheel if available
if(DEFINED ENV{CIBW_PYTHON_INCLUDE} AND DEFINED ENV{CIBW_PYTHON_LIBRARIES})
message(STATUS "GeoDesk: Using Python settings from CIBuildWheels")
set(Python_INCLUDE_DIRS $ENV{CIBW_PYTHON_INCLUDE})
set(Python_LIBRARIES $ENV{CIBW_PYTHON_LIBRARIES})
else()
# Fallback to standard CMake Python find
#if(GEODESK_PYTHON_WHEELS)
# message(STATUS "GeoDesk: Building with Python support (PythonExtensions).")
# find_package(PythonExtensions REQUIRED)
#else()
message(STATUS "GeoDesk: Building with Python support (Development).")
find_package(Python REQUIRED COMPONENTS Development.Module)
#endif()
endif()
message(STATUS "Python_INCLUDE_DIRS: ${Python_INCLUDE_DIRS}")
message(STATUS "Python_LIBRARIES: ${Python_LIBRARIES}")
target_include_directories(geodesk PUBLIC ${Python_INCLUDE_DIRS})
target_link_libraries(geodesk PUBLIC ${Python_LIBRARIES})
endif()
# Ensure correct export/import of symbols for shared libraries
if(BUILD_SHARED_LIBS)
message(STATUS "GeoDesk: Building dynamic library")
target_compile_definitions(geodesk PUBLIC GEODESK_SHARED)
target_compile_definitions(geodesk PRIVATE GEODESK_EXPORTS)
else()
message(STATUS "GeoDesk: Building static library")
endif()
message(STATUS "GeoDesk: Extra include paths: ${GEODESK_EXTRA_INCLUDE_DIRS}")
target_include_directories(geodesk PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_include_directories(geodesk PRIVATE ${GEODESK_EXTRA_INCLUDE_DIRS} src ${boost_crc_SOURCE_DIR}/include)
# Define where the library and public headers should be installed
install(TARGETS geodesk
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/
DESTINATION include
FILES_MATCHING PATTERN "*.h")
if(NOT GEODESK_PYTHON AND NOT BUILD_SHARED_LIBS)
# Define a simple test target (optional)
enable_testing()
file(GLOB_RECURSE TEST_SOURCE_FILES "test/*.cpp")
add_executable(geodesk-test ${TEST_SOURCE_FILES})
# add_executable(geodesk-test test/test_main.cpp test/test_concur.cpp)
target_include_directories(geodesk-test PRIVATE include src ${Catch2_SOURCE_DIR})
target_link_libraries(geodesk-test geodesk Catch2::Catch2WithMain) # or zlib for shared
add_test(NAME geodesk-test COMMAND geodesk-test)
if(GEODESK_EXAMPLES)
add_subdirectory(examples)
endif()
endif()