You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.8 KiB
111 lines
3.8 KiB
/* 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 "cmAlgorithms.h"
|
|
#include "cmListFileCache.h"
|
|
#include "cmStateTypes.h"
|
|
#include "cmSystemTools.h"
|
|
|
|
class cmMessenger;
|
|
|
|
class cmTargetPropertyComputer
|
|
{
|
|
public:
|
|
template <typename Target>
|
|
static const char* GetProperty(Target const* tgt, const std::string& prop,
|
|
cmMessenger* messenger,
|
|
cmListFileBacktrace const& context)
|
|
{
|
|
if (const char* loc = GetLocation(tgt, prop, messenger, context)) {
|
|
return loc;
|
|
}
|
|
if (cmSystemTools::GetFatalErrorOccured()) {
|
|
return nullptr;
|
|
}
|
|
if (prop == "SOURCES") {
|
|
return GetSources(tgt, messenger, context);
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
static bool WhiteListedInterfaceProperty(const std::string& prop);
|
|
|
|
static bool PassesWhitelist(cmStateEnums::TargetType tgtType,
|
|
std::string const& prop, cmMessenger* messenger,
|
|
cmListFileBacktrace const& context);
|
|
|
|
private:
|
|
static bool HandleLocationPropertyPolicy(std::string const& tgtName,
|
|
cmMessenger* messenger,
|
|
cmListFileBacktrace const& context);
|
|
|
|
template <typename Target>
|
|
static const char* ComputeLocationForBuild(Target const* tgt);
|
|
template <typename Target>
|
|
static const char* ComputeLocation(Target const* tgt,
|
|
std::string const& config);
|
|
|
|
template <typename Target>
|
|
static const char* 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;
|
|
}
|
|
const char* configName = prop.c_str() + 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 const char* GetSources(Target const* tgt, cmMessenger* messenger,
|
|
cmListFileBacktrace const& context);
|
|
};
|
|
|
|
#endif
|