From 617eb981d4184b30987c5c666d9631735148d59d Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 1 May 2009 09:45:19 -0400 Subject: [PATCH] ENH: Refactor target output file type computation This creates method cmTarget::GetOutputTargetType to compute the output file type 'ARCHIVE', 'LIBRARY', or 'RUNTIME' from the platform and target type. It factors out logic from the target output directory computation code for later re-use. --- Source/cmTarget.cxx | 116 +++++++++++++++++++++++--------------------- Source/cmTarget.h | 3 ++ 2 files changed, 63 insertions(+), 56 deletions(-) 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);