diff options
author | Brad King <brad.king@kitware.com> | 2009-05-01 13:45:43 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-05-01 13:45:43 (GMT) |
commit | 2740db5eded92d61ae38e69d67a4e4179ae5d20e (patch) | |
tree | 0bc79f92f7f492ad3215a0a28c182fa7a9faeebc | |
parent | 617eb981d4184b30987c5c666d9631735148d59d (diff) | |
download | CMake-2740db5eded92d61ae38e69d67a4e4179ae5d20e.zip CMake-2740db5eded92d61ae38e69d67a4e4179ae5d20e.tar.gz CMake-2740db5eded92d61ae38e69d67a4e4179ae5d20e.tar.bz2 |
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_<CONFIG>, LIBRARY_OUTPUT_NAME_<CONFIG>, and
RUNTIME_OUTPUT_NAME_<CONFIG>. 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 <CONFIG>_OUTPUT_NAME
property is now also available as OUTPUT_NAME_<CONFIG>.
See issue #8920.
-rw-r--r-- | Source/cmTarget.cxx | 111 | ||||
-rw-r--r-- | Source/cmTarget.h | 3 | ||||
-rw-r--r-- | Tests/ExportImport/Export/CMakeLists.txt | 9 | ||||
-rw-r--r-- | Tests/SimpleInstall/CMakeLists.txt | 6 | ||||
-rw-r--r-- | Tests/SimpleInstallS2/CMakeLists.txt | 6 |
5 files changed, 105 insertions, 30 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 4d3aa8c..7acfe7e 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 " - "<CONFIG>_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_<CONFIG>", cmProperty::TARGET, + "Per-configuration target file base name.", + "This is the configuration-specific version of OUTPUT_NAME."); + + cm->DefineProperty + ("<CONFIG>_OUTPUT_NAME", cmProperty::TARGET, + "Old per-configuration target file base name.", + "This is a configuration-specific version of OUTPUT_NAME. " + "Use OUTPUT_NAME_<CONFIG> 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_<CONFIG> properties. " + CM_TARGET_FILE_TYPES_DOC); + cm->DefineProperty + ("ARCHIVE_OUTPUT_NAME_<CONFIG>", 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_<CONFIG> properties. " + CM_TARGET_FILE_TYPES_DOC); + cm->DefineProperty + ("LIBRARY_OUTPUT_NAME_<CONFIG>", 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_<CONFIG> properties. " + CM_TARGET_FILE_TYPES_DOC); + cm->DefineProperty + ("RUNTIME_OUTPUT_NAME_<CONFIG>", 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:""; @@ -3316,6 +3334,43 @@ std::string const& cmTarget::ComputeBaseOutputDir(bool implib) } //---------------------------------------------------------------------------- +std::string cmTarget::GetOutputName(const char* config, bool implib) +{ + std::vector<std::string> props; + std::string type = this->GetOutputTargetType(implib); + std::string configUpper = cmSystemTools::UpperCase(config? config : ""); + if(!type.empty() && !configUpper.empty()) + { + // <ARCHIVE|LIBRARY|RUNTIME>_OUTPUT_NAME_<CONFIG> + props.push_back(type + "_OUTPUT_NAME_" + configUpper); + } + if(!type.empty()) + { + // <ARCHIVE|LIBRARY|RUNTIME>_OUTPUT_NAME + props.push_back(type + "_OUTPUT_NAME"); + } + if(!configUpper.empty()) + { + // OUTPUT_NAME_<CONFIG> + props.push_back("OUTPUT_NAME_" + configUpper); + // <CONFIG>_OUTPUT_NAME + props.push_back(configUpper + "_OUTPUT_NAME"); + } + // OUTPUT_NAME + props.push_back("OUTPUT_NAME"); + + for(std::vector<std::string>::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() { if(const char* fversion = this->GetProperty("FRAMEWORK_VERSION")) diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 4bee06f..e1caaef 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 19cd22f..ebfe8d3 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 <ARCHIVE|LIBRARY|RUNTIME>_OUTPUT_NAME[_<CONFIG>] 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 1a87c56..7a249d8 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 <ARCHIVE|LIBRARY|RUNTIME>_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 1a87c56..7a249d8 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 <ARCHIVE|LIBRARY|RUNTIME>_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) |