summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmTarget.cxx116
-rw-r--r--Source/cmTarget.h3
2 files changed, 63 insertions, 56 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 8c8352f..4d3aa8c 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -3167,6 +3167,62 @@ std::string cmTarget::GetInstallNameDirForInstallTree(const char* config,
}
//----------------------------------------------------------------------------
+const char* cmTarget::GetOutputTargetType(bool implib)
+{
+ switch(this->GetType())
+ {
+ case cmTarget::SHARED_LIBRARY:
+ if(this->DLLPlatform)
+ {
+ if(implib)
+ {
+ // A DLL import library is treated as an archive target.
+ return "ARCHIVE";
+ }
+ else
+ {
+ // A DLL shared library is treated as a runtime target.
+ return "RUNTIME";
+ }
+ }
+ else
+ {
+ // For non-DLL platforms shared libraries are treated as
+ // library targets.
+ return "LIBRARY";
+ }
+ case cmTarget::STATIC_LIBRARY:
+ // Static libraries are always treated as archive targets.
+ return "ARCHIVE";
+ case cmTarget::MODULE_LIBRARY:
+ if(implib)
+ {
+ // Module libraries are always treated as library targets.
+ return "ARCHIVE";
+ }
+ else
+ {
+ // Module import libraries are treated as archive targets.
+ return "LIBRARY";
+ }
+ case cmTarget::EXECUTABLE:
+ if(implib)
+ {
+ // Executable import libraries are treated as archive targets.
+ return "ARCHIVE";
+ }
+ else
+ {
+ // Executables are always treated as runtime targets.
+ return "RUNTIME";
+ }
+ default:
+ break;
+ }
+ return "";
+}
+
+//----------------------------------------------------------------------------
std::string cmTarget::GetOutputDir(bool implib)
{
// The implib option is only allowed for shared libraries, module
@@ -3220,63 +3276,11 @@ std::string const& cmTarget::ComputeBaseOutputDir(bool implib)
// Look for a target property defining the target output directory
// based on the target type.
const char* propertyName = 0;
- switch(this->GetType())
+ std::string propertyNameStr = this->GetOutputTargetType(implib);
+ if(!propertyNameStr.empty())
{
- case cmTarget::SHARED_LIBRARY:
- {
- // For non-DLL platforms shared libraries are treated as
- // library targets. For DLL platforms the DLL part of a
- // shared library is treated as a runtime target and the
- // corresponding import library is treated as an archive
- // target.
- if(this->DLLPlatform)
- {
- if(implib)
- {
- propertyName = "ARCHIVE_OUTPUT_DIRECTORY";
- }
- else
- {
- propertyName = "RUNTIME_OUTPUT_DIRECTORY";
- }
- }
- else
- {
- propertyName = "LIBRARY_OUTPUT_DIRECTORY";
- }
- } break;
- case cmTarget::STATIC_LIBRARY:
- {
- // Static libraries are always treated as archive targets.
- propertyName = "ARCHIVE_OUTPUT_DIRECTORY";
- } break;
- case cmTarget::MODULE_LIBRARY:
- {
- // Module libraries are always treated as library targets.
- // Module import libraries are treated as archive targets.
- if(implib)
- {
- propertyName = "ARCHIVE_OUTPUT_DIRECTORY";
- }
- else
- {
- propertyName = "LIBRARY_OUTPUT_DIRECTORY";
- }
- } break;
- case cmTarget::EXECUTABLE:
- {
- // Executables are always treated as runtime targets.
- // Executable import libraries are treated as archive targets.
- if(implib)
- {
- propertyName = "ARCHIVE_OUTPUT_DIRECTORY";
- }
- else
- {
- propertyName = "RUNTIME_OUTPUT_DIRECTORY";
- }
- } break;
- default: break;
+ propertyNameStr += "_OUTPUT_DIRECTORY";
+ propertyName = propertyNameStr.c_str();
}
// Select an output directory.
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 23ef9dc..4bee06f 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -494,6 +494,9 @@ private:
// If the variable is not defined use the given default instead.
void SetPropertyDefault(const char* property, const char* default_value);
+ // Returns ARCHIVE, LIBRARY, or RUNTIME based on platform and type.
+ const char* GetOutputTargetType(bool implib);
+
// Get the full path to the target output directory.
std::string GetOutputDir(bool implib);
std::string const& ComputeBaseOutputDir(bool implib);