summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-05-01 13:45:43 (GMT)
committerBrad King <brad.king@kitware.com>2009-05-01 13:45:43 (GMT)
commit2740db5eded92d61ae38e69d67a4e4179ae5d20e (patch)
tree0bc79f92f7f492ad3215a0a28c182fa7a9faeebc
parent617eb981d4184b30987c5c666d9631735148d59d (diff)
downloadCMake-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.cxx111
-rw-r--r--Source/cmTarget.h3
-rw-r--r--Tests/ExportImport/Export/CMakeLists.txt9
-rw-r--r--Tests/SimpleInstall/CMakeLists.txt6
-rw-r--r--Tests/SimpleInstallS2/CMakeLists.txt6
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)