[Dune] dune & cmake
Martin Rückl
mrueckl at physik.hu-berlin.de
Tue Apr 12 16:28:30 CEST 2016
Hi Christoph,
> What's your problem with the config.h? That the canonical way to pass
> configure results. Why should someone want to hide that and make it
> less discoverable?
I don't have any problems with dune using a config.h. I'm just having a
hard time understanding the meaning of config.h. I'll try to explain the
use cases i see:
1. config.h is only required for building the library and will not be
exposed to the user (i.e. will not be installed). That requires that
the library interface does not depend on the config.h file. This
implies, that usage of #defines from the config.h files may only
occur within the libraries compiled .cpp files.
2. The interface itself depends on the variables set during
configuration stage. Since heavy use of template tends to result in
code moved from .cpp to .hpp files, this case is realistic.
3. There also might be configuration variables, which impact both,
interface and compiled library.
I think #1 makes sense and is the original intention of config.h files,
at least thats what i got from various posts at SO (Please tell me if
wrong!). The user of a library doesn't need to know about the configure
internals of the library. He doesn't have to include it in any of his
files. If #1 isn't the intended usage, then the remaining part of this
mail is obsolete...
For variables of type #2, I would assume that they have reasonable
default values somewhere in the installed header files. Then the user
can still change the interface by setting his own defines (if he knows
what he is doing).
Same for #3 but the user is not supposed to change them, since this
might break header<->library compatibility.
One example for #2 are the DUNE_VERSION_NEWER_REV(DUNE_GRID,2,4,0)
macros which are e.g. used in alugrid/geometry.hh. Here the interface
depends on a variable set in the config.h files, i.e. the
DUNE_***_VERSION stuff.
Hence, to use the configuration dependent interface, I have to include
the alugrid/config.h in my own *.cpp files. Obviously this isn't a big
deal for small projects which only depend on dune. But what happens for
more complicated setups.
For 10 libraries like dune, would i have to include 10 different
config.h files, one for each dependency?
I realized that dune installs config.h.cmake files in
prefix/share/dune-module/config.h.cmake. But those files seem incomplete
(e.g. #define DUNE_COMMON_VERSION_MAJOR ${DUNE_COMMON_VERSION_MAJOR})
Further, I have no idea how they are supposed to be used :-(
For the reference, I just had a short look to eigen: they define
EIGEN_***_VERSION 3 in an installed header file
(Eigen/src/Core/util/Macros.h).
I am aware that the change from autotools to cmake isn't that long ago,
and i REALLY appreciated this transition. Please do not understand this
mail as: "your buildsystem is bullshit" I merely try to describe my own
thoughts! I just want to help/understand! Maybe my arguments are helpful
for any of your further discussions on the buildsystem topic. (I
somewhere read that 3.0 might introduce some other changes :P)
HtH Martin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.dune-project.org/pipermail/dune/attachments/20160412/d60657da/attachment.htm>
More information about the Dune
mailing list