Skip to content

Commit 5c4d59d

Browse files
authored
Merge branch 'rbock:main' into main
2 parents 72d2065 + 1842de0 commit 5c4d59d

146 files changed

Lines changed: 2132 additions & 1758 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CMakeLists.txt

Lines changed: 23 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules)
3333

3434
include(GNUInstallDirs)
3535
include(CTest)
36+
include(Sqlpp23TargetHelper)
3637

3738
option(BUILD_MYSQL_CONNECTOR "Build MySQL Connector" OFF)
3839
option(BUILD_MARIADB_CONNECTOR "Build MariaDB Connector" OFF)
@@ -45,114 +46,55 @@ option(DEPENDENCY_CHECK "Check for dependencies of connector and the library" ON
4546

4647
set(SQLPP23_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/Sqlpp23 CACHE STRING "Path to sqlpp23 cmake files")
4748

48-
### Dependencies
49-
if(DEPENDENCY_CHECK AND BUILD_MYSQL_CONNECTOR)
50-
find_package(MySQL REQUIRED)
51-
endif()
52-
53-
if(DEPENDENCY_CHECK AND BUILD_MARIADB_CONNECTOR)
54-
find_package(MariaDB REQUIRED)
49+
# If we are building without C++20 modules, don't scan the sources for module dependencies
50+
# This speeds up the build process.
51+
if(NOT BUILD_WITH_MODULES)
52+
set(CMAKE_CXX_SCAN_FOR_MODULES OFF)
5553
endif()
5654

57-
if(DEPENDENCY_CHECK AND BUILD_POSTGRESQL_CONNECTOR)
58-
find_package(PostgreSQL REQUIRED)
59-
endif()
55+
### Main (core) library
56+
add_core()
6057

61-
if(DEPENDENCY_CHECK AND BUILD_SQLITE3_CONNECTOR)
62-
find_package(SQLite3 REQUIRED)
63-
endif()
64-
65-
if(DEPENDENCY_CHECK AND BUILD_SQLCIPHER_CONNECTOR)
66-
find_package(SQLCipher REQUIRED)
67-
endif()
68-
69-
### Core targets
70-
include(Sqlpp23TargetHelper)
71-
72-
add_library(sqlpp23 INTERFACE)
73-
add_library(sqlpp23::sqlpp23 ALIAS sqlpp23)
74-
75-
target_include_directories(sqlpp23 INTERFACE
76-
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
77-
)
78-
target_compile_features(sqlpp23 INTERFACE cxx_std_23)
58+
### Mock Database
59+
add_component(NAME mock_db HEADER_DIR mock_db MODULE_INTERFACE sqlpp23.mock_db.cppm NO_INSTALL)
7960

61+
### Connector components
8062
if(BUILD_SQLITE3_CONNECTOR)
81-
add_component(NAME sqlite3 DEPENDENCIES SQLite::SQLite3)
63+
add_component(NAME SQLite3 PACKAGE SQLite3 DEPENDENCIES SQLite::SQLite3 HEADER_DIR sqlite3 MODULE_INTERFACE sqlpp23.sqlite3.cppm)
8264
endif()
83-
8465
if(BUILD_SQLCIPHER_CONNECTOR)
85-
add_component(NAME sqlcipher DEPENDENCIES SQLCipher::SQLCipher)
86-
target_compile_definitions(sqlpp23_sqlcipher INTERFACE SQLPP_USE_SQLCIPHER)
66+
add_component(NAME SQLCipher PACKAGE SQLCipher DEPENDENCIES SQLCipher::SQLCipher DEFINES SQLPP_USE_SQLCIPHER HEADER_DIR sqlite3 MODULE_INTERFACE sqlpp23.sqlite3.cppm)
8767
endif()
88-
8968
if(BUILD_MYSQL_CONNECTOR)
90-
add_component(NAME mysql DEPENDENCIES MySQL::MySQL)
69+
add_component(NAME MySQL PACKAGE MySQL DEPENDENCIES MySQL::MySQL HEADER_DIR mysql MODULE_INTERFACE sqlpp23.mysql.cppm)
9170
endif()
92-
9371
if(BUILD_MARIADB_CONNECTOR)
94-
add_component(NAME mariadb DEPENDENCIES MariaDB::MariaDB)
72+
add_component(NAME MariaDB PACKAGE MariaDB DEPENDENCIES MariaDB::MariaDB HEADER_DIR mysql MODULE_INTERFACE sqlpp23.mysql.cppm)
9573
endif()
96-
9774
if(BUILD_POSTGRESQL_CONNECTOR)
98-
add_component(NAME postgresql DEPENDENCIES PostgreSQL::PostgreSQL)
75+
add_component(NAME PostgreSQL PACKAGE PostgreSQL DEPENDENCIES PostgreSQL::PostgreSQL HEADER_DIR postgresql MODULE_INTERFACE sqlpp23.postgresql.cppm)
9976
endif()
10077

101-
if(BUILD_WITH_MODULES)
102-
add_subdirectory(modules)
103-
else()
104-
set(CMAKE_CXX_SCAN_FOR_MODULES OFF)
105-
endif()
106-
107-
### Packaging
78+
# Utility programs
10879
install(PROGRAMS ${PROJECT_SOURCE_DIR}/scripts/sqlpp23-ddl2cpp
10980
DESTINATION ${CMAKE_INSTALL_BINDIR}
11081
)
11182

83+
### Packaging
11284
write_basic_package_version_file(Sqlpp23ConfigVersion.cmake
11385
COMPATIBILITY SameMajorVersion
11486
ARCH_INDEPENDENT
11587
)
116-
11788
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Sqlpp23ConfigVersion.cmake
11889
DESTINATION ${SQLPP23_INSTALL_CMAKEDIR}
11990
)
120-
121-
install_component(NAME Sqlpp23 TARGETS sqlpp23 DIRECTORY)
122-
123-
if(BUILD_SQLITE3_CONNECTOR)
124-
install_component(NAME Sqlpp23SQLite3 TARGETS sqlpp23_sqlite3 DIRECTORY sqlite3)
125-
endif()
126-
127-
if(BUILD_SQLCIPHER_CONNECTOR)
128-
install_component(NAME Sqlpp23SQLCipher TARGETS sqlpp23_sqlcipher DIRECTORY sqlite3)
129-
130-
install(FILES ${PROJECT_SOURCE_DIR}/cmake/modules/FindSQLCipher.cmake
131-
DESTINATION ${SQLPP23_INSTALL_CMAKEDIR}
132-
)
133-
endif()
134-
135-
if(BUILD_MYSQL_CONNECTOR)
136-
install_component(NAME Sqlpp23MySQL TARGETS sqlpp23_mysql DIRECTORY mysql)
137-
138-
install(FILES ${PROJECT_SOURCE_DIR}/cmake/modules/FindMySQL.cmake
139-
DESTINATION ${SQLPP23_INSTALL_CMAKEDIR}
140-
)
141-
endif()
142-
143-
if(BUILD_MARIADB_CONNECTOR)
144-
install_component(NAME Sqlpp23MariaDB TARGETS sqlpp23_mariadb DIRECTORY mysql)
145-
146-
install(FILES ${PROJECT_SOURCE_DIR}/cmake/modules/FindMariaDB.cmake
147-
DESTINATION ${SQLPP23_INSTALL_CMAKEDIR}
148-
)
149-
endif()
150-
151-
if(BUILD_POSTGRESQL_CONNECTOR)
152-
install_component(NAME Sqlpp23PostgreSQL TARGETS sqlpp23_postgresql DIRECTORY postgresql)
153-
endif()
91+
install(EXPORT Sqlpp23Targets
92+
DESTINATION ${SQLPP23_INSTALL_CMAKEDIR}
93+
NAMESPACE sqlpp23::
94+
CXX_MODULES_DIRECTORY .
95+
)
15496

15597
### Tests
156-
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
98+
if(PROJECT_IS_TOP_LEVEL AND BUILD_TESTING)
15799
add_subdirectory(tests)
158100
endif()

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,15 @@ for (const auto& row : db(select(foo.id, foo.name, foo.hasFun)
8484
__Compiler:__
8585
sqlpp23 makes use of C++23 and requires a recent compiler and standard library.
8686
87-
License:
87+
If you use the library without modules, the following compiler versions are known to be sufficient:
88+
89+
* clang: 20.1 (both libstdc++ and libc++ work)
90+
* gcc: 14.2
91+
* MSVC: 19.44.35219
92+
93+
For modules, please check out [/docs/modules.md](/docs/modules.md).
94+
95+
## License:
8896
8997
sqlpp23 is distributed under the [BSD 2-Clause License](https://github.com/rbock/sqlpp23/blob/main/LICENSE).
9098

cmake/Sqlpp23TargetHelper.cmake

Lines changed: 153 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,41 +25,169 @@
2525
include(GNUInstallDirs)
2626
include(CMakePackageConfigHelpers)
2727

28+
# Helper macro that is used to forward option arguments in function calls
29+
# Taken from https://stackoverflow.com/a/75994425/5689371
30+
macro(set_if OPTION CONDITION)
31+
if(${CONDITION})
32+
set(${OPTION} "${OPTION}")
33+
else()
34+
set(${OPTION})
35+
endif()
36+
endmacro()
37+
38+
function(add_core)
39+
# The core library needs the core headers plus all the headers in the top include directory
40+
file(GLOB_RECURSE HDR_COMPONENT LIST_DIRECTORIES false ${PROJECT_SOURCE_DIR}/include/sqlpp23/core/*.h)
41+
file(GLOB HDR_COMMON LIST_DIRECTORIES false ${PROJECT_SOURCE_DIR}/include/sqlpp23/*.h)
42+
set(HEADERS ${HDR_COMPONENT} ${HDR_COMMON})
43+
add_regular_and_module(
44+
CONFIG_SCRIPT Sqlpp23Config.cmake
45+
HEADERS ${HEADERS}
46+
MODULE_INTERFACE sqlpp23.core.cppm
47+
TARGET_NAME sqlpp23
48+
TARGET_ALIAS sqlpp23::core
49+
TARGET_EXPORTED core
50+
)
51+
endfunction()
52+
2853
function(add_component)
29-
set(options)
30-
set(oneValueArgs NAME)
31-
set(multiValueArgs DEPENDENCIES)
54+
set(options NO_INSTALL)
55+
set(oneValueArgs HEADER_DIR MODULE_INTERFACE NAME PACKAGE)
56+
set(multiValueArgs DEFINES DEPENDENCIES)
3257
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
3358

34-
add_library(sqlpp23_${ARG_NAME} INTERFACE)
35-
add_library(sqlpp23::${ARG_NAME} ALIAS sqlpp23_${ARG_NAME})
36-
set_target_properties(sqlpp23_${ARG_NAME} PROPERTIES EXPORT_NAME ${ARG_NAME})
37-
target_link_libraries(sqlpp23_${ARG_NAME} INTERFACE sqlpp23 ${ARG_DEPENDENCIES})
59+
file(GLOB_RECURSE HEADERS LIST_DIRECTORIES false ${PROJECT_SOURCE_DIR}/include/sqlpp23/${ARG_HEADER_DIR}/*.h)
60+
string(TOLOWER ${ARG_NAME} LC_NAME)
61+
set_if(NO_INSTALL ARG_NO_INSTALL)
62+
add_regular_and_module(
63+
CONFIG_SCRIPT Sqlpp23${ARG_NAME}Config.cmake
64+
DEFINES ${ARG_DEFINES}
65+
DEPENDENCIES sqlpp23::core ${ARG_DEPENDENCIES}
66+
HEADERS ${HEADERS}
67+
MODULE_INTERFACE ${ARG_MODULE_INTERFACE}
68+
PACKAGE ${ARG_PACKAGE}
69+
TARGET_NAME sqlpp23_${LC_NAME}
70+
TARGET_ALIAS sqlpp23::${LC_NAME}
71+
TARGET_EXPORTED ${LC_NAME}
72+
${NO_INSTALL}
73+
)
3874
endfunction()
3975

40-
function(install_component)
41-
set(options)
42-
set(oneValueArgs NAME DIRECTORY)
43-
set(multiValueArgs TARGETS)
76+
function(add_regular_and_module)
77+
set(options NO_INSTALL)
78+
set(oneValueArgs CONFIG_SCRIPT MODULE_INTERFACE PACKAGE TARGET_NAME TARGET_ALIAS TARGET_EXPORTED)
79+
set(multiValueArgs DEFINES DEPENDENCIES HEADERS)
4480
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
4581

46-
install(FILES ${PROJECT_SOURCE_DIR}/cmake/configs/${ARG_NAME}Config.cmake
47-
DESTINATION ${SQLPP23_INSTALL_CMAKEDIR}
82+
if(ARG_PACKAGE)
83+
if(DEPENDENCY_CHECK)
84+
find_package(${ARG_PACKAGE} REQUIRED)
85+
endif()
86+
if(NOT ARG_NO_INSTALL)
87+
# If the package needs a special find script, copy it to the destination scripts directory
88+
set(FIND_SCRIPT ${PROJECT_SOURCE_DIR}/cmake/modules/Find{ARG_PACKAGE}.cmake)
89+
if(EXISTS ${FIND_SCRIPT})
90+
install(FILES ${FIND_SCRIPT} DESTINATION ${SQLPP23_INSTALL_CMAKEDIR})
91+
endif()
92+
endif()
93+
endif()
94+
if(NOT ARG_NO_INSTALL)
95+
install(
96+
FILES ${PROJECT_SOURCE_DIR}/cmake/configs/${ARG_CONFIG_SCRIPT}
97+
DESTINATION ${SQLPP23_INSTALL_CMAKEDIR}
98+
)
99+
endif()
100+
set_if(NO_INSTALL ARG_NO_INSTALL)
101+
add_common(
102+
DEFINES ${ARG_DEFINES}
103+
DEPENDENCIES ${ARG_DEPENDENCIES}
104+
HEADERS ${HEADERS}
105+
TARGET_NAME ${ARG_TARGET_NAME}
106+
TARGET_ALIAS ${ARG_TARGET_ALIAS}
107+
TARGET_EXPORTED ${ARG_TARGET_EXPORTED}
108+
${NO_INSTALL}
48109
)
110+
if(BUILD_WITH_MODULES AND ARG_MODULE_INTERFACE)
111+
add_common(
112+
DEFINES ${ARG_DEFINES}
113+
DEPENDENCIES ${ARG_DEPENDENCIES}
114+
HEADERS ${HEADERS}
115+
MODULE_INTERFACE ${ARG_MODULE_INTERFACE}
116+
TARGET_NAME ${ARG_TARGET_NAME}
117+
TARGET_ALIAS ${ARG_TARGET_ALIAS}
118+
TARGET_EXPORTED ${ARG_TARGET_EXPORTED}
119+
${NO_INSTALL}
120+
)
121+
endif()
122+
endfunction()
49123

50-
install(TARGETS ${ARG_TARGETS}
51-
EXPORT Sqlpp23Targets
52-
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
53-
)
124+
function(add_common)
125+
set(options NO_INSTALL)
126+
set(oneValueArgs MODULE_INTERFACE TARGET_NAME TARGET_ALIAS TARGET_EXPORTED)
127+
set(multiValueArgs DEFINES DEPENDENCIES HEADERS)
128+
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
54129

55-
install(EXPORT Sqlpp23Targets
56-
DESTINATION ${SQLPP23_INSTALL_CMAKEDIR}
57-
NAMESPACE sqlpp23::
58-
)
130+
# Initialize helper variables based on target type (regular or module)
131+
if(ARG_MODULE_INTERFACE)
132+
set(TARGET_SUFFIX "_module")
133+
# FILE_SETs of type CXX_MODULES cannot have the INTERFACE scope (exept
134+
# on IMPORTED targets) and INTERFACE libraries only allow INTERFACE
135+
# scope on their properties. That's why we cannot use the INTERFACE
136+
# library type. For details see the discussion at
137+
# https://discourse.cmake.org/t/header-only-libraries-and-c-20-modules/10680/11
138+
set(LIB_TYPE OBJECT)
139+
set(LIB_PROP_SCOPE PUBLIC)
140+
else()
141+
set(TARGET_SUFFIX "")
142+
set(LIB_TYPE INTERFACE)
143+
set(LIB_PROP_SCOPE INTERFACE)
144+
endif()
145+
set(TARGET_NAME ${ARG_TARGET_NAME}${TARGET_SUFFIX})
146+
set(TARGET_ALIAS ${ARG_TARGET_ALIAS}${TARGET_SUFFIX})
147+
set(TARGET_EXPORTED ${ARG_TARGET_EXPORTED}${TARGET_SUFFIX})
148+
149+
# Create the component targets
150+
add_library(${TARGET_NAME} ${LIB_TYPE})
151+
add_library(${TARGET_ALIAS} ALIAS ${TARGET_NAME})
152+
set_target_properties(${TARGET_NAME} PROPERTIES EXPORT_NAME ${TARGET_EXPORTED})
153+
target_compile_features(${TARGET_NAME} ${LIB_PROP_SCOPE} cxx_std_23)
154+
if(ARG_DEFINES)
155+
target_compile_definitions(${TARGET_NAME} ${LIB_PROP_SCOPE} ${ARG_DEFINES})
156+
endif()
157+
foreach(DEP ${ARG_DEPENDENCIES})
158+
if(DEP MATCHES "^sqlpp23::")
159+
set(DEP ${DEP}${TARGET_SUFFIX})
160+
endif()
161+
target_link_libraries(${TARGET_NAME} ${LIB_PROP_SCOPE} ${DEP})
162+
endforeach()
59163

60-
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/sqlpp23/${ARG_DIRECTORY}
61-
DESTINATION include/sqlpp23
62-
FILES_MATCHING
63-
PATTERN *.h
164+
# Add the component headers to the HEADERS file set. This also adds the base directory to the
165+
# target's build interface include directories.
166+
target_sources(
167+
${TARGET_NAME}
168+
${LIB_PROP_SCOPE}
169+
FILE_SET HEADERS
170+
BASE_DIRS ${PROJECT_SOURCE_DIR}/include
171+
FILES ${ARG_HEADERS}
64172
)
173+
if(ARG_MODULE_INTERFACE)
174+
# Add the component module interface file to the CXX_MODULES file set
175+
target_sources(
176+
${TARGET_NAME}
177+
PUBLIC
178+
FILE_SET CXX_MODULES
179+
BASE_DIRS ${PROJECT_SOURCE_DIR}/modules
180+
FILES ${PROJECT_SOURCE_DIR}/modules/${ARG_MODULE_INTERFACE}
181+
)
182+
endif()
183+
if(NOT ARG_NO_INSTALL)
184+
# Install the component output artifacts
185+
install(
186+
TARGETS ${TARGET_NAME}
187+
EXPORT Sqlpp23Targets
188+
FILE_SET HEADERS
189+
FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_PREFIX}/modules/sqlpp23
190+
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
191+
)
192+
endif()
65193
endfunction()

cmake/configs/Sqlpp23Config.cmake

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,14 @@ endforeach()
4747
# Add the target file
4848
include(${CMAKE_CURRENT_LIST_DIR}/Sqlpp23Targets.cmake)
4949

50-
# Load any optional components
50+
# Load any optional components
5151
foreach(comp IN LISTS ${CMAKE_FIND_PACKAGE_NAME}_comps)
5252
include(${CMAKE_CURRENT_LIST_DIR}/Sqlpp23${comp}Config.cmake OPTIONAL)
5353
endforeach()
5454

55+
# Add the target sqlpp23::sqlpp23 as an alias for sqlpp23::core
56+
add_library(sqlpp23::sqlpp23 ALIAS sqlpp23::core)
57+
5558
# Import "ddl2cpp" script
5659
if(NOT TARGET sqlpp23::ddl2cpp)
5760
get_filename_component(sqlpp23_ddl2cpp_location "${CMAKE_CURRENT_LIST_DIR}/../../../bin/sqlpp23-ddl2cpp" REALPATH)
@@ -65,6 +68,6 @@ if(NOT TARGET sqlpp23::ddl2cpp)
6568
unset(sqlpp23_ddl2cpp_location)
6669
endif()
6770

68-
# Resture module path
71+
# Resture module path
6972
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH_save})
7073
unset(CMAKE_MODULE_PATH_save)

docs/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ The following pages will tell you how to use it:
3434
- [Database connectors](connectors.md)
3535
- [Debug logging](logging.md)
3636
- [Select](/docs/select.md), see also [`with`](/docs/with.md)
37+
- [Union](/docs/union.md)
3738
- [Insert](/docs/insert.md)
3839
- [Update](/docs/update.md)
3940
- [Delete](/docs/delete.md)

0 commit comments

Comments
 (0)