Meaning and Usage of ENABLE_[PACKAGE] flags
In several discussions and issues the question came up how to use the ENABLE_[PACKAGE]=1 compile flags, why are they introduced, what are its implications, and would it be possible to remove these flags completely.
Related issues are:
-
#234 (closed) (handling of
config.h) - #188 (Fix broken pkg-config files)
- #161 (Proper usage of add-all-flags macros)
It turns out that the ENABLE_FOO magic gets complicated to handle if different developments are followed: If we decide to remove the config.h file in favor of compiler flags, we cannot have both HAVE_FOO and ENABLE_FOO and the one depending on the other, but just one compile flag. If we always link all packages a separate enable flag would not make sense...
Questions
- What happens if we add
ENABLE_FOO=0in an upstream module, but compile a downstream module withENABLE_FOO=1? - What is the difference between
CMAKE_DISABLE_FIND_PACKAGE_FOO=1andENABLE_FOO=0 - [...]
Partial List of Problems
- Changing the
ENABLE-flag should be possible only for files that are not used in any module library. Otherwise we would get incompatible header and library symbols. - Thus it can be used for tests and executables only.
- It should not be allowed to include any header file that uses a package that can potentially be deactivated.
- Problematic packages are MPI, Vc, and solvers like suitesparse and superlu if a dune interface is provided.
- If a dune header is provided that uses a package that can potentially be deactivated, it can be part of a library in downstream module A but the enable-flags changed in downstream module B and you would get a symbol clash
Alternatives
- Formulate two groups of external packages:
- Those that are required by dune code if found and its "enable-flag" should not be changed. Examples: MPI, TBB, Vc
- Those that are used only in specific applications. Example: Solvers like SuiteSparse, SuperLU
- Always activate packages from group 1 if found.
- Do not activate packages from group 2 by default. The user has to explicitly call something like
add_dune_suitesparse_flags(<target>) - Once a package is activated for a dune module library, it is a required dependency. Must be added to the target and be exported. The
HAVE_FOOflag is not allowed to be changed by the user. If a package should not be used in the first place, it must be deactivated byCMAKE_DISABLE_FIND_PACKAGE_FOO=1 - Remove all the
HAVE_FOOdefines fromconfig.hrelated to group 2 and set these flags as compile definition whenadd_dune_foo_flagsis called.
Edited by Simon Praetorius