cmTargetPropertyComputer.h 3.78 KB
Newer Older
1 2 3 4 5 6 7
/* 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

8 9
#include <string>

10
#include "cmAlgorithms.h"
11
#include "cmListFileCache.h"
12
#include "cmStateTypes.h"
13
#include "cmSystemTools.h"
14 15 16 17 18 19

class cmMessenger;

class cmTargetPropertyComputer
{
public:
20 21
  template <typename Target>
  static const char* GetProperty(Target const* tgt, const std::string& prop,
22
                                 cmMessenger* messenger,
23 24 25 26 27 28 29 30 31 32 33 34 35
                                 cmListFileBacktrace const& context)
  {
    if (const char* loc = GetLocation(tgt, prop, messenger, context)) {
      return loc;
    }
    if (cmSystemTools::GetFatalErrorOccured()) {
      return CM_NULLPTR;
    }
    if (prop == "SOURCES") {
      return GetSources(tgt, messenger, context);
    }
    return CM_NULLPTR;
  }
36

37 38
  static bool WhiteListedInterfaceProperty(const std::string& prop);

39
  static bool PassesWhitelist(cmStateEnums::TargetType tgtType,
40 41 42
                              std::string const& prop, cmMessenger* messenger,
                              cmListFileBacktrace const& context);

43 44 45 46 47
private:
  static bool HandleLocationPropertyPolicy(std::string const& tgtName,
                                           cmMessenger* messenger,
                                           cmListFileBacktrace const& context);

48 49 50 51
  template <typename Target>
  static const char* ComputeLocationForBuild(Target const* tgt);
  template <typename Target>
  static const char* ComputeLocation(Target const* tgt,
52
                                     std::string const& config);
53 54 55

  template <typename Target>
  static const char* GetLocation(Target const* tgt, std::string const& prop,
56
                                 cmMessenger* messenger,
57 58 59 60 61
                                 cmListFileBacktrace const& context)

  {
    // Watch for special "computed" properties that are dependent on
    // other properties or variables.  Always recompute them.
62 63 64 65 66
    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) {
67 68 69 70 71 72 73 74 75 76 77
      static const std::string propLOCATION = "LOCATION";
      if (prop == propLOCATION) {
        if (!tgt->IsImported() &&
            !HandleLocationPropertyPolicy(tgt->GetName(), messenger,
                                          context)) {
          return CM_NULLPTR;
        }
        return ComputeLocationForBuild(tgt);
      }

      // Support "LOCATION_<CONFIG>".
78
      if (cmHasLiteralPrefix(prop, "LOCATION_")) {
79 80 81 82 83 84 85 86 87 88
        if (!tgt->IsImported() &&
            !HandleLocationPropertyPolicy(tgt->GetName(), messenger,
                                          context)) {
          return CM_NULLPTR;
        }
        const char* configName = prop.c_str() + 9;
        return ComputeLocation(tgt, configName);
      }

      // Support "<CONFIG>_LOCATION".
89 90
      if (cmHasLiteralSuffix(prop, "_LOCATION") &&
          !cmHasLiteralPrefix(prop, "XCODE_ATTRIBUTE_")) {
91 92 93 94 95 96 97 98 99 100 101 102 103
        std::string configName(prop.c_str(), prop.size() - 9);
        if (configName != "IMPORTED") {
          if (!tgt->IsImported() &&
              !HandleLocationPropertyPolicy(tgt->GetName(), messenger,
                                            context)) {
            return CM_NULLPTR;
          }
          return ComputeLocation(tgt, configName);
        }
      }
    }
    return CM_NULLPTR;
  }
104

105 106
  template <typename Target>
  static const char* GetSources(Target const* tgt, cmMessenger* messenger,
107
                                cmListFileBacktrace const& context);
108 109 110
};

#endif