
Swift is used as the linker for non-swift files because it needs to pull files like swiftrt.o in when swift symbols are present to ensure that the swift runtime is linked. The swift driver uses clang as the underlying linker, which pulls in crtbegin.o and friends when appropriate, so using Swift as a linker for C/C++ libraries is fine. The output-file-map was getting passed to all Swift invocations, regardless of whether or not we generated one. This patch changes it so that we only include the output-file-map in the Swift compiler invocation if we have actually generated the file.
94 lines
3.0 KiB
C++
94 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. */
|
|
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <map>
|
|
#include <string>
|
|
|
|
#include "cmPlaceholderExpander.h"
|
|
|
|
class cmOutputConverter;
|
|
|
|
class cmRulePlaceholderExpander : public cmPlaceholderExpander
|
|
{
|
|
public:
|
|
cmRulePlaceholderExpander(
|
|
std::map<std::string, std::string> compilers,
|
|
std::map<std::string, std::string> variableMappings,
|
|
std::string compilerSysroot, std::string linkerSysroot);
|
|
|
|
void SetTargetImpLib(std::string const& targetImpLib)
|
|
{
|
|
this->TargetImpLib = targetImpLib;
|
|
}
|
|
|
|
// Create a struct to hold the variables passed into
|
|
// ExpandRuleVariables
|
|
struct RuleVariables
|
|
{
|
|
const char* CMTargetName = nullptr;
|
|
const char* CMTargetType = nullptr;
|
|
const char* TargetPDB = nullptr;
|
|
const char* TargetCompilePDB = nullptr;
|
|
const char* TargetVersionMajor = nullptr;
|
|
const char* TargetVersionMinor = nullptr;
|
|
const char* Language = nullptr;
|
|
const char* AIXExports = nullptr;
|
|
const char* Objects = nullptr;
|
|
const char* Target = nullptr;
|
|
const char* LinkLibraries = nullptr;
|
|
const char* Source = nullptr;
|
|
const char* AssemblySource = nullptr;
|
|
const char* PreprocessedSource = nullptr;
|
|
const char* DynDepFile = nullptr;
|
|
const char* Output = nullptr;
|
|
const char* Object = nullptr;
|
|
const char* ObjectDir = nullptr;
|
|
const char* ObjectFileDir = nullptr;
|
|
const char* Flags = nullptr;
|
|
const char* ObjectsQuoted = nullptr;
|
|
const char* SONameFlag = nullptr;
|
|
const char* TargetSOName = nullptr;
|
|
const char* TargetInstallNameDir = nullptr;
|
|
const char* LinkFlags = nullptr;
|
|
const char* Manifests = nullptr;
|
|
const char* LanguageCompileFlags = nullptr;
|
|
const char* Defines = nullptr;
|
|
const char* Includes = nullptr;
|
|
const char* DependencyFile = nullptr;
|
|
const char* DependencyTarget = nullptr;
|
|
const char* FilterPrefix = nullptr;
|
|
const char* SwiftLibraryName = nullptr;
|
|
const char* SwiftModule = nullptr;
|
|
const char* SwiftModuleName = nullptr;
|
|
const char* SwiftOutputFileMapOption = nullptr;
|
|
const char* SwiftSources = nullptr;
|
|
const char* ISPCHeader = nullptr;
|
|
const char* CudaCompileMode = nullptr;
|
|
const char* Fatbinary = nullptr;
|
|
const char* RegisterFile = nullptr;
|
|
const char* Launcher = nullptr;
|
|
};
|
|
|
|
// Expand rule variables in CMake of the type found in language rules
|
|
void ExpandRuleVariables(cmOutputConverter* outputConverter,
|
|
std::string& string,
|
|
const RuleVariables& replaceValues);
|
|
|
|
private:
|
|
std::string ExpandVariable(std::string const& variable) override;
|
|
|
|
std::string TargetImpLib;
|
|
|
|
std::map<std::string, std::string> Compilers;
|
|
std::map<std::string, std::string> VariableMappings;
|
|
std::string CompilerSysroot;
|
|
std::string LinkerSysroot;
|
|
|
|
cmOutputConverter* OutputConverter = nullptr;
|
|
RuleVariables const* ReplaceValues = nullptr;
|
|
};
|