diff --git a/source/dub/compilers/compiler.d b/source/dub/compilers/compiler.d index a714533..75bd325 100644 --- a/source/dub/compilers/compiler.d +++ b/source/dub/compilers/compiler.d @@ -214,9 +214,6 @@ void extractBuildOptions(ref BuildSettings settings) const; /// Adds the appropriate flag to set a target path - /// - /// Params: - /// targetPath: If it's not null, it will be output to the given path. Else, the compiler will decide. void setTarget(ref BuildSettings settings, in BuildPlatform platform, string targetPath = null) const; /// Invokes the compiler using the given flags diff --git a/source/dub/compilers/gdc.d b/source/dub/compilers/gdc.d index ae9f067..d09b9fc 100644 --- a/source/dub/compilers/gdc.d +++ b/source/dub/compilers/gdc.d @@ -189,7 +189,30 @@ void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback) { - assert(false, "Separate linking not implemented for GDC"); + import std.string; + string[] args; + // As the user is supposed to call setTarget prior to invoke, -o target is already set. + if (settings.targetType == TargetType.staticLibrary || settings.targetType == TargetType.staticLibrary) { + auto tpath = extractTarget(settings.dflags); + assert(tpath !is null, "setTarget should be called before invoke"); + args = [ "ar", "rcs", tpath ] ~ objects; + } else { + args = platform.compiler ~ objects ~ settings.sourceFiles ~ settings.lflags ~ settings.dflags.filter!(f => isLinkageFlag(f)).array; + version(linux) args ~= "-L--no-as-needed"; // avoids linker errors due to libraries being speficied in the wrong order by DMD + } + logDiagnostic("%s", args.join(" ")); + invokeTool(args, output_callback); + } +} + +private string extractTarget(const string[] args) { auto i = args.countUntil("-o"); return i >= 0 ? args[i+1] : null; } + +private bool isLinkageFlag(string flag) { + switch (flag) { + case "-c": + return false; + default: + return true; } } diff --git a/source/dub/generators/build.d b/source/dub/generators/build.d index 3e4e107..56a72a6 100644 --- a/source/dub/generators/build.d +++ b/source/dub/generators/build.d @@ -376,10 +376,6 @@ } if (settings.buildMode == BuildMode.singleFile && generate_binary) { auto lbuildsettings = buildsettings; - lbuildsettings.sourceFiles = is_static_library ? [] : lbuildsettings.sourceFiles.filter!(f=> f.isLinkerFile()).array; - settings.compiler.setTarget(lbuildsettings, settings.platform); - settings.compiler.prepareBuildSettings(lbuildsettings, BuildSetting.commandLineSeparate|BuildSetting.sourceFiles); - auto objs = appender!(string[])(); logInfo("Compiling using %s...", settings.platform.compilerBinary); foreach (file; buildsettings.sourceFiles.filter!(f=>!isLinkerFile(f))) { @@ -388,6 +384,9 @@ } logInfo("Linking..."); + lbuildsettings.sourceFiles = is_static_library ? [] : lbuildsettings.sourceFiles.filter!(f=> f.isLinkerFile()).array; + settings.compiler.setTarget(lbuildsettings, settings.platform); + settings.compiler.prepareBuildSettings(lbuildsettings, BuildSetting.commandLineSeparate|BuildSetting.sourceFiles); settings.compiler.invokeLinker(lbuildsettings, settings.platform, objs.data, settings.linkCallback); /*