diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 8c8352fd1..4d3aa8c14 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3166,6 +3166,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) { @@ -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 23ef9dc10..4bee06f66 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);