-
-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
194 lines (165 loc) · 6.63 KB
/
Copy pathCMakeLists.txt
File metadata and controls
194 lines (165 loc) · 6.63 KB
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# SPDX-FileCopyrightText: (C) 2020-2025 Daniel Nicoletti <dantti12@gmail.com>
# SPDX-License-Identifier: MIT
cmake_minimum_required(VERSION 3.28)
project(libasql
VERSION 1.0.0
LANGUAGES CXX
)
include(GNUInstallDirs)
include(GenerateExportHeader)
find_package(QT NAMES Qt6 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} 6.5.0 COMPONENTS Core REQUIRED)
set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
# Include our cmake modules
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
# As moc files are generated in the binary dir, tell CMake
# to always look for includes there:
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
if (APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# AppleClang uses libc++ by default; be explicit for consistency.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
endif()
# Qt 6.5.0–6.5.4 still use stdext::make_checked_array_iterator on MSVC; VS 18
# removed it. Force-include a shim so builds with the project minimum Qt work.
# Limit to CXX so C sources (e.g. sqlite3.c) do not pull in the C++ STL.
if (MSVC AND QT_VERSION VERSION_LESS "6.5.5")
add_compile_options(
"$<$<COMPILE_LANGUAGE:CXX>:/FI${CMAKE_CURRENT_SOURCE_DIR}/cmake/msvc_stdext_shim.h>")
endif()
#
# Options
#
option(ASQL_ENABLE_MAINTAINER_CFLAGS "Enable maintainer CFlags" OFF)
option(ASQL_DRIVER_SQLITE "Enable Sqlite Driver" ON)
if (ASQL_DRIVER_SQLITE)
find_package(SQLite3 QUIET)
if (NOT SQLite3_FOUND)
# No system SQLite3 package found; download the pre-built amalgamation from
# sqlite.org via FetchContent. The version and year are exposed as cache
# variables so they can be overridden when a newer release is available.
# Version number format: M*1000000 + X*1000 + Y*100 (e.g. 3.49.1 -> 3049100)
set(ASQL_SQLITE3_VERSION "3490100" CACHE STRING
"SQLite3 amalgamation version number for FetchContent (see https://www.sqlite.org/download.html)")
set(ASQL_SQLITE3_YEAR "2025" CACHE STRING
"Release year of ASQL_SQLITE3_VERSION (required for the sqlite.org download URL)")
message(STATUS "SQLite3: system package not found; fetching amalgamation ${ASQL_SQLITE3_VERSION} from sqlite.org")
include(FetchContent)
FetchContent_Declare(
sqlite3_amalgamation
URL "https://www.sqlite.org/${ASQL_SQLITE3_YEAR}/sqlite-amalgamation-${ASQL_SQLITE3_VERSION}.zip"
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
)
FetchContent_MakeAvailable(sqlite3_amalgamation)
enable_language(C)
# Store paths as variables so src/CMakeLists.txt can compile sqlite3.c
# directly into the plugin target instead of creating a separate library
# (a separate library would need to be exported alongside the plugin).
set(ASQL_SQLITE3_BUNDLED_SRC "${sqlite3_amalgamation_SOURCE_DIR}/sqlite3.c")
set(ASQL_SQLITE3_BUNDLED_INC "${sqlite3_amalgamation_SOURCE_DIR}")
endif()
endif ()
option(ASQL_DRIVER_POSTGRES "Enable PostgreSql Driver" ON)
if (ASQL_DRIVER_POSTGRES)
find_package(PostgreSQL REQUIRED)
endif ()
option(ASQL_DRIVER_MYSQL "Enable MySQL Driver" ON)
if (ASQL_DRIVER_MYSQL)
find_package(MySQL REQUIRED)
endif ()
option(ASQL_DRIVER_ODBC "Enable unixODBC Driver" ON)
if (ASQL_DRIVER_ODBC)
find_package(ODBC REQUIRED)
endif ()
# NONE
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX
"/usr" CACHE PATH "asql default install prefix" FORCE)
endif()
set(CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}" CACHE PATH "Output directory for libraries")
option(BUILD_SHARED_LIBS "Build in shared lib mode" ON)
option(ASQL_BUILD_DEMOS "Build the demos" ON)
option(ASQL_MIGRATION_TOOL "Build the migration tool executable" ON)
#
# Custom C flags
#
if (ASQL_ENABLE_MAINTAINER_CFLAGS)
set (MAINTAINER_CFLAGS "-Werror -Wall -Wcast-align -Wno-uninitialized -Wempty-body -Wformat-security -Wformat -Winit-self")
add_definitions(${MAINTAINER_CFLAGS}
-DQT_DEPRECATED_WARNINGS
)
endif ()
function(project_target_compile_definitions target)
target_compile_definitions(${target}
PRIVATE
QT_NO_KEYWORDS
QT_NO_CAST_TO_ASCII
QT_NO_CAST_FROM_ASCII
QT_STRICT_ITERATORS
QT_NO_URL_CAST_FROM_STRING
QT_NO_CAST_FROM_BYTEARRAY
QT_USE_QSTRINGBUILDER
QT_NO_SIGNALS_SLOTS_KEYWORDS
QT_USE_FAST_OPERATOR_PLUS
QT_DISABLE_DEPRECATED_BEFORE=0x060400
)
endfunction()
# cmake config files
set(ASQL_CMAKE_PACKAGE_NAME "ASql${PROJECT_VERSION_MAJOR}Qt${QT_VERSION_MAJOR}")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/asqlqt-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${ASQL_CMAKE_PACKAGE_NAME}Config.cmake
@ONLY
)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/asqlqt-config-version.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${ASQL_CMAKE_PACKAGE_NAME}ConfigVersion.cmake
@ONLY
)
install(
FILES
${CMAKE_CURRENT_BINARY_DIR}/${ASQL_CMAKE_PACKAGE_NAME}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${ASQL_CMAKE_PACKAGE_NAME}ConfigVersion.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${ASQL_CMAKE_PACKAGE_NAME}/
)
install(EXPORT ASqlTargets
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${ASQL_CMAKE_PACKAGE_NAME}/
FILE ${ASQL_CMAKE_PACKAGE_NAME}Targets.cmake
NAMESPACE ASql::
COMPONENT Devel
)
add_subdirectory(src)
if (ASQL_BUILD_DEMOS)
add_subdirectory(demos)
endif ()
include(CTest)
if (BUILD_TESTING)
add_subdirectory(tests)
endif()
# ── Doxygen docs target ───────────────────────────────────────────────────────
find_package(Doxygen QUIET)
if (Doxygen_FOUND)
set(DOXYGEN_OUTPUT_DIR "${CMAKE_BINARY_DIR}/docs")
# Optional Qt tag file — can be provided via -DDOCS_QTDOCSDIR=<path>
set(DOXYGEN_QT_TAGFILE "")
if (DEFINED DOCS_QTDOCSDIR)
if (EXISTS "${DOCS_QTDOCSDIR}/qtcore/qtcore.tags")
set(DOXYGEN_QT_TAGFILE "${DOCS_QTDOCSDIR}/qtcore/qtcore.tags")
endif()
endif()
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in"
"${CMAKE_BINARY_DIR}/Doxyfile"
@ONLY
)
add_custom_target(docs
COMMAND ${DOXYGEN_EXECUTABLE} "${CMAKE_BINARY_DIR}/Doxyfile"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
COMMENT "Generating API documentation with Doxygen"
VERBATIM
)
endif()
include(CPackConfig)