@@ -10,7 +10,24 @@ set(CMAKE_CXX_STANDARD 23)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
option(MODULUS_WITH_OPENSSL "Enable the modulus OpenSSL bridge target" OFF)
|
||||
option(MODULUS_WITH_SQLITE "Enable the modulus SQLite bridge target" OFF)
|
||||
option(MODULUS_WITH_RAYLIB "Enable the modulus raylib bridge target" OFF)
|
||||
option(MODULUS_WITH_MINIAUDIO "Enable the modulus miniaudio bridge target" OFF)
|
||||
|
||||
include(cmake/modulus_third_party.cmake)
|
||||
if(MODULUS_WITH_OPENSSL)
|
||||
modulus_require_openssl()
|
||||
endif()
|
||||
if(MODULUS_WITH_SQLITE)
|
||||
modulus_require_sqlite()
|
||||
endif()
|
||||
if(MODULUS_WITH_RAYLIB)
|
||||
modulus_require_raylib()
|
||||
endif()
|
||||
if(MODULUS_WITH_MINIAUDIO)
|
||||
modulus_require_miniaudio()
|
||||
endif()
|
||||
|
||||
add_library(modulus
|
||||
src/config.cpp
|
||||
|
||||
@@ -2,13 +2,16 @@
|
||||
|
||||
Modulus is the shared C++23 foundation library and build tooling used by the khodo Product Vamp repositories. It provides small runtime utilities, Conan profiles, CMake package integration, editor templates, typed LSP compile-database setup, and bridge targets for the external libraries needed by Product Vamp.
|
||||
|
||||
The public package intentionally keeps a small dependency surface:
|
||||
The core `modulus::modulus` target requires only Boost.JSON. Optional bridges are loaded when requested:
|
||||
|
||||
- Boost.JSON
|
||||
- OpenSSL
|
||||
- SQLite
|
||||
- raylib
|
||||
- miniaudio 0.11.22
|
||||
```cmake
|
||||
find_package(modulus CONFIG REQUIRED COMPONENTS openssl)
|
||||
target_link_libraries(app PRIVATE modulus::modulus modulus::openssl)
|
||||
```
|
||||
|
||||
Available components are `boost_json`, `openssl`, `sqlite`, `raylib`, and `miniaudio`. Existing package discovery can also be followed by `modulus_require_openssl()` (or the corresponding bridge helper). Source builds opt in with `MODULUS_WITH_OPENSSL`, `MODULUS_WITH_SQLITE`, `MODULUS_WITH_RAYLIB`, and `MODULUS_WITH_MINIAUDIO`.
|
||||
|
||||
Conan consumers must enable the matching `modulus/*:with_openssl`, `with_sqlite`, `with_raylib`, or `with_miniaudio` option to add that dependency to the graph. Applications combining several bridge consumers should set the union of these options on their direct Modulus requirement. All four options default to false.
|
||||
|
||||
## Build
|
||||
|
||||
|
||||
@@ -3,4 +3,32 @@
|
||||
include(CMakeFindDependencyMacro)
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/modulus_third_party.cmake")
|
||||
if(NOT TARGET Boost::json)
|
||||
set(modulus_FOUND FALSE)
|
||||
set(modulus_NOT_FOUND_MESSAGE "Modulus requires Boost.JSON")
|
||||
return()
|
||||
endif()
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/modulus-targets.cmake")
|
||||
foreach(_modulus_component IN LISTS modulus_FIND_COMPONENTS)
|
||||
set(modulus_${_modulus_component}_FOUND FALSE)
|
||||
if(_modulus_component STREQUAL "modulus" OR _modulus_component STREQUAL "boost_json")
|
||||
set(modulus_${_modulus_component}_FOUND TRUE)
|
||||
continue()
|
||||
elseif(_modulus_component STREQUAL "openssl")
|
||||
set(_modulus_dependency OpenSSL)
|
||||
elseif(_modulus_component STREQUAL "sqlite")
|
||||
set(_modulus_dependency SQLite3)
|
||||
elseif(_modulus_component STREQUAL "raylib")
|
||||
set(_modulus_dependency raylib)
|
||||
elseif(_modulus_component STREQUAL "miniaudio")
|
||||
set(_modulus_dependency miniaudio)
|
||||
else()
|
||||
continue()
|
||||
endif()
|
||||
find_package(${_modulus_dependency} CONFIG QUIET)
|
||||
if(${_modulus_dependency}_FOUND)
|
||||
cmake_language(CALL modulus_require_${_modulus_component})
|
||||
set(modulus_${_modulus_component}_FOUND TRUE)
|
||||
endif()
|
||||
endforeach()
|
||||
check_required_components(modulus)
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
include(CMakeFindDependencyMacro)
|
||||
|
||||
find_dependency(Boost CONFIG REQUIRED COMPONENTS json)
|
||||
find_dependency(OpenSSL CONFIG REQUIRED)
|
||||
find_dependency(SQLite3 CONFIG REQUIRED)
|
||||
find_dependency(raylib CONFIG REQUIRED)
|
||||
find_dependency(miniaudio CONFIG REQUIRED)
|
||||
|
||||
function(modulus_define_bridge target)
|
||||
if(NOT TARGET ${target})
|
||||
@@ -17,54 +13,74 @@ set_target_properties(modulus::boost_json PROPERTIES
|
||||
INTERFACE_LINK_LIBRARIES "Boost::boost;Boost::json"
|
||||
)
|
||||
|
||||
modulus_define_bridge(modulus::openssl)
|
||||
set_target_properties(modulus::openssl PROPERTIES
|
||||
function(modulus_require_openssl)
|
||||
find_dependency(OpenSSL CONFIG REQUIRED)
|
||||
modulus_define_bridge(modulus::openssl)
|
||||
set_target_properties(modulus::openssl PROPERTIES
|
||||
INTERFACE_LINK_LIBRARIES "OpenSSL::SSL;OpenSSL::Crypto"
|
||||
)
|
||||
)
|
||||
endfunction()
|
||||
|
||||
modulus_define_bridge(modulus::sqlite)
|
||||
set_target_properties(modulus::sqlite PROPERTIES
|
||||
function(modulus_require_sqlite)
|
||||
find_dependency(SQLite3 CONFIG REQUIRED)
|
||||
modulus_define_bridge(modulus::sqlite)
|
||||
set_target_properties(modulus::sqlite PROPERTIES
|
||||
INTERFACE_LINK_LIBRARIES "SQLite::SQLite3"
|
||||
)
|
||||
)
|
||||
endfunction()
|
||||
|
||||
set(_modulus_raylib_target "")
|
||||
if(TARGET raylib)
|
||||
function(modulus_require_raylib)
|
||||
find_dependency(raylib CONFIG REQUIRED)
|
||||
|
||||
set(_modulus_raylib_target "")
|
||||
if(TARGET raylib)
|
||||
set(_modulus_raylib_target raylib)
|
||||
elseif(TARGET raylib::raylib)
|
||||
elseif(TARGET raylib::raylib)
|
||||
set(_modulus_raylib_target raylib::raylib)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT _modulus_raylib_target)
|
||||
if(NOT _modulus_raylib_target)
|
||||
message(FATAL_ERROR "raylib package did not define a supported CMake target")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(_modulus_raylib_link_libraries ${_modulus_raylib_target})
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
set(_modulus_raylib_link_libraries ${_modulus_raylib_target})
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
list(APPEND _modulus_raylib_link_libraries EGL GLESv2 drm gbm atomic dl)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
modulus_define_bridge(modulus::raylib)
|
||||
set_target_properties(modulus::raylib PROPERTIES
|
||||
modulus_define_bridge(modulus::raylib)
|
||||
set_target_properties(modulus::raylib PROPERTIES
|
||||
INTERFACE_LINK_LIBRARIES "${_modulus_raylib_link_libraries}"
|
||||
)
|
||||
)
|
||||
|
||||
unset(_modulus_raylib_link_libraries)
|
||||
unset(_modulus_raylib_target)
|
||||
unset(_modulus_raylib_link_libraries)
|
||||
unset(_modulus_raylib_target)
|
||||
endfunction()
|
||||
|
||||
set(_modulus_miniaudio_target "")
|
||||
if(TARGET miniaudio::miniaudio)
|
||||
function(modulus_require_miniaudio)
|
||||
find_dependency(miniaudio CONFIG REQUIRED)
|
||||
|
||||
set(_modulus_miniaudio_target "")
|
||||
if(TARGET miniaudio::miniaudio)
|
||||
set(_modulus_miniaudio_target miniaudio::miniaudio)
|
||||
elseif(TARGET miniaudio)
|
||||
elseif(TARGET miniaudio)
|
||||
set(_modulus_miniaudio_target miniaudio)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT _modulus_miniaudio_target)
|
||||
if(NOT _modulus_miniaudio_target)
|
||||
message(FATAL_ERROR "miniaudio package did not define a supported CMake target")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
modulus_define_bridge(modulus::miniaudio)
|
||||
set_target_properties(modulus::miniaudio PROPERTIES
|
||||
modulus_define_bridge(modulus::miniaudio)
|
||||
set_target_properties(modulus::miniaudio PROPERTIES
|
||||
INTERFACE_LINK_LIBRARIES "${_modulus_miniaudio_target}"
|
||||
)
|
||||
)
|
||||
|
||||
unset(_modulus_miniaudio_target)
|
||||
unset(_modulus_miniaudio_target)
|
||||
endfunction()
|
||||
|
||||
# CMakeDeps creates enabled bridges before including this build module. Keep
|
||||
# raylib's system libraries after its static archive, as in installed packages.
|
||||
if(TARGET modulus::raylib)
|
||||
modulus_require_raylib()
|
||||
endif()
|
||||
|
||||
@@ -30,11 +30,31 @@ class modulus_recipe(conan.ConanFile):
|
||||
True,
|
||||
False,
|
||||
],
|
||||
"with_openssl": [
|
||||
True,
|
||||
False,
|
||||
],
|
||||
"with_sqlite": [
|
||||
True,
|
||||
False,
|
||||
],
|
||||
"with_raylib": [
|
||||
True,
|
||||
False,
|
||||
],
|
||||
"with_miniaudio": [
|
||||
True,
|
||||
False,
|
||||
],
|
||||
}
|
||||
default_options = {
|
||||
"shared": False,
|
||||
"fPIC": True,
|
||||
"with_tests": False,
|
||||
"with_openssl": False,
|
||||
"with_sqlite": False,
|
||||
"with_raylib": False,
|
||||
"with_miniaudio": False,
|
||||
"raylib/*:camera_system": False,
|
||||
"raylib/*:custom_frame_control": True,
|
||||
"raylib/*:customize_build": True,
|
||||
@@ -83,21 +103,25 @@ class modulus_recipe(conan.ConanFile):
|
||||
transitive_libs=True,
|
||||
options=modulus.config.boost_requirement_options(config),
|
||||
)
|
||||
if self.options.with_openssl:
|
||||
self.requires(
|
||||
"openssl/4.0.1",
|
||||
transitive_headers=True,
|
||||
transitive_libs=True,
|
||||
)
|
||||
if self.options.with_sqlite:
|
||||
self.requires(
|
||||
"sqlite3/3.53.2",
|
||||
transitive_headers=True,
|
||||
transitive_libs=True,
|
||||
)
|
||||
if self.options.with_raylib:
|
||||
self.requires(
|
||||
"raylib/6.0",
|
||||
transitive_headers=True,
|
||||
transitive_libs=True,
|
||||
)
|
||||
if self.options.with_miniaudio:
|
||||
self.requires(
|
||||
"miniaudio/0.11.22",
|
||||
transitive_headers=True,
|
||||
@@ -113,6 +137,10 @@ class modulus_recipe(conan.ConanFile):
|
||||
toolchain.user_presets_path = False
|
||||
toolchain.variables["BUILD_SHARED_LIBS"] = bool(options.shared)
|
||||
toolchain.variables["BUILD_TESTING"] = bool(options.with_tests)
|
||||
toolchain.variables["MODULUS_WITH_OPENSSL"] = bool(options.with_openssl)
|
||||
toolchain.variables["MODULUS_WITH_SQLITE"] = bool(options.with_sqlite)
|
||||
toolchain.variables["MODULUS_WITH_RAYLIB"] = bool(options.with_raylib)
|
||||
toolchain.variables["MODULUS_WITH_MINIAUDIO"] = bool(options.with_miniaudio)
|
||||
toolchain.generate()
|
||||
|
||||
def build(self):
|
||||
@@ -149,12 +177,15 @@ class modulus_recipe(conan.ConanFile):
|
||||
components["boost_json"].set_property("cmake_target_name", "modulus::boost_json")
|
||||
components["boost_json"].requires = ["boost::json"]
|
||||
|
||||
if self.options.with_openssl:
|
||||
components["openssl"].set_property("cmake_target_name", "modulus::openssl")
|
||||
components["openssl"].requires = ["openssl::ssl", "openssl::crypto"]
|
||||
|
||||
if self.options.with_sqlite:
|
||||
components["sqlite"].set_property("cmake_target_name", "modulus::sqlite")
|
||||
components["sqlite"].requires = ["sqlite3::sqlite"]
|
||||
|
||||
if self.options.with_raylib:
|
||||
components["raylib"].set_property("cmake_target_name", "modulus::raylib")
|
||||
components["raylib"].requires = ["raylib::raylib"]
|
||||
if self.settings.os == "Linux":
|
||||
@@ -167,5 +198,6 @@ class modulus_recipe(conan.ConanFile):
|
||||
"dl",
|
||||
]
|
||||
|
||||
if self.options.with_miniaudio:
|
||||
components["miniaudio"].set_property("cmake_target_name", "modulus::miniaudio")
|
||||
components["miniaudio"].requires = ["miniaudio::miniaudio"]
|
||||
|
||||
Reference in New Issue
Block a user