[pkg-d-commits] [ldc] 39/211: Windows: Support .res and .def files in command-line
Matthias Klumpp
mak at moszumanska.debian.org
Sun Apr 23 22:36:07 UTC 2017
This is an automated email from the git hooks/post-receive script.
mak pushed a commit to annotated tag v1.1.0
in repository ldc.
commit 8f2665d7bb88e02d2f6fd722862f2aef5b860a4d
Author: Martin <noone at nowhere.com>
Date: Thu Sep 22 11:38:34 2016 +0200
Windows: Support .res and .def files in command-line
---
ddmd/mars.d | 2 +-
driver/linker.cpp | 46 +++++++++++++++++++++++++++-------------------
driver/main.cpp | 2 +-
3 files changed, 29 insertions(+), 21 deletions(-)
diff --git a/ddmd/mars.d b/ddmd/mars.d
index 9b0e747..ee8ff12 100644
--- a/ddmd/mars.d
+++ b/ddmd/mars.d
@@ -1296,7 +1296,7 @@ extern (C++) int mars_mainBody(ref Strings files, ref Strings libmodules)
global.params.mapfile = files[i];
continue;
}
- static if (TARGET_WINDOS)
+ if (global.params.isWindows)
{
if (FileName.equals(ext, "res"))
{
diff --git a/driver/linker.cpp b/driver/linker.cpp
index 14e6f30..0a0479d 100644
--- a/driver/linker.cpp
+++ b/driver/linker.cpp
@@ -67,7 +67,7 @@ static std::string getOutputName(bool const sharedLib) {
const char *extension = nullptr;
if (sharedLib) {
extension = global.dll_ext;
- if (!global.params.mscoff)
+ if (!global.params.targetTriple->isWindowsMSVCEnvironment())
result = "lib" + result;
} else if (global.params.targetTriple->isOSWindows()) {
extension = "exe";
@@ -137,6 +137,20 @@ void insertBitcodeFiles(llvm::Module &M, llvm::LLVMContext &Ctx,
//////////////////////////////////////////////////////////////////////////////
+static void appendObjectFiles(std::vector<std::string> &args) {
+ for (unsigned i = 0; i < global.params.objfiles->dim; i++)
+ args.push_back((*global.params.objfiles)[i]);
+
+ if (global.params.targetTriple->isWindowsMSVCEnvironment()) {
+ if (global.params.resfile)
+ args.push_back(global.params.resfile);
+ if (global.params.deffile)
+ args.push_back(std::string("/DEF:") + global.params.deffile);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
static std::string gExePath;
static int linkObjToBinaryGcc(bool sharedLib, bool fullyStatic) {
@@ -148,9 +162,7 @@ static int linkObjToBinaryGcc(bool sharedLib, bool fullyStatic) {
// build arguments
std::vector<std::string> args;
- // object files
- for (unsigned i = 0; i < global.params.objfiles->dim; i++)
- args.push_back((*global.params.objfiles)[i]);
+ appendObjectFiles(args);
// Link with profile-rt library when generating an instrumented binary.
// profile-rt uses Phobos (MD5 hashing) and therefore must be passed on the
@@ -541,7 +553,7 @@ int executeMsvcToolAndWait(const std::string &,
//////////////////////////////////////////////////////////////////////////////
-static int linkObjToBinaryWin(bool sharedLib) {
+static int linkObjToBinaryMSVC(bool sharedLib) {
Logger::println("*** Linking executable ***");
std::string tool = "link.exe";
@@ -592,9 +604,7 @@ static int linkObjToBinaryWin(bool sharedLib) {
args.push_back("/OUT:" + output);
- // object files
- for (unsigned i = 0; i < global.params.objfiles->dim; i++)
- args.push_back((*global.params.objfiles)[i]);
+ appendObjectFiles(args);
// Link with profile-rt library when generating an instrumented binary
// profile-rt depends on Phobos (MD5 hashing).
@@ -661,7 +671,7 @@ static int linkObjToBinaryWin(bool sharedLib) {
int linkObjToBinary() {
if (global.params.targetTriple->isWindowsMSVCEnvironment()) {
// TODO: Choose dynamic/static MSVCRT version based on staticFlag?
- return linkObjToBinaryWin(global.params.dll);
+ return linkObjToBinaryMSVC(global.params.dll);
}
return linkObjToBinaryGcc(global.params.dll, staticFlag);
@@ -672,27 +682,27 @@ int linkObjToBinary() {
int createStaticLibrary() {
Logger::println("*** Creating static library ***");
- const bool isTargetWindows =
+ const bool isTargetMSVC =
global.params.targetTriple->isWindowsMSVCEnvironment();
// find archiver
- std::string tool(isTargetWindows ? "lib.exe" : getArchiver());
+ std::string tool(isTargetMSVC ? "lib.exe" : getArchiver());
// build arguments
std::vector<std::string> args;
// ask ar to create a new library
- if (!isTargetWindows) {
+ if (!isTargetMSVC) {
args.push_back("rcs");
}
// ask lib to be quiet
- if (isTargetWindows) {
+ if (isTargetMSVC) {
args.push_back("/NOLOGO");
}
// enable Link-time Code Generation (aka. whole program optimization)
- if (isTargetWindows && global.params.optimize) {
+ if (isTargetMSVC && global.params.optimize) {
args.push_back("/LTCG");
}
@@ -710,22 +720,20 @@ int createStaticLibrary() {
if (global.params.objdir && !FileName::absolute(libName.c_str()))
libName = FileName::combine(global.params.objdir, libName.c_str());
- if (isTargetWindows) {
+ if (isTargetMSVC) {
args.push_back("/OUT:" + libName);
} else {
args.push_back(libName);
}
- // object files
- for (unsigned i = 0; i < global.params.objfiles->dim; i++)
- args.push_back((*global.params.objfiles)[i]);
+ appendObjectFiles(args);
// create path to the library
CreateDirectoryOnDisk(libName);
// try to call archiver
int exitCode;
- if (isTargetWindows) {
+ if (isTargetMSVC) {
exitCode = executeMsvcToolAndWait(tool, args, global.params.verbose);
} else {
exitCode = executeToolAndWait(tool, args, global.params.verbose);
diff --git a/driver/main.cpp b/driver/main.cpp
index 595f8e5..6097e12 100644
--- a/driver/main.cpp
+++ b/driver/main.cpp
@@ -863,7 +863,7 @@ void registerPredefinedTargetVersions() {
VersionCondition::addPredefinedGlobalIdent("Windows");
VersionCondition::addPredefinedGlobalIdent(global.params.is64bit ? "Win64"
: "Win32");
- if (global.params.targetTriple->isKnownWindowsMSVCEnvironment()) {
+ if (global.params.targetTriple->isWindowsMSVCEnvironment()) {
VersionCondition::addPredefinedGlobalIdent("CRuntime_Microsoft");
}
if (global.params.targetTriple->isWindowsGNUEnvironment()) {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-d/ldc.git
More information about the pkg-d-commits
mailing list