From 2740db5eded92d61ae38e69d67a4e4179ae5d20e Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 1 May 2009 09:45:43 -0400 Subject: [PATCH] ENH: Allow more specification of target file names This creates target properties ARCHIVE_OUTPUT_NAME, LIBRARY_OUTPUT_NAME, and RUNTIME_OUTPUT_NAME, and per-configuration equivalent properties ARCHIVE_OUTPUT_NAME_, LIBRARY_OUTPUT_NAME_, and RUNTIME_OUTPUT_NAME_. They allow specification of target output file names on a per-type, per-configuration basis. For example, a .dll and its .lib import library may have different base names. For consistency and to avoid ambiguity, the old _OUTPUT_NAME property is now also available as OUTPUT_NAME_. See issue #8920. --- Source/cmTarget.cxx | 111 +++++++++++++++++------ Source/cmTarget.h | 3 + Tests/ExportImport/Export/CMakeLists.txt | 9 ++ Tests/SimpleInstall/CMakeLists.txt | 6 +- Tests/SimpleInstallS2/CMakeLists.txt | 6 +- 5 files changed, 105 insertions(+), 30 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 4d3aa8c14..7acfe7e0f 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -468,12 +468,21 @@ void cmTarget::DefineProperties(cmake *cm) cm->DefineProperty ("OUTPUT_NAME", cmProperty::TARGET, - "Sets the real name of a target when it is built.", - "Sets the real name of a target when it is built and " - "can be used to help create two targets of the same name even though " - "CMake requires unique logical target names. There is also a " - "_OUTPUT_NAME that can set the output name on a " - "per-configuration basis."); + "Output name for target files.", + "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."); + + cm->DefineProperty + ("OUTPUT_NAME_", cmProperty::TARGET, + "Per-configuration target file base name.", + "This is the configuration-specific version of OUTPUT_NAME."); + + cm->DefineProperty + ("_OUTPUT_NAME", cmProperty::TARGET, + "Old per-configuration target file base name.", + "This is a configuration-specific version of OUTPUT_NAME. " + "Use OUTPUT_NAME_ instead."); cm->DefineProperty ("PRE_INSTALL_SCRIPT", cmProperty::TARGET, @@ -791,9 +800,36 @@ void cmTarget::DefineProperties(cmake *cm) "This property is initialized by the value of the variable " "CMAKE_RUNTIME_OUTPUT_DIRECTORY if it is set when a target is created."); - // define some properties without documentation - cm->DefineProperty("DEBUG_OUTPUT_NAME", cmProperty::TARGET,0,0); - cm->DefineProperty("RELEASE_OUTPUT_NAME", cmProperty::TARGET,0,0); + cm->DefineProperty + ("ARCHIVE_OUTPUT_NAME", cmProperty::TARGET, + "Output name for ARCHIVE target files.", + "This property specifies the base name for archive target files. " + "It overrides OUTPUT_NAME and OUTPUT_NAME_ properties. " + CM_TARGET_FILE_TYPES_DOC); + cm->DefineProperty + ("ARCHIVE_OUTPUT_NAME_", cmProperty::TARGET, + "Per-configuration output name for ARCHIVE target files.", + "This is the configuration-specific version of ARCHIVE_OUTPUT_NAME."); + cm->DefineProperty + ("LIBRARY_OUTPUT_NAME", cmProperty::TARGET, + "Output name for LIBRARY target files.", + "This property specifies the base name for library target files. " + "It overrides OUTPUT_NAME and OUTPUT_NAME_ properties. " + CM_TARGET_FILE_TYPES_DOC); + cm->DefineProperty + ("LIBRARY_OUTPUT_NAME_", cmProperty::TARGET, + "Per-configuration output name for LIBRARY target files.", + "This is the configuration-specific version of LIBRARY_OUTPUT_NAME."); + cm->DefineProperty + ("RUNTIME_OUTPUT_NAME", cmProperty::TARGET, + "Output name for RUNTIME target files.", + "This property specifies the base name for runtime target files. " + "It overrides OUTPUT_NAME and OUTPUT_NAME_ properties. " + CM_TARGET_FILE_TYPES_DOC); + cm->DefineProperty + ("RUNTIME_OUTPUT_NAME_", cmProperty::TARGET, + "Per-configuration output name for RUNTIME target files.", + "This is the configuration-specific version of RUNTIME_OUTPUT_NAME."); } void cmTarget::SetType(TargetType type, const char* name) @@ -2654,25 +2690,7 @@ void cmTarget::GetFullNameInternal(TargetType type, outPrefix = targetPrefix?targetPrefix:""; // Append the target name or property-specified name. - const char* outName = 0; - if(config && *config) - { - std::string configProp = cmSystemTools::UpperCase(config); - configProp += "_OUTPUT_NAME"; - outName = this->GetProperty(configProp.c_str()); - } - if(!outName) - { - outName = this->GetProperty("OUTPUT_NAME"); - } - if(outName) - { - outBase = outName; - } - else - { - outBase = this->GetName(); - } + outBase += this->GetOutputName(config, implib); // Append the per-configuration postfix. outBase += configPostfix?configPostfix:""; @@ -3315,6 +3333,43 @@ std::string const& cmTarget::ComputeBaseOutputDir(bool implib) return out; } +//---------------------------------------------------------------------------- +std::string cmTarget::GetOutputName(const char* config, bool implib) +{ + std::vector props; + std::string type = this->GetOutputTargetType(implib); + std::string configUpper = cmSystemTools::UpperCase(config? config : ""); + if(!type.empty() && !configUpper.empty()) + { + // _OUTPUT_NAME_ + props.push_back(type + "_OUTPUT_NAME_" + configUpper); + } + if(!type.empty()) + { + // _OUTPUT_NAME + props.push_back(type + "_OUTPUT_NAME"); + } + if(!configUpper.empty()) + { + // OUTPUT_NAME_ + props.push_back("OUTPUT_NAME_" + configUpper); + // _OUTPUT_NAME + props.push_back(configUpper + "_OUTPUT_NAME"); + } + // OUTPUT_NAME + props.push_back("OUTPUT_NAME"); + + for(std::vector::const_iterator i = props.begin(); + i != props.end(); ++i) + { + if(const char* outName = this->GetProperty(i->c_str())) + { + return outName; + } + } + return this->GetName(); +} + //---------------------------------------------------------------------------- std::string cmTarget::GetFrameworkVersion() { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 4bee06f66..e1caaeff1 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -501,6 +501,9 @@ private: std::string GetOutputDir(bool implib); std::string const& ComputeBaseOutputDir(bool implib); + // Get the target base name. + std::string GetOutputName(const char* config, bool implib); + const char* ImportedGetLocation(const char* config); const char* NormalGetLocation(const char* config); diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt index 19cd22f72..ebfe8d335 100644 --- a/Tests/ExportImport/Export/CMakeLists.txt +++ b/Tests/ExportImport/Export/CMakeLists.txt @@ -36,6 +36,15 @@ set_property(TARGET testLib3 PROPERTY LINK_INTERFACE_LIBRARIES "") set_property(TARGET testLib3 PROPERTY VERSION 1.2) set_property(TARGET testLib3 PROPERTY SOVERSION 3) +# Test _OUTPUT_NAME[_] properties. +set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_DEBUG testLib3dll-d) +set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_RELEASE testLib3dll-r) +set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME testLib3dll) +set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_DEBUG testLib3lib-d) +set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_RELEASE testLib3lib-r) +set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME testLib3lib) +set_property(TARGET testLib3 PROPERTY ARCHIVE_OUTPUT_NAME testLib3import) + add_library(testLib4 SHARED testLib4.c) set_property(TARGET testLib4 PROPERTY FRAMEWORK 1) diff --git a/Tests/SimpleInstall/CMakeLists.txt b/Tests/SimpleInstall/CMakeLists.txt index 1a87c5656..7a249d870 100644 --- a/Tests/SimpleInstall/CMakeLists.txt +++ b/Tests/SimpleInstall/CMakeLists.txt @@ -33,7 +33,7 @@ IF(STAGE2) ) SET(t1NAMES test1 test1${CMAKE_DEBUG_POSTFIX} test1rel) SET(t2NAMES test2 test2${CMAKE_DEBUG_POSTFIX}) - SET(t4NAMES test4 test4${CMAKE_DEBUG_POSTFIX}) + SET(t4NAMES test4out test4out${CMAKE_DEBUG_POSTFIX}) # Make sure the install script ran. SET(CMAKE_INSTALL_SCRIPT_DID_RUN 0) @@ -165,6 +165,10 @@ ELSE(STAGE2) ADD_LIBRARY(test3 MODULE lib3.cxx) ADD_LIBRARY(test4 SHARED lib4.cxx) + # Test _OUTPUT_NAME properties. + SET_PROPERTY(TARGET test4 PROPERTY ARCHIVE_OUTPUT_NAME test4out) + SET_PROPERTY(TARGET test4 PROPERTY LIBRARY_OUTPUT_NAME test4out) + ADD_EXECUTABLE (SimpleInstall inst.cxx foo.c foo.h) TARGET_LINK_LIBRARIES(SimpleInstall test1 test2 test4) SET(install_target SimpleInstall) diff --git a/Tests/SimpleInstallS2/CMakeLists.txt b/Tests/SimpleInstallS2/CMakeLists.txt index 1a87c5656..7a249d870 100644 --- a/Tests/SimpleInstallS2/CMakeLists.txt +++ b/Tests/SimpleInstallS2/CMakeLists.txt @@ -33,7 +33,7 @@ IF(STAGE2) ) SET(t1NAMES test1 test1${CMAKE_DEBUG_POSTFIX} test1rel) SET(t2NAMES test2 test2${CMAKE_DEBUG_POSTFIX}) - SET(t4NAMES test4 test4${CMAKE_DEBUG_POSTFIX}) + SET(t4NAMES test4out test4out${CMAKE_DEBUG_POSTFIX}) # Make sure the install script ran. SET(CMAKE_INSTALL_SCRIPT_DID_RUN 0) @@ -165,6 +165,10 @@ ELSE(STAGE2) ADD_LIBRARY(test3 MODULE lib3.cxx) ADD_LIBRARY(test4 SHARED lib4.cxx) + # Test _OUTPUT_NAME properties. + SET_PROPERTY(TARGET test4 PROPERTY ARCHIVE_OUTPUT_NAME test4out) + SET_PROPERTY(TARGET test4 PROPERTY LIBRARY_OUTPUT_NAME test4out) + ADD_EXECUTABLE (SimpleInstall inst.cxx foo.c foo.h) TARGET_LINK_LIBRARIES(SimpleInstall test1 test2 test4) SET(install_target SimpleInstall)