diff --git a/source/dub/compilers/ldc.d b/source/dub/compilers/ldc.d index 8c80c18..a15f80a 100644 --- a/source/dub/compilers/ldc.d +++ b/source/dub/compilers/ldc.d @@ -140,18 +140,8 @@ string getTargetFileName(in BuildSettings settings, in BuildPlatform platform) const { - import std.string : splitLines, strip; - import std.uni : toLower; - assert(settings.targetName.length > 0, "No target name set."); - auto result = executeShell(escapeShellCommand([platform.compilerBinary, "-version"])); - enforce (result.status == 0, "Failed to determine linker used by LDC. \"" - ~platform.compilerBinary~" -version\" failed with exit code " - ~result.status.to!string()~"."); - - bool generates_coff = result.output.splitLines.find!(l => l.strip.toLower.startsWith("default target:")).front.canFind("msvc"); - final switch (settings.targetType) { case TargetType.autodetect: assert(false, "Configurations must have a concrete target type."); case TargetType.none: return null; @@ -162,7 +152,7 @@ else return settings.targetName; case TargetType.library: case TargetType.staticLibrary: - if (generates_coff) return settings.targetName ~ ".lib"; + if (generatesCOFF(platform)) return settings.targetName ~ ".lib"; else return "lib" ~ settings.targetName ~ ".a"; case TargetType.dynamicLibrary: if (platform.platform.canFind("windows")) @@ -224,4 +214,29 @@ { return args.map!(s => s.canFind(' ') ? "\""~s~"\"" : s); } + + private static bool generatesCOFF(in BuildPlatform platform) + { + import std.string : splitLines, strip; + import std.uni : toLower; + + static bool[string] compiler_coff_map; + + if (auto pret = platform.compilerBinary in compiler_coff_map) + return *pret; + + auto result = executeShell(escapeShellCommand([platform.compilerBinary, "-version"])); + enforce (result.status == 0, "Failed to determine linker used by LDC. \"" + ~platform.compilerBinary~" -version\" failed with exit code " + ~result.status.to!string()~"."); + + bool ret = result.output + .splitLines + .find!(l => l.strip.toLower.startsWith("default target:")) + .front + .canFind("msvc"); + + compiler_coff_map[platform.compilerBinary] = ret; + return ret; + } }