diff --git a/Help/prop_tgt/OUTPUT_NAME.rst b/Help/prop_tgt/OUTPUT_NAME.rst index 24e57cdc9..f1bdb7c88 100644 --- a/Help/prop_tgt/OUTPUT_NAME.rst +++ b/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 `. + See also the variants: * :prop_tgt:`OUTPUT_NAME_` diff --git a/Help/release/dev/OUTPUT_NAME-genex.rst b/Help/release/dev/OUTPUT_NAME-genex.rst new file mode 100644 index 000000000..0a3982099 --- /dev/null +++ b/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 `. diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 3353fbd4a..2b73e6f09 100644 --- a/Source/cmTarget.cxx +++ b/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::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 cge = ge.Parse(outName); + return cge->Evaluate(this->Makefile, config); } //---------------------------------------------------------------------------- diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt index 0df42d982..df3f178e1 100644 --- a/Tests/ExportImport/Export/CMakeLists.txt +++ b/Tests/ExportImport/Export/CMakeLists.txt @@ -73,6 +73,12 @@ install(TARGETS testLibPerConfigDest EXPORT exp DESTINATION lib/$<$>:$>$<$>>:NoConfig> ) +# Test OUTPUT_NAME properties with generator expressions +add_library(testLib7 STATIC testLib7.c) +set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_DEBUG testLib7D-$) +set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_RELEASE testLib7R-$) +set_property(TARGET testLib7 PROPERTY OUTPUT_NAME testLib7-$) + # 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 diff --git a/Tests/ExportImport/Export/testLib7.c b/Tests/ExportImport/Export/testLib7.c new file mode 100644 index 000000000..7acae9eb1 --- /dev/null +++ b/Tests/ExportImport/Export/testLib7.c @@ -0,0 +1 @@ +int testLib7(void) { return 0; } diff --git a/Tests/ExportImport/Import/A/CMakeLists.txt b/Tests/ExportImport/Import/A/CMakeLists.txt index 17d983a75..a74bad102 100644 --- a/Tests/ExportImport/Import/A/CMakeLists.txt +++ b/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 ) diff --git a/Tests/ExportImport/Import/A/imp_testExe1.c b/Tests/ExportImport/Import/A/imp_testExe1.c index 150fcef3e..56cdd2c0a 100644 --- a/Tests/ExportImport/Import/A/imp_testExe1.c +++ b/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()); }