Răsfoiți Sursa

ENH: Added support for getting a target's location on a per-configuration basis (ex. DEBUG_LOCATION). This does not fix but helps with bug#3250.

Brad King 19 ani în urmă
părinte
comite
fdcc888c56
2 a modificat fișierele cu 18 adăugiri și 3 ștergeri
  1. 9 2
      Source/cmGetTargetPropertyCommand.h
  2. 9 1
      Source/cmTarget.cxx

+ 9 - 2
Source/cmGetTargetPropertyCommand.h

@@ -58,10 +58,17 @@ public:
         "will be set to \"NOTFOUND\".  Use SET_TARGET_PROPERTIES to set "
         "property values.  Properties are usually used to control how "
         "a target is built.\n"
+        "The read-only property \"<CONFIG>_LOCATION\" provides the full "
+        "path to the file on disk that will be created for the target when "
+        "building under configuration <CONFIG> "
+        "(in upper-case, such as \"DEBUG_LOCATION\"). "
         "The read-only property \"LOCATION\" specifies "
         "the full path to the file on disk that will be created for the "
-        "target.  This is very useful for executable targets to get "
-        "the path to the executable file for use in a custom command. "
+        "target. The path may contain a build-system-specific portion that "
+        "is replaced at build time with the configuration getting built "
+        "(such as \"$(ConfigurationName)\" in VS). "
+        "This is very useful for executable targets to get "
+        "the path to the executable file for use in a custom command.\n"
         "The read-only property \"TYPE\" returns which type the specified "
         "target has (EXECUTABLE, STATIC_LIBRARY, SHARED_LIBRARY, "
         "MODULE_LIBRARY, UTILITY, INSTALL_FILES or INSTALL_PROGRAMS). "

+ 9 - 1
Source/cmTarget.cxx

@@ -907,7 +907,15 @@ const char *cmTarget::GetProperty(const char* prop)
     // variable in the location.
     this->SetProperty("LOCATION", this->GetLocation(0));
     }
-  
+
+  // Per-configuration location can be computed.
+  int len = static_cast<int>(strlen(prop));
+  if(len > 9 && strcmp(prop+len-9, "_LOCATION") == 0)
+    {
+    std::string configName(prop, len-9);
+    this->SetProperty(prop, this->GetLocation(configName.c_str()));
+    }
+
   // the type property returns what type the target is
   if (!strcmp(prop,"TYPE"))
     {