Просмотр исходного кода

Add generator expression support to OUTPUT_NAME target property

Robert Goulet 10 лет назад
Родитель
Сommit
809159c9b7

+ 3 - 0
Help/prop_tgt/OUTPUT_NAME.rst

@@ -7,6 +7,9 @@ This sets the base name for output files created for an executable or
 library target.  If not set, the logical target name is used by
 default.
 
+Contents of ``OUTPUT_NAME`` and the variants listed below may use
+:manual:`generator expressions <cmake-generator-expressions(7)>`.
+
 See also the variants:
 
 * :prop_tgt:`OUTPUT_NAME_<CONFIG>`

+ 5 - 0
Help/release/dev/OUTPUT_NAME-genex.rst

@@ -0,0 +1,5 @@
+OUTPUT_NAME-genex
+-----------------
+
+* The :prop_tgt:`OUTPUT_NAME` target property and its variants learned to
+  support :manual:`generator expressions <cmake-generator-expressions(7)>`.

+ 13 - 3
Source/cmTarget.cxx

@@ -4597,15 +4597,25 @@ std::string cmTarget::GetOutputName(const std::string& config,
   // OUTPUT_NAME
   props.push_back("OUTPUT_NAME");
 
+  std::string outName;
   for(std::vector<std::string>::const_iterator i = props.begin();
       i != props.end(); ++i)
     {
-    if(const char* outName = this->GetProperty(*i))
+    if (const char* outNameProp = this->GetProperty(*i))
       {
-      return outName;
+      outName = outNameProp;
+      break;
       }
     }
-  return this->GetName();
+
+  if (outName.empty())
+    {
+    outName = this->GetName();
+    }
+
+  cmGeneratorExpression ge;
+  cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(outName);
+  return cge->Evaluate(this->Makefile, config);
 }
 
 //----------------------------------------------------------------------------

+ 8 - 2
Tests/ExportImport/Export/CMakeLists.txt

@@ -73,6 +73,12 @@ install(TARGETS testLibPerConfigDest EXPORT exp
   DESTINATION lib/$<$<BOOL:$<CONFIG>>:$<CONFIG>>$<$<NOT:$<BOOL:$<CONFIG>>>:NoConfig>
   )
 
+# Test OUTPUT_NAME properties with generator expressions
+add_library(testLib7 STATIC testLib7.c)
+set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_DEBUG testLib7D-$<CONFIG>)
+set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_RELEASE testLib7R-$<CONFIG>)
+set_property(TARGET testLib7 PROPERTY OUTPUT_NAME testLib7-$<CONFIG>)
+
 # Work-around: Visual Studio 6 does not support per-target object files.
 set(VS6)
 if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 6")
@@ -446,7 +452,7 @@ install(
   TARGETS
   testExe1 testLib1 testLib2 testExe2 testLib3 testLib4 testExe3
   testExe2lib testLib4lib testLib4libdbg testLib4libopt
-  testLib6
+  testLib6 testLib7
   testLibCycleA testLibCycleB
   cmp0022NEW cmp0022OLD
   systemlib
@@ -505,7 +511,7 @@ export(TARGETS testExe1 testLib1 testLib2 testLib3
   NAMESPACE bld_
   FILE ExportBuildTree.cmake
   )
-export(TARGETS testExe2 testLib4 testLib5 testLib6 testExe3 testExe2lib
+export(TARGETS testExe2 testLib4 testLib5 testLib6 testLib7 testExe3 testExe2lib
   testLib4lib testLib4libdbg testLib4libopt
   testLibCycleA testLibCycleB
   testLibPerConfigDest

+ 1 - 0
Tests/ExportImport/Export/testLib7.c

@@ -0,0 +1 @@
+int testLib7(void) { return 0; }

+ 2 - 0
Tests/ExportImport/Import/A/CMakeLists.txt

@@ -33,6 +33,7 @@ target_link_libraries(imp_testExe1
   exp_testLib4
   exp_testLib5
   exp_testLib6
+  exp_testLib7
   exp_testLibCycleA
   exp_testLibPerConfigDest
   )
@@ -66,6 +67,7 @@ target_link_libraries(imp_testExe1b
   bld_testLib4
   bld_testLib5
   bld_testLib6
+  bld_testLib7
   bld_testLibCycleA
   bld_testLibPerConfigDest
   )

+ 2 - 1
Tests/ExportImport/Import/A/imp_testExe1.c

@@ -6,6 +6,7 @@ extern int testLib4();
 extern int testLib4lib();
 extern int testLib5();
 extern int testLib6();
+extern int testLib7();
 extern int testLibCycleA1();
 extern int testLibPerConfigDest();
 
@@ -21,7 +22,7 @@ extern testLib4libcfg(void);
 int main()
 {
   return (testLib2() + generated_by_testExe1() + testLib3() + testLib4()
-          + testLib5() + testLib6() + testLibCycleA1()
+          + testLib5() + testLib6() + testLib7() + testLibCycleA1()
           + testLibPerConfigDest()
           + generated_by_testExe3() + testLib4lib() + testLib4libcfg());
 }