[cmake-developers] [PATCH] cmCMakePolicyCommand: New PARENT_SCOPE argument
Alex Merry
alex.merry at kde.org
Fri Jul 31 12:54:33 EDT 2015
On Thursday 30 July 2015 09:28:12 Brad King wrote:
> On 07/29/2015 03:58 PM, Alex Merry wrote:
> > This is intended to be used from a "settings file" which is applied to a
> > group of CMake projects. This allows the file to control which policies
> > means that users of the settings file are not forced to use
> > NO_POLICY_SCOPE
> > (particularly important if the settings file did not originally have any
> > policy settings in it, but later acquired some).
>
> Policies should not be set from a central hub, especially without the
> explicit permission of the including project (via NO_POLICY_SCOPE).
>
> Setting policies centrally breaks their compatibility model. The
> whole point is that the old behavior is preserved (possibly with a
> warning) until the project whose code triggers the policy is modified
> to address it. By setting a policy on behalf of the project calling
> include() you could silence warnings about behavior changes or even
> introduce errors. Each project author needs a chance to see their
> own policy warnings and address them accordingly.
I should perhaps explain our use case:
KDE provides the module "KDECompilerSettings", which set a bunch of default
compiler settings we think are generally useful for KDE software projects
(extra warnings, feature macros for libraries and so on).
One of those settings is the compiler visibility stuff
(CMAKE_CXX_VISIBILITY_PRESET is set to hidden and
CMAKE_VISIBILITY_INLINES_HIDDEN is set to 1). CMP0063 now causes a whole bunch
of warnings to appear across a load of projects where there are executable
targets. These warnings are because of a setting in the KDECompilerSettings,
so it is natual to want to resolve the issue there.
We'd like to set the policy to NEW, because the new behaviour is sensible, and
we'd consider any project that was broken by the change to already to be in
need of fixing, because relying on the old behaviour is non-portable (due to
DLL export behaviour). We'd rather have a hard error (even at build time
instead of configure time) with a vanishingly small number of projects
(hopefully none) than a warning on lots of projects that are almost certainly
not affected.
Now, sure, we could change every single project that includes this module to
use NO_POLICY_SCOPE but, apart from that being an unwanted change in how we
tell people to use this module, it seems a very clunky approach. It means the
module is at risk of leaking policy settings it didn't mean to (if it were to
set policies for its own internal use), but it also means that, conceptually,
you are asking users to opt-in to this particular behavoural change (because
it happens to be implemented as a policy), but not to the other behavioural
changes we make in the module (because they are implemented with variables).
Of course, ideally, we'd like to policy change to have the same scope as the
variable settings it accompanies. That doesn't seem to be possible to acheive,
though (at least, not in a clean way) because of the separate stacks for
policy scopes and variable scopes.
Alex
More information about the cmake-developers
mailing list