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

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
 library target.  If not set, the logical target name is used by
 default.
 default.
 
 
+Contents of ``OUTPUT_NAME`` and the variants listed below may use
+:manual:`generator expressions <cmake-generator-expressions(7)>`.
+
 See also the variants:
 See also the variants:
 
 
 * :prop_tgt:`OUTPUT_NAME_<CONFIG>`
 * :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
   // OUTPUT_NAME
   props.push_back("OUTPUT_NAME");
   props.push_back("OUTPUT_NAME");
 
 
+  std::string outName;
   for(std::vector<std::string>::const_iterator i = props.begin();
   for(std::vector<std::string>::const_iterator i = props.begin();
       i != props.end(); ++i)
       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>
   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.
 # Work-around: Visual Studio 6 does not support per-target object files.
 set(VS6)
 set(VS6)
 if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 6")
 if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 6")
@@ -446,7 +452,7 @@ install(
   TARGETS
   TARGETS
   testExe1 testLib1 testLib2 testExe2 testLib3 testLib4 testExe3
   testExe1 testLib1 testLib2 testExe2 testLib3 testLib4 testExe3
   testExe2lib testLib4lib testLib4libdbg testLib4libopt
   testExe2lib testLib4lib testLib4libdbg testLib4libopt
-  testLib6
+  testLib6 testLib7
   testLibCycleA testLibCycleB
   testLibCycleA testLibCycleB
   cmp0022NEW cmp0022OLD
   cmp0022NEW cmp0022OLD
   systemlib
   systemlib
@@ -505,7 +511,7 @@ export(TARGETS testExe1 testLib1 testLib2 testLib3
   NAMESPACE bld_
   NAMESPACE bld_
   FILE ExportBuildTree.cmake
   FILE ExportBuildTree.cmake
   )
   )
-export(TARGETS testExe2 testLib4 testLib5 testLib6 testExe3 testExe2lib
+export(TARGETS testExe2 testLib4 testLib5 testLib6 testLib7 testExe3 testExe2lib
   testLib4lib testLib4libdbg testLib4libopt
   testLib4lib testLib4libdbg testLib4libopt
   testLibCycleA testLibCycleB
   testLibCycleA testLibCycleB
   testLibPerConfigDest
   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_testLib4
   exp_testLib5
   exp_testLib5
   exp_testLib6
   exp_testLib6
+  exp_testLib7
   exp_testLibCycleA
   exp_testLibCycleA
   exp_testLibPerConfigDest
   exp_testLibPerConfigDest
   )
   )
@@ -66,6 +67,7 @@ target_link_libraries(imp_testExe1b
   bld_testLib4
   bld_testLib4
   bld_testLib5
   bld_testLib5
   bld_testLib6
   bld_testLib6
+  bld_testLib7
   bld_testLibCycleA
   bld_testLibCycleA
   bld_testLibPerConfigDest
   bld_testLibPerConfigDest
   )
   )

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

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