Skip to content

Commit d4dda12

Browse files
committed
Fixed: Archiver now putting object files correctly
1 parent ce2fff1 commit d4dda12

File tree

6 files changed

+35
-27
lines changed

6 files changed

+35
-27
lines changed

source/redub/building/compile.d

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,13 @@ CompilationResult execCompilation(immutable ThreadBuildData data, shared Project
126126
if(!pack.isCopyEnough)
127127
ret = cast(ExecutionResult)execCompiler(cfg, compiler.binOrPath, getCompilationFlags(cfg, info, hash.rootHash, data.extra.isRoot), res.compilationCommand, compiler, inDir);
128128

129-
if(!isDCompiler(compiler) && !ret.status) //Always requires link.
129+
if(!isDCompiler(compiler) && !ret.status && isStaticLibrary(data.cfg.targetType)) //Must call archiver when
130130
{
131131
string cmd ;
132132
auto archiverRes = executeArchiver(data, info, cmd);
133133
ret.status = archiverRes.status;
134134
ret.output~= archiverRes.output;
135-
res.compilationCommand~= cmd;
135+
res.compilationCommand~= "\n\nArchiving: \n\t"~cmd;
136136
}
137137

138138
copyDir(inDir, dirName(outDir));

source/redub/building/utils.d

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ auto linkBase(const ThreadBuildData data, CompilingSession session, string rootH
6060
);
6161
}
6262

63+
/**
64+
* Generates a static library using archiver. FIXME: BuildRequirements should know its files.
65+
* Params:
66+
* data = The data containing project information
67+
* s = Compiling Session
68+
* command = Command for being able to print it later
69+
*/
6370
auto executeArchiver(const ThreadBuildData data, CompilingSession s, out string command)
6471
{
6572
import std.process;
@@ -72,17 +79,25 @@ auto executeArchiver(const ThreadBuildData data, CompilingSession s, out string
7279
string[] cmd = [a.bin];
7380
final switch(a.type) with(AcceptedArchiver)
7481
{
75-
case ar, llvmAr: cmd~= "rcs"; break;
82+
case ar, llvmAr: cmd~= ["rcs"]; break;
7683
case libtool: cmd~= ["-static", "-o"]; break;
7784
case none: break;
7885
}
7986

80-
cmd~= getOutputName(data.cfg, s.os, s.isa);
81-
82-
string objExt = getObjectExtension(s.os);
83-
cmd = mapAppend(cmd, data.cfg.sourceFiles, (string src) => stripExtension(src)~ objExt);
87+
cmd~= buildNormalizedPath(data.cfg.outputDirectory, getOutputName(data.cfg, s.os, s.isa));
8488

89+
putObjectFiles(cmd, data.cfg, s.os, s.compiler.compiler.gcc ? cExt : cppExt);
8590
command = cmd.join(" ");
8691

8792
return executeShell(command);
93+
}
94+
95+
private void putObjectFiles(ref string[] target, const BuildConfiguration b, OS os, scope const string[] extensions...)
96+
{
97+
import redub.command_generators.commons;
98+
import std.file;
99+
import std.path;
100+
string[] objectFiles;
101+
putSourceFiles(objectFiles, b.workingDir, b.sourcePaths, b.sourceFiles, b.excludeSourceFiles, extensions);
102+
target = mapAppend(target, objectFiles, (string src) => setExtension(src, getObjectExtension(os)));
88103
}

source/redub/command_generators/automatic.d

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ string escapeCompilationCommands(string compilerBin, string[] flags)
2323
*/
2424
string[] getCompilationFlags(const BuildConfiguration cfg, CompilingSession s, string mainPackHash, bool isRoot)
2525
{
26+
import redub.command_generators.commons;
2627
switch(s.compiler.compiler) with(AcceptedCompiler)
2728
{
2829
case gxx:
29-
return redub.command_generators.gnu_based.parseBuildConfiguration(cfg, s, mainPackHash, isRoot, ".c", ".cpp", ".cc", ".i", ".cxx", ".c++");
30+
return redub.command_generators.gnu_based.parseBuildConfiguration(cfg, s, mainPackHash, isRoot, cppExt);
3031
case gcc:
31-
return redub.command_generators.gnu_based.parseBuildConfiguration(cfg, s, mainPackHash, isRoot, ".c", ".i");
32+
return redub.command_generators.gnu_based.parseBuildConfiguration(cfg, s, mainPackHash, isRoot, cExt);
3233
case dmd:
3334
return redub.command_generators.dmd.parseBuildConfiguration(cfg, s, mainPackHash, isRoot);
3435
case ldc2:

source/redub/command_generators/commons.d

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ public import redub.compiler_identification;
77
import redub.buildapi;
88
public import std.file:DirEntry;
99

10+
///Valid d extensions
11+
immutable string[] dExt = [".d"];
12+
///Valid c extensions
13+
immutable string[] cExt = [".c", ".i"];
14+
///Valid c++ extensions
15+
immutable string[] cppExt = [".c", ".cpp", ".cc", ".i", ".cxx", ".c++"];
16+
1017

1118
OS osFromArch(string arch)
1219
{

source/redub/command_generators/gnu_based.d

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ public import redub.buildapi;
44
public import std.system;
55
import redub.command_generators.commons;
66
import redub.logging;
7+
import redub.building.cache;
78

89
/// Parse G++ configuration
910
string[] parseBuildConfiguration(const BuildConfiguration b, CompilingSession s, string requirementCache, bool isRoot, const string[] extensions...)
@@ -29,10 +30,9 @@ string[] parseBuildConfiguration(const BuildConfiguration b, CompilingSession s,
2930
if(targetType.isLinkedSeparately)
3031
{
3132
commands~= "-o";
32-
commands ~= buildNormalizedPath(outputDirectory, getOutputName(targetType, name, os));
33+
string cacheDir = getCacheOutputDir(requirementCache, b, s, isRoot);
34+
commands ~= getObjectDir(cacheDir).escapePath;
3335
}
34-
35-
3636
}
3737

3838
return commands;

source/redub/command_generators/linkers.d

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,6 @@ string[] parseLinkConfiguration(const ThreadBuildData data, CompilingSession s,
5757
commands = mapAppend(commands, libraries, (string l) => "-L-l"~stripLibraryExtension(l));
5858

5959
}
60-
else if(!s.compiler.isDCompiler) //Generates a static library using archiver. FIXME: BuildRequirements should know its files.
61-
{
62-
commands~= "--format=default";
63-
commands~= "rcs";
64-
commands~= buildNormalizedPath(outputDirectory, getOutputName(b, s.os));
65-
putObjectFiles(commands, b, s.os, ".c", ".cpp", ".cc", ".i", ".cxx", ".c++");
66-
}
6760
}
6861

6962
return commands;
@@ -133,11 +126,3 @@ string getTargetTypeFlag(TargetType o, Compiler compiler)
133126
}
134127

135128

136-
private void putObjectFiles(ref string[] target, const BuildConfiguration b, OS os, scope const string[] extensions...)
137-
{
138-
import std.file;
139-
import std.path;
140-
string[] objectFiles;
141-
putSourceFiles(objectFiles, b.workingDir, b.sourcePaths, b.sourceFiles, b.excludeSourceFiles, extensions);
142-
target = mapAppend(target, objectFiles, (string src) => setExtension(src, getObjectExtension(os)));
143-
}

0 commit comments

Comments
 (0)