Starting with v1.4.0, ThemisDB supports a modular build architecture that splits the monolithic themis_core library into focused, independently-built modules. This resolves critical issues:
- Windows Build Problems: Eliminates COFF symbol limit errors (>65,000 symbols)
- Faster Build Times: Parallel compilation and incremental rebuilds of individual modules
- Feature Selectivity: Optional modules can be excluded from builds
- Improved Maintainability: Clear separation of concerns and dependencies
The traditional single themis_core library containing all functionality:
cmake -B build -DTHEMIS_BUILD_MODULAR=OFF
cmake --build buildThis mode is the default and maintains backward compatibility with v1.3.x.
Separate libraries for each component:
cmake -B build -DTHEMIS_BUILD_MODULAR=ON
cmake --build build-
themis_base - Foundation layer
- Core utilities (logging, serialization, tracing)
- Cross-cutting concerns abstraction
- Plugin system infrastructure
- Hardware acceleration registry
-
themis_storage - Storage engine
- RocksDB wrapper
- Indexes (secondary, vector, spatial, adaptive)
- Backup and PITR management
- Schema management
-
themis_query - Query processing
- Query engine and optimizer
- AQL parser and translator
- Analytics (OLAP, process mining, NLP)
- Import/export functionality
-
themis_security - Security layer
- Encryption and key management (Vault, PKI, HSM)
- Authentication (JWT, Kerberos/GSSAPI)
- RBAC and access control
- PII detection and governance
-
themis_transaction - Transaction management
- ACID transaction manager
- Saga pattern support
- Snapshot management
- Change data capture (CDC)
-
themis_network - Network services
- HTTP/gRPC servers
- API handlers (REST endpoints)
- Protocol support (WebSocket, MQTT, PostgreSQL wire)
- Rate limiting and load shedding
-
themis_sharding - Distributed system
- Horizontal scaling and sharding
- Raft consensus
- WAL replication
- Cross-shard transactions
Enable with:
-DTHEMIS_MODULE_SHARDING=ON -
themis_llm - LLM integration
- LLM interaction store
- Prompt management
- Paged KV cache
- RAG knowledge gap detector
Enable with:
-DTHEMIS_MODULE_LLM=ON -
themis_content - Content processors
- Content management
- Text/image/office processors
- MIME detection
- Archive processing
Enable with:
-DTHEMIS_MODULE_CONTENT=ON -
themis_timeseries - Time-series support
- Time-series storage
- Gorilla compression
- Continuous aggregates
- Retention policies
Enable with:
-DTHEMIS_MODULE_TIMESERIES=ON -
themis_graph - Graph analytics
- Graph indexes (temporal, property, process)
- GNN embeddings
- Graph query optimizer
- Graph analytics
Enable with:
-DTHEMIS_MODULE_GRAPH=ON -
themis_geo - Geospatial features
- Geospatial indexing
- CPU/GPU backends
- EWKB support
- Boost.Geometry integration
Enable with:
-DTHEMIS_MODULE_GEO=ON
themis_base (foundation)
├── themis_storage (depends on: base, RocksDB)
│ ├── themis_query (depends on: base, storage)
│ ├── themis_transaction (depends on: base, storage)
│ ├── themis_security (depends on: base, OpenSSL)
│ ├── themis_timeseries (depends on: base, storage)
│ ├── themis_graph (depends on: base, storage)
│ └── themis_geo (depends on: base, storage, Boost.Geometry)
│
├── themis_network (depends on: base, storage, query, transaction)
│
├── themis_sharding (depends on: base, storage, security, transaction)
│
└── themis_llm (depends on: base, storage)
cmake -B build \
-DTHEMIS_BUILD_MODULAR=ON \
-DTHEMIS_MODULE_SHARDING=OFF \
-DTHEMIS_MODULE_LLM=OFF \
-DTHEMIS_MODULE_CONTENT=OFF \
-DTHEMIS_MODULE_TIMESERIES=OFF \
-DTHEMIS_MODULE_GRAPH=OFF \
-DTHEMIS_MODULE_GEO=OFFcmake -B build \
-DTHEMIS_BUILD_MODULAR=ON \
-DTHEMIS_MODULE_SHARDING=ON \
-DTHEMIS_MODULE_LLM=ON \
-DTHEMIS_MODULE_CONTENT=ON \
-DTHEMIS_MODULE_TIMESERIES=ON \
-DTHEMIS_MODULE_GRAPH=ON \
-DTHEMIS_MODULE_GEO=ONcmake -B build \
-DTHEMIS_BUILD_MODULAR=ON \
-DTHEMIS_EDITION=ENTERPRISE \
-DTHEMIS_MODULE_SHARDING=ON \
-DTHEMIS_MODULE_LLM=OFF \
-DTHEMIS_MODULE_CONTENT=OFFEach module uses platform-specific export macros defined in include/themis/export.h:
#include <themis/export.h>
class THEMIS_STORAGE_API RocksDBWrapper {
// ...
};Available macros:
THEMIS_BASE_APITHEMIS_STORAGE_APITHEMIS_QUERY_APITHEMIS_SECURITY_APITHEMIS_TRANSACTION_APITHEMIS_NETWORK_APITHEMIS_SHARDING_APITHEMIS_LLM_APITHEMIS_CONTENT_APITHEMIS_TIMESERIES_APITHEMIS_GRAPH_APITHEMIS_GEO_API
Existing code that links to themis_core will continue to work in modular mode. The build system automatically creates an interface library themis_core that links all enabled modules.
No code changes required. Link to themis_core as before:
target_link_libraries(my_app PRIVATE themis_core)When adding new source files, add them to the appropriate module in cmake/ModularBuild.cmake:
set(THEMIS_STORAGE_SOURCES
../src/storage/rocksdb_wrapper.cpp
../src/storage/your_new_file.cpp # Add here
# ...
)- Monolithic: Single large compilation, ~15-30 minutes full rebuild
- Modular: Parallel module compilation, ~10-20 minutes full rebuild
- Incremental: Only recompile changed modules (significant speedup)
- Monolithic: Single binary, slightly faster startup
- Modular: Multiple shared libraries, minimal overhead (<1% typically)
- Monolithic: Single large binary (~50-150 MB)
- Modular: Total size similar, but distributed across multiple .so/.dll files
If you encounter undefined symbol errors with modular builds:
- Ensure export macros are correctly applied to public APIs
- Check that dependencies are properly declared in
themis_add_module() - Verify that
THEMIS_BUILD_MODULAR=ONis set consistently
If a module fails to link:
- Check dependency order in
cmake/ModularBuild.cmake - Ensure required system libraries are available
- Verify vcpkg packages are installed
On Windows with MSVC:
- Ensure
WINDOWS_EXPORT_ALL_SYMBOLSis enabled for each module - Use
/bigobjflag for large translation units (automatically applied) - Disable
/GL(IPO) for shared builds to avoid COFF issues
- ✅ Modular build infrastructure
- ✅ Export macro system
- ✅ Module dependency management
- ✅ Backward compatibility with monolithic builds
- Module-level testing isolation
- Plugin system for dynamic module loading
- Finer-grained module splitting (e.g., separate HTTP/gRPC servers)
- Pure modular architecture (monolithic deprecated)
- Language bindings per module
- Microservice deployment support
- ModularBuild.cmake - Module definitions
- export.h - Export macros
- CMakeLists.txt (root) - Root build configuration
- CMakeLists.txt (cmake) - Main build system integration