
Add a ConvertToOutputForExisting method which can be made virtual later to satisfy different generator needs. Pass additional strings as parameters for now. They can be turned into class state later.
103 lines
3.0 KiB
C++
103 lines
3.0 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
|
|
#include "cmLinkLineComputer.h"
|
|
#include "cmComputeLinkInformation.h"
|
|
#include "cmGeneratorTarget.h"
|
|
#include "cmOutputConverter.h"
|
|
|
|
cmLinkLineComputer::cmLinkLineComputer(cmOutputConverter* outputConverter,
|
|
cmState::Directory stateDir)
|
|
: StateDir(stateDir)
|
|
, OutputConverter(outputConverter)
|
|
, ForResponse(false)
|
|
, UseWatcomQuote(false)
|
|
{
|
|
}
|
|
|
|
cmLinkLineComputer::~cmLinkLineComputer()
|
|
{
|
|
}
|
|
|
|
void cmLinkLineComputer::SetUseWatcomQuote(bool useWatcomQuote)
|
|
{
|
|
this->UseWatcomQuote = useWatcomQuote;
|
|
}
|
|
|
|
void cmLinkLineComputer::SetForResponse(bool forResponse)
|
|
{
|
|
this->ForResponse = forResponse;
|
|
}
|
|
|
|
std::string cmLinkLineComputer::ConvertToLinkReference(
|
|
std::string const& lib) const
|
|
{
|
|
std::string relLib = lib;
|
|
|
|
if (cmOutputConverter::ContainedInDirectory(
|
|
this->StateDir.GetCurrentBinary(), lib, this->StateDir)) {
|
|
relLib = cmOutputConverter::ForceToRelativePath(
|
|
this->StateDir.GetCurrentBinary(), lib);
|
|
}
|
|
return relLib;
|
|
}
|
|
|
|
std::string cmLinkLineComputer::ComputeLinkLibs(cmComputeLinkInformation& cli)
|
|
{
|
|
std::string linkLibs;
|
|
typedef cmComputeLinkInformation::ItemVector ItemVector;
|
|
ItemVector const& items = cli.GetItems();
|
|
for (ItemVector::const_iterator li = items.begin(); li != items.end();
|
|
++li) {
|
|
if (li->Target && li->Target->GetType() == cmState::INTERFACE_LIBRARY) {
|
|
continue;
|
|
}
|
|
if (li->IsPath) {
|
|
linkLibs +=
|
|
this->ConvertToOutputFormat(this->ConvertToLinkReference(li->Value));
|
|
} else {
|
|
linkLibs += li->Value;
|
|
}
|
|
linkLibs += " ";
|
|
}
|
|
return linkLibs;
|
|
}
|
|
|
|
std::string cmLinkLineComputer::ConvertToOutputFormat(std::string const& input)
|
|
{
|
|
cmOutputConverter::OutputFormat shellFormat = (this->ForResponse)
|
|
? cmOutputConverter::RESPONSE
|
|
: ((this->UseWatcomQuote) ? cmOutputConverter::WATCOMQUOTE
|
|
: cmOutputConverter::SHELL);
|
|
|
|
return this->OutputConverter->ConvertToOutputFormat(input, shellFormat);
|
|
}
|
|
|
|
std::string cmLinkLineComputer::ConvertToOutputForExisting(
|
|
std::string const& input)
|
|
{
|
|
cmOutputConverter::OutputFormat shellFormat = (this->ForResponse)
|
|
? cmOutputConverter::RESPONSE
|
|
: ((this->UseWatcomQuote) ? cmOutputConverter::WATCOMQUOTE
|
|
: cmOutputConverter::SHELL);
|
|
|
|
return this->OutputConverter->ConvertToOutputForExisting(input, shellFormat);
|
|
}
|
|
|
|
std::string cmLinkLineComputer::ComputeLinkPath(
|
|
cmComputeLinkInformation& cli, std::string const& libPathFlag,
|
|
std::string const& libPathTerminator)
|
|
{
|
|
std::string linkPath;
|
|
std::vector<std::string> const& libDirs = cli.GetDirectories();
|
|
for (std::vector<std::string>::const_iterator libDir = libDirs.begin();
|
|
libDir != libDirs.end(); ++libDir) {
|
|
std::string libpath = this->ConvertToOutputForExisting(*libDir);
|
|
linkPath += " " + libPathFlag;
|
|
linkPath += libpath;
|
|
linkPath += libPathTerminator;
|
|
linkPath += " ";
|
|
}
|
|
return linkPath;
|
|
}
|