mirror of
https://github.com/Kitware/CMake.git
synced 2025-06-15 16:39:26 +08:00

Previously we disallowed use of arbitrary properties on INTERFACE libraries. The goal was to future-proof projects using them by not allowing properties to be set that may affect their future inclusion in the generated buildsystem. In order to prepare to actually include INTERFACE libraries in the generated buildsystem, drop the filter and allow arbitrary properties to be set. Issue: #19145
106 lines
3.5 KiB
C++
106 lines
3.5 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#ifndef cmTargetPropertyComputer_h
|
|
#define cmTargetPropertyComputer_h
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <string>
|
|
|
|
#include "cmListFileCache.h"
|
|
#include "cmProperty.h"
|
|
#include "cmStateTypes.h"
|
|
#include "cmStringAlgorithms.h"
|
|
#include "cmSystemTools.h"
|
|
|
|
class cmMessenger;
|
|
|
|
class cmTargetPropertyComputer
|
|
{
|
|
public:
|
|
template <typename Target>
|
|
static cmProp GetProperty(Target const* tgt, const std::string& prop,
|
|
cmMessenger* messenger,
|
|
cmListFileBacktrace const& context)
|
|
{
|
|
if (cmProp loc = GetLocation(tgt, prop, messenger, context)) {
|
|
return loc;
|
|
}
|
|
if (cmSystemTools::GetFatalErrorOccured()) {
|
|
return nullptr;
|
|
}
|
|
if (prop == "SOURCES") {
|
|
return GetSources(tgt, messenger, context);
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
private:
|
|
static bool HandleLocationPropertyPolicy(std::string const& tgtName,
|
|
cmMessenger* messenger,
|
|
cmListFileBacktrace const& context);
|
|
|
|
template <typename Target>
|
|
static const std::string& ComputeLocationForBuild(Target const* tgt);
|
|
template <typename Target>
|
|
static const std::string& ComputeLocation(Target const* tgt,
|
|
std::string const& config);
|
|
|
|
template <typename Target>
|
|
static cmProp GetLocation(Target const* tgt, std::string const& prop,
|
|
cmMessenger* messenger,
|
|
cmListFileBacktrace const& context)
|
|
|
|
{
|
|
// Watch for special "computed" properties that are dependent on
|
|
// other properties or variables. Always recompute them.
|
|
if (tgt->GetType() == cmStateEnums::EXECUTABLE ||
|
|
tgt->GetType() == cmStateEnums::STATIC_LIBRARY ||
|
|
tgt->GetType() == cmStateEnums::SHARED_LIBRARY ||
|
|
tgt->GetType() == cmStateEnums::MODULE_LIBRARY ||
|
|
tgt->GetType() == cmStateEnums::UNKNOWN_LIBRARY) {
|
|
static const std::string propLOCATION = "LOCATION";
|
|
if (prop == propLOCATION) {
|
|
if (!tgt->IsImported() &&
|
|
!HandleLocationPropertyPolicy(tgt->GetName(), messenger,
|
|
context)) {
|
|
return nullptr;
|
|
}
|
|
return &ComputeLocationForBuild(tgt);
|
|
}
|
|
|
|
// Support "LOCATION_<CONFIG>".
|
|
if (cmHasLiteralPrefix(prop, "LOCATION_")) {
|
|
if (!tgt->IsImported() &&
|
|
!HandleLocationPropertyPolicy(tgt->GetName(), messenger,
|
|
context)) {
|
|
return nullptr;
|
|
}
|
|
std::string configName = prop.substr(9);
|
|
return &ComputeLocation(tgt, configName);
|
|
}
|
|
|
|
// Support "<CONFIG>_LOCATION".
|
|
if (cmHasLiteralSuffix(prop, "_LOCATION") &&
|
|
!cmHasLiteralPrefix(prop, "XCODE_ATTRIBUTE_")) {
|
|
std::string configName(prop.c_str(), prop.size() - 9);
|
|
if (configName != "IMPORTED") {
|
|
if (!tgt->IsImported() &&
|
|
!HandleLocationPropertyPolicy(tgt->GetName(), messenger,
|
|
context)) {
|
|
return nullptr;
|
|
}
|
|
return &ComputeLocation(tgt, configName);
|
|
}
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
template <typename Target>
|
|
static cmProp GetSources(Target const* tgt, cmMessenger* messenger,
|
|
cmListFileBacktrace const& context);
|
|
};
|
|
|
|
#endif
|