Principles :
- Dependencies are defined as "buckets" at the top level in a centralized way.
- Each "module" generates a single library linked against the dependencies defined in a single bucket.
- Common and GlobalTracking are typical modules (subprojects) with a standard directory structure (src, include, ...).
- Detectors contain detector specific code. Several modules can be defined for each detector (grouped in directories if needed). Modules follow once more the same typical directory structure.
- DataFormats is a special case as we have mostly headers and/or possibly protobuf files. As a consequence it does not follow the typical directory structure.
- Modules can live within the AliceO2 repository or as their own repository in the AliceO2 group. (not shown here)
Dependencies proposal (totally imaginary + directory based until we have some deliverables) :
- Common -> boost
- DataFormats -> Common + protobuf + boost
- Detectors/ITS/Reconstruction -> boost + Common
- Detectors/ITS/Simulation -> Geant4 + Common + boost
- Detectors/TPC/Reconstruction -> boost + Common
- Detectors/TPC/Simulation -> Geant4 + Common + boost
- GlobalTracking -> Common + DataFormats + boost + Detectors/*/Reconstruction + ROOT
Problems/Questions:
- DataFormats : do we create libraries there or do we use the headers directly in the detectors modules ? If we create data formats libraries, do we create one per detector or one global ?
- GlobalTracking depends on Common. It uses o2_target_link_bucket but it still has to use include_directories(../../Common/include). Maybe it is ok, but I am not sure.
- is it ok that we do not prefix it with "Common/" or is it confusing because the public headers are prefixed ?
To do:
- add a non public header that is in src
- DataFormats cmake
- doxygen example (top level and modules)
- test example
- enforce that "executables should always belong to the same bucket + the sub-package library" ?
- script to create new module (in AliceO2 or independent)
- get rid of as much boiler plate code as possible in the modules (typically the install function)
- add the o2_setup macro that modules should call (related to previous point?)
- standalone module example
- global definitions in O2Utils.cmake
- enforce that an exe depends on the same bucket as the library + the library