mirror of
https://github.com/Kitware/CMake.git
synced 2026-06-30 19:57:41 +00:00
Usage effects describe the relationship between a provider and a consumer of C++ module interface units. They encompass the flags and features used to construct BMIs for those units. If the usage effects of a provider and consumer match, then the provider's BMI may be reused as-is. If they do not match, then a synthetic target describing the interface units with the consumer's usage effects applied must be created. This commit makes three major changes to how usage effects are reified in CMake. The first is simple, usage effect hashes now use compile options and features as the input to their hash instead of the consumer name. A simply warning flag filter is also applied, mostly to demonstrate the mechanism. This is the "correct calculation" for usage effects. The second is more impactful, usage effects now entirely replace the compile options of providers with those of consumers if unmatched. Compile definitions, includes, and links remain unchanged. This is necessary to ensure successful builds, but is a tricky semantic change. The third is mostly source-facing, the discovery model for CxxModule synthetic targets is no longer the global target namespace. Instead, non-synthetic targets manage their synthetic derivatives. Every target maintains a usage effect-keyed cache of synthetic targets. When determining if a synthetic target is necessary, a given provider checks for compatibility with itself, then for presence in the cache, and if the cache misses a new synthetic target is created. Fixes: #27597
20 lines
419 B
C++
20 lines
419 B
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <string>
|
|
|
|
class cmGeneratorTarget;
|
|
|
|
class cmCxxModuleUsageEffects
|
|
{
|
|
public:
|
|
cmCxxModuleUsageEffects(cmGeneratorTarget const* gt);
|
|
std::string const& GetHash() const;
|
|
|
|
private:
|
|
std::string Hash;
|
|
};
|