diff --git a/source/dub/compilers/compiler.d b/source/dub/compilers/compiler.d index 09de7e3..142aa6e 100644 --- a/source/dub/compilers/compiler.d +++ b/source/dub/compilers/compiler.d @@ -10,11 +10,14 @@ import dub.compilers.dmd; import dub.compilers.gdc; import dub.compilers.ldc; +import dub.internal.std.process; +import dub.internal.vibecompat.core.log; import dub.internal.vibecompat.data.json; import dub.internal.vibecompat.inet.path; import std.algorithm; import std.array; +import std.conv; import std.exception; @@ -47,8 +50,6 @@ void warnOnSpecialCompilerFlags(string[] compiler_flags, string package_name, string config_name) { - import dub.internal.vibecompat.core.log; - struct SpecialFlag { string[] flags; string alternative; @@ -102,6 +103,32 @@ } +/** + Replaces each referenced import library by the appropriate linker flags. + + This function tries to invoke "pkg-config" if possible and falls back to + direct flag translation if that fails. +*/ +void resolveLibs(ref BuildSettings settings) +{ + try { + logDebug("Trying to use pkg-config to resolve library flags for %s.", settings.libs); + auto libflags = execute(["pkg-config", "--libs"] ~ settings.libs.map!(l => "lib"~l)().array()); + enforce(libflags.status == 0, "pkg-config exited with error code "~to!string(libflags.status)); + foreach (f; libflags.output.split()) { + if (f.startsWith("-Wl,")) settings.addLFlags(f[4 .. $].split(",")); + else settings.addLFlags(f); + } + } catch( Exception e ){ + logDebug("pkg-config failed: %s", e.msg); + logDebug("Falling back to direct -lxyz flags."); + version(Windows) settings.addSourceFiles(settings.libs.map!(l => l~".lib")().array()); + else settings.addLFlags(settings.libs.map!(l => "-l"~l)().array()); + } + settings.libs = null; +} + + interface Compiler { @property string name() const; diff --git a/source/dub/compilers/dmd.d b/source/dub/compilers/dmd.d index fad3269..9e20622 100644 --- a/source/dub/compilers/dmd.d +++ b/source/dub/compilers/dmd.d @@ -47,20 +47,8 @@ void prepareBuildSettings(ref BuildSettings settings, BuildSetting fields = BuildSetting.all) { - if( !(fields & BuildSetting.libs) ){ - try { - logDebug("Trying to use pkg-config to resolve library flags for %s.", settings.libs); - auto libflags = execute(["pkg-config", "--libs"] ~ settings.libs.map!(l => "lib"~l)().array()); - enforce(libflags.status == 0, "pkg-config exited with error code "~to!string(libflags.status)); - settings.addLFlags(libflags.output.split()); - } catch( Exception e ){ - logDebug("pkg-config failed: %s", e.msg); - logDebug("Falling back to direct -lxyz flags."); - version(Windows) settings.addSourceFiles(settings.libs.map!(l => l~".lib")().array()); - else settings.addLFlags(settings.libs.map!(l => "-l"~l)().array()); - } - settings.libs = null; - } + if( !(fields & BuildSetting.libs) ) + resolveLibs(settings); if( !(fields & BuildSetting.versions) ){ settings.addDFlags(settings.versions.map!(s => "-version="~s)().array()); diff --git a/source/dub/compilers/gdc.d b/source/dub/compilers/gdc.d index 56e675e..3aa0878 100644 --- a/source/dub/compilers/gdc.d +++ b/source/dub/compilers/gdc.d @@ -88,19 +88,8 @@ } settings.dflags = newdflags; - if( !(fields & BuildSetting.libs) ){ - try { - logDebug("Trying to use pkg-config to resolve library flags for %s.", settings.libs); - auto libflags = execute(["pkg-config", "--libs"] ~ settings.libs.map!(l => "lib"~l)().array()); - enforce(libflags.status == 0, "pkg-config exited with error code "~to!string(libflags.status)); - settings.addLFlags(libflags.output.split()); - } catch( Exception e ){ - logDebug("pkg-config failed: %s", e.msg); - logDebug("Falling back to direct -lxyz flags."); - settings.addLFlags(settings.libs.map!(l => "-l"~l)().array()); - } - settings.libs = null; - } + if (!(fields & BuildSetting.libs)) + resolveLibs(settings); if( !(fields & BuildSetting.versions) ){ settings.addDFlags(settings.versions.map!(s => "-fversion="~s)().array()); diff --git a/source/dub/compilers/ldc.d b/source/dub/compilers/ldc.d index 83ea5fd..979d639 100644 --- a/source/dub/compilers/ldc.d +++ b/source/dub/compilers/ldc.d @@ -45,19 +45,8 @@ } settings.dflags = newdflags; - if( !(fields & BuildSetting.libs) ){ - try { - logDebug("Trying to use pkg-config to resolve library flags for %s.", settings.libs); - auto libflags = execute(["pkg-config", "--libs"] ~ settings.libs.map!(l => "lib"~l)().array()); - enforce(libflags.status == 0, "pkg-config exited with error code "~to!string(libflags.status)); - settings.addLFlags(libflags.output.split()); - } catch( Exception e ){ - logDebug("pkg-config failed: %s", e.msg); - logDebug("Falling back to direct -lxyz flags."); - settings.addLFlags(settings.libs.map!(l => "-l"~l)().array()); - } - settings.libs = null; - } + if (!(fields & BuildSetting.libs)) + resolveLibs(settings); if( !(fields & BuildSetting.versions) ){ settings.addDFlags(settings.versions.map!(s => "-d-version="~s)().array());