On 03/21/2013 08:11 AM, Vittorio Giovara wrote:
> similar procedure as found in cmMakefileExectuableTargetGenerator.

The logic to compute the actual target file location is more
complicated in order to support OS X frameworks and app bundles.
Also there are target types that have no final target path, like
OBJECT_LIBRARY.

Try the attached patch instead.

-Brad
>From 612993f0c6ff3a52b38fb23a3e39a2b0778da4ba Mon Sep 17 00:00:00 2001
Message-Id: <612993f0c6ff3a52b38fb23a3e39a2b0778da4ba.1363891563.git.brad.k...@kitware.com>
From: Brad King <[email protected]>
Date: Thu, 21 Mar 2013 14:31:57 -0400
Subject: [PATCH] Replace <TARGET> in CMAKE_<LANG>_COMPILE_OBJECT rule
 variables

In some languages the compiler may need to know the path of the final
target file for which an object is being compiled.  Honor the <TARGET>
placeholder for compilation rules to support such cases.

Note that this cannot work with OBJECT library targets because the final
target path is not known during compilation (there can even be more than
one final target).

Suggested-by: Vittorio Giovara <[email protected]>
---
 Source/cmMakefileTargetGenerator.cxx |    8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx
index 3d02d6a..77b347e 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -639,18 +639,25 @@ cmMakefileTargetGenerator
       (commands, buildEcho.c_str(), cmLocalUnixMakefileGenerator3::EchoBuild);
     }
 
+  std::string targetOutPathReal;
   std::string targetOutPathPDB;
   {
+  std::string targetFullPathReal;
   std::string targetFullPathPDB;
   if(this->Target->GetType() == cmTarget::EXECUTABLE ||
      this->Target->GetType() == cmTarget::STATIC_LIBRARY ||
      this->Target->GetType() == cmTarget::SHARED_LIBRARY ||
      this->Target->GetType() == cmTarget::MODULE_LIBRARY)
     {
+    targetFullPathReal =
+      this->Target->GetFullPath(this->ConfigName, false, true);
     targetFullPathPDB = this->Target->GetPDBDirectory(this->ConfigName);
     targetFullPathPDB += "/";
     targetFullPathPDB += this->Target->GetPDBName(this->ConfigName);
     }
+  targetOutPathReal =
+    this->Convert(targetFullPathReal.c_str(),cmLocalGenerator::NONE,
+                  cmLocalGenerator::SHELL);
   targetOutPathPDB =
     this->Convert(targetFullPathPDB.c_str(),cmLocalGenerator::NONE,
                   cmLocalGenerator::SHELL);
@@ -659,6 +666,7 @@ cmMakefileTargetGenerator
   vars.RuleLauncher = "RULE_LAUNCH_COMPILE";
   vars.CMTarget = this->Target;
   vars.Language = lang;
+  vars.Target = targetOutPathReal.c_str();
   vars.TargetPDB = targetOutPathPDB.c_str();
   vars.Source = sourceFile.c_str();
   std::string shellObj =
-- 
1.7.10.4

--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers

Reply via email to