CUDA: Add LinkLineComputer that computes cuda dlink lines.

This commit is contained in:
Robert Maynard
2016-10-13 09:08:44 -04:00
committed by Brad King
parent 115269a86c
commit ae05fcc63f
4 changed files with 113 additions and 0 deletions

View File

@@ -298,6 +298,8 @@ set(SRCS
cmLinkItem.h
cmLinkLineComputer.cxx
cmLinkLineComputer.h
cmLinkLineDeviceComputer.cxx
cmLinkLineDeviceComputer.h
cmListFileCache.cxx
cmListFileCache.h
cmListFileLexer.c

View File

@@ -70,6 +70,7 @@ public:
std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; }
std::string GetRPathLinkString();
std::string GetConfig() const { return this->Config; }
private:
void AddItem(std::string const& item, const cmGeneratorTarget* tgt);
void AddSharedDepItem(std::string const& item, cmGeneratorTarget const* tgt);

View File

@@ -0,0 +1,74 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmLinkLineDeviceComputer.h"
#include "cmComputeLinkInformation.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalNinjaGenerator.h"
#include "cmOutputConverter.h"
cmLinkLineDeviceComputer::cmLinkLineDeviceComputer(
cmOutputConverter* outputConverter, cmStateDirectory stateDir)
: cmLinkLineComputer(outputConverter, stateDir)
{
}
cmLinkLineDeviceComputer::~cmLinkLineDeviceComputer()
{
}
std::string cmLinkLineDeviceComputer::ComputeLinkLibraries(
cmComputeLinkInformation& cli, std::string const& stdLibString)
{
// Write the library flags to the build rule.
std::ostringstream fout;
typedef cmComputeLinkInformation::ItemVector ItemVector;
ItemVector const& items = cli.GetItems();
std::string config = cli.GetConfig();
for (ItemVector::const_iterator li = items.begin(); li != items.end();
++li) {
if (!li->Target) {
continue;
}
if (li->Target->GetType() == cmStateEnums::INTERFACE_LIBRARY ||
li->Target->GetType() == cmStateEnums::SHARED_LIBRARY ||
li->Target->GetType() == cmStateEnums::MODULE_LIBRARY) {
continue;
}
std::set<std::string> langs;
li->Target->GetLanguages(langs, config);
if (langs.count("CUDA") == 0) {
continue;
}
if (li->IsPath) {
fout << this->ConvertToOutputFormat(
this->ConvertToLinkReference(li->Value));
} else {
fout << li->Value;
}
fout << " ";
}
if (!stdLibString.empty()) {
fout << stdLibString << " ";
}
return fout.str();
}
cmNinjaLinkLineDeviceComputer::cmNinjaLinkLineDeviceComputer(
cmOutputConverter* outputConverter, cmStateDirectory stateDir,
cmGlobalNinjaGenerator const* gg)
: cmLinkLineDeviceComputer(outputConverter, stateDir)
, GG(gg)
{
}
std::string cmNinjaLinkLineDeviceComputer::ConvertToLinkReference(
std::string const& lib) const
{
return GG->ConvertToNinjaPath(lib);
}

View File

@@ -0,0 +1,36 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#ifndef cmLinkLineDeviceComputer_h
#define cmLinkLineDeviceComputer_h
#include "cmLinkLineComputer.h"
class cmGlobalNinjaGenerator;
class cmLinkLineDeviceComputer : public cmLinkLineComputer
{
public:
cmLinkLineDeviceComputer(cmOutputConverter* outputConverter,
cmStateDirectory stateDir);
~cmLinkLineDeviceComputer() CM_OVERRIDE;
std::string ComputeLinkLibraries(cmComputeLinkInformation& cli,
std::string const& stdLibString)
CM_OVERRIDE;
};
class cmNinjaLinkLineDeviceComputer : public cmLinkLineDeviceComputer
{
public:
cmNinjaLinkLineDeviceComputer(cmOutputConverter* outputConverter,
cmStateDirectory stateDir,
cmGlobalNinjaGenerator const* gg);
std::string ConvertToLinkReference(std::string const& input) const
CM_OVERRIDE;
private:
cmGlobalNinjaGenerator const* GG;
};
#endif