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.
This commit is contained in:
Brad King 2009-05-01 09:45:19 -04:00
parent 5f7ea11f97
commit 617eb981d4
2 changed files with 63 additions and 56 deletions

View File

@ -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.

View File

@ -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);