diff --git a/source/dub/compilers/compiler.d b/source/dub/compilers/compiler.d index 9c6bcbc..bb34cde 100644 --- a/source/dub/compilers/compiler.d +++ b/source/dub/compilers/compiler.d @@ -205,13 +205,22 @@ pkgconfig_libs ~= settings.libs[0 .. $ - pkgconfig_libs.length] .partition!(l => !exists("lib"~l)).map!(l => "lib"~l).array; settings.libs = settings.libs[0 .. $ - pkgconfig_libs.length]; - if (pkgconfig_libs.length) { logDiagnostic("Using pkg-config to resolve library flags for %s.", pkgconfig_libs.join(", ")); auto libflags = execute([pkgconfig_bin, "--libs"] ~ pkgconfig_libs); enforce(libflags.status == 0, format("pkg-config exited with error code %s: %s", libflags.status, libflags.output)); foreach (f; libflags.output.split()) { - if (f.startsWith("-Wl,")) settings.addLFlags(f[4 .. $].split(",")); + if (f.startsWith("-L-L")) { + settings.addLFlags(f[2 .. $]); + } else if (f.startsWith("-defaultlib")) { + settings.addDFlags(f); + } else if (f.startsWith("-L-defaultlib")) { + settings.addDFlags(f[2 .. $]); + } else if (f.startsWith("-pthread")) { + settings.addLFlags("-lpthread"); + } else if (f.startsWith("-L-l")) { + settings.addLFlags(f[2 .. $].split(",")); + } else if (f.startsWith("-Wl,")) settings.addLFlags(f[4 .. $].split(",")); else settings.addLFlags(f); } } diff --git a/test/issue782-gtkd-pkg-config.sh b/test/issue782-gtkd-pkg-config.sh new file mode 100755 index 0000000..434ca02 --- /dev/null +++ b/test/issue782-gtkd-pkg-config.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +if [ "${DC}" != "dmd" ]; then + echo "Skipping issue782-dtkd-pkg-config test for ${DC}..." +else + echo ${CURR_DIR-$(pwd)} + # the ${CURR_DIR-$(pwd)} allows running issue782-gtkd-pkg-config.sh stand-alone from the test directory + cd ${CURR_DIR-$(pwd)}/issue782-gtkd-pkg-config + rm -rf fake-gtkd/.dub + rm fake-gtkd/libfake-gtkd.so + rm -rf main/.dub + rm main/fake-gtkd-test + echo ${DUB} + cd fake-gtkd && ${DUB} build -v --compiler=${DC} || exit 1 + cd ../main + + # `run` needs to find the fake-gtkd shared library, so set LD_LIBRARY_PATH to where it is + # pkg-config needs to find our .pc file which is in $(pwd)/../fake-gtkd/pkgconfig, so set PKG_CONFIG_PATH accordingly + LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$(pwd)/../fake-gtkd PKG_CONFIG_PATH=$(pwd)/../fake-gtkd/pkgconfig ${DUB} -v run --force --compiler=${DC} || exit 1 + cd .. + rm -rf fake-gtkd/.dub + rm fake-gtkd/libfake-gtkd.so + rm -rf main/.dub + rm main/fake-gtkd-test +fi diff --git a/test/issue782-gtkd-pkg-config.sh.min_frontend b/test/issue782-gtkd-pkg-config.sh.min_frontend new file mode 100644 index 0000000..a7ad183 --- /dev/null +++ b/test/issue782-gtkd-pkg-config.sh.min_frontend @@ -0,0 +1 @@ +2.068 \ No newline at end of file diff --git a/test/issue782-gtkd-pkg-config/.no_build b/test/issue782-gtkd-pkg-config/.no_build new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue782-gtkd-pkg-config/.no_build diff --git a/test/issue782-gtkd-pkg-config/.no_run b/test/issue782-gtkd-pkg-config/.no_run new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue782-gtkd-pkg-config/.no_run diff --git a/test/issue782-gtkd-pkg-config/.no_test b/test/issue782-gtkd-pkg-config/.no_test new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue782-gtkd-pkg-config/.no_test diff --git a/test/issue782-gtkd-pkg-config/fake-gtkd/dub.json b/test/issue782-gtkd-pkg-config/fake-gtkd/dub.json new file mode 100644 index 0000000..d2c4bcb --- /dev/null +++ b/test/issue782-gtkd-pkg-config/fake-gtkd/dub.json @@ -0,0 +1,5 @@ +{ + "name" : "fake-gtkd", + "targetType": "dynamicLibrary", + "description" : "Fake GtkD shared library for testing", +} diff --git a/test/issue782-gtkd-pkg-config/fake-gtkd/pkgconfig/fake-gtkd.pc b/test/issue782-gtkd-pkg-config/fake-gtkd/pkgconfig/fake-gtkd.pc new file mode 100644 index 0000000..1f06032 --- /dev/null +++ b/test/issue782-gtkd-pkg-config/fake-gtkd/pkgconfig/fake-gtkd.pc @@ -0,0 +1,12 @@ +prefix=../fake-gtkd +libdir=${prefix} +includedir=${prefix}/src + +Name: fake-gtkd +Description: Fake GtkD shared library for testing +Version: 1.0.0 +#Requires: phobos2 +# The "-L-defaultlib=libphobos2.so" and "-defaultlib=libphobos2.so" should both end up on the compiler (at link stage) invokation as "-defaultlib=libphobos2.so" +# For this test, it doesn't hurt that they appear twice on the cmd line... +Libs: -L-L${libdir} -L-l:libfake-gtkd.so -L-l:libdl.so.2 -pthread -L-defaultlib=libphobos2.so -defaultlib=libphobos2.so +Cflags: -I${includedir} diff --git a/test/issue782-gtkd-pkg-config/fake-gtkd/src/fakegtkd.d b/test/issue782-gtkd-pkg-config/fake-gtkd/src/fakegtkd.d new file mode 100644 index 0000000..0990da6 --- /dev/null +++ b/test/issue782-gtkd-pkg-config/fake-gtkd/src/fakegtkd.d @@ -0,0 +1,3 @@ +extern (C) string test_function() { + return "Fake GtkD shared library"; +} \ No newline at end of file diff --git a/test/issue782-gtkd-pkg-config/fake-gtkd/src/lib.d b/test/issue782-gtkd-pkg-config/fake-gtkd/src/lib.d new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue782-gtkd-pkg-config/fake-gtkd/src/lib.d diff --git a/test/issue782-gtkd-pkg-config/main/dub.json b/test/issue782-gtkd-pkg-config/main/dub.json new file mode 100644 index 0000000..e45cbf1 --- /dev/null +++ b/test/issue782-gtkd-pkg-config/main/dub.json @@ -0,0 +1,6 @@ +{ + "name" : "fake-gtkd-test", + "description" : "Small test executable calling a Fake GtkD shared library function for testing", + "importPaths" : ["../fake-gtkd/src"], + "libs" : ["fake-gtkd"] +} diff --git a/test/issue782-gtkd-pkg-config/main/src/app.d b/test/issue782-gtkd-pkg-config/main/src/app.d new file mode 100644 index 0000000..08adda8 --- /dev/null +++ b/test/issue782-gtkd-pkg-config/main/src/app.d @@ -0,0 +1,7 @@ +import std.stdio; +import fakegtkd; + +int main() { + writeln(test_function()); + return 0; +} \ No newline at end of file