diff --git a/source/dub/compilers/dmd.d b/source/dub/compilers/dmd.d index 78fd9d4b5..1bf3259ac 100644 --- a/source/dub/compilers/dmd.d +++ b/source/dub/compilers/dmd.d @@ -305,7 +305,13 @@ config /etc/dmd.conf string getTargetFileName(in BuildSettings settings, in BuildPlatform platform) const { import std.conv: text; - assert(settings.targetName.length > 0, "No target name set."); + + string targetName() + { + assert(settings.targetName.length > 0, "No target name set."); + return settings.targetName.idup; + } + final switch (settings.targetType) { case TargetType.autodetect: assert(false, @@ -315,23 +321,23 @@ config /etc/dmd.conf case TargetType.sourceLibrary: return null; case TargetType.executable: if (platform.isWindows()) - return settings.targetName ~ ".exe"; - else return settings.targetName.idup; + return targetName ~ ".exe"; + else return targetName; case TargetType.library: case TargetType.staticLibrary: if (platform.isWindows()) - return settings.targetName ~ ".lib"; - else return "lib" ~ settings.targetName ~ ".a"; + return targetName ~ ".lib"; + else return "lib" ~ targetName ~ ".a"; case TargetType.dynamicLibrary: if (platform.isWindows()) - return settings.targetName ~ ".dll"; + return targetName ~ ".dll"; else if (platform.platform.canFind("darwin")) - return "lib" ~ settings.targetName ~ ".dylib"; - else return "lib" ~ settings.targetName ~ ".so"; + return "lib" ~ targetName ~ ".dylib"; + else return "lib" ~ targetName ~ ".so"; case TargetType.object: if (platform.isWindows()) - return settings.targetName ~ ".obj"; - else return settings.targetName ~ ".o"; + return targetName ~ ".obj"; + else return targetName ~ ".o"; } } diff --git a/source/dub/compilers/gdc.d b/source/dub/compilers/gdc.d index 0d34446ec..733b81291 100644 --- a/source/dub/compilers/gdc.d +++ b/source/dub/compilers/gdc.d @@ -160,28 +160,38 @@ class GDCCompiler : Compiler { string getTargetFileName(in BuildSettings settings, in BuildPlatform platform) const { - assert(settings.targetName.length > 0, "No target name set."); + import std.conv: text; + + string targetName() + { + assert(settings.targetName.length > 0, "No target name set."); + return settings.targetName.idup; + } + final switch (settings.targetType) { - case TargetType.autodetect: assert(false, "Configurations must have a concrete target type."); + case TargetType.autodetect: + assert(false, + text("Configurations must have a concrete target type, ", settings.targetName, + " has ", settings.targetType)); case TargetType.none: return null; case TargetType.sourceLibrary: return null; case TargetType.executable: if (platform.isWindows()) - return settings.targetName ~ ".exe"; - else return settings.targetName.idup; + return targetName ~ ".exe"; + else return targetName; case TargetType.library: case TargetType.staticLibrary: - return "lib" ~ settings.targetName ~ ".a"; + return "lib" ~ targetName ~ ".a"; case TargetType.dynamicLibrary: if (platform.isWindows()) - return settings.targetName ~ ".dll"; + return targetName ~ ".dll"; else if (platform.platform.canFind("darwin")) - return "lib" ~ settings.targetName ~ ".dylib"; - else return "lib" ~ settings.targetName ~ ".so"; + return "lib" ~ targetName ~ ".dylib"; + else return "lib" ~ targetName ~ ".so"; case TargetType.object: if (platform.isWindows()) - return settings.targetName ~ ".obj"; - else return settings.targetName ~ ".o"; + return targetName ~ ".obj"; + else return targetName ~ ".o"; } } diff --git a/source/dub/compilers/ldc.d b/source/dub/compilers/ldc.d index 3cb90e5b2..9f8ffc6d6 100644 --- a/source/dub/compilers/ldc.d +++ b/source/dub/compilers/ldc.d @@ -192,34 +192,43 @@ config /etc/ldc2.conf (x86_64-pc-linux-gnu) string getTargetFileName(in BuildSettings settings, in BuildPlatform platform) const { - assert(settings.targetName.length > 0, "No target name set."); + import std.conv: text; + + string targetName() + { + assert(settings.targetName.length > 0, "No target name set."); + return settings.targetName.idup; + } const p = platform.platform; final switch (settings.targetType) { - case TargetType.autodetect: assert(false, "Configurations must have a concrete target type."); + case TargetType.autodetect: + assert(false, + text("Configurations must have a concrete target type, ", settings.targetName, + " has ", settings.targetType)); case TargetType.none: return null; case TargetType.sourceLibrary: return null; case TargetType.executable: if (p.canFind("windows")) - return settings.targetName ~ ".exe"; + return targetName ~ ".exe"; else if (p.canFind("wasm")) - return settings.targetName ~ ".wasm"; - else return settings.targetName.idup; + return targetName ~ ".wasm"; + else return targetName; case TargetType.library: case TargetType.staticLibrary: if (p.canFind("windows") && !p.canFind("mingw")) - return settings.targetName ~ ".lib"; - else return "lib" ~ settings.targetName ~ ".a"; + return targetName ~ ".lib"; + else return "lib" ~ targetName ~ ".a"; case TargetType.dynamicLibrary: if (p.canFind("windows")) - return settings.targetName ~ ".dll"; + return targetName ~ ".dll"; else if (p.canFind("darwin")) - return "lib" ~ settings.targetName ~ ".dylib"; - else return "lib" ~ settings.targetName ~ ".so"; + return "lib" ~ targetName ~ ".dylib"; + else return "lib" ~ targetName ~ ".so"; case TargetType.object: if (p.canFind("windows")) - return settings.targetName ~ ".obj"; - else return settings.targetName ~ ".o"; + return targetName ~ ".obj"; + else return targetName ~ ".o"; } } diff --git a/source/dub/generators/build.d b/source/dub/generators/build.d index 8583eab84..be5cb86c6 100644 --- a/source/dub/generators/build.d +++ b/source/dub/generators/build.d @@ -708,7 +708,11 @@ private NativePath getMainSourceFile(in Package prj) private NativePath getTargetPath(const scope ref BuildSettings bs, const scope ref GeneratorSettings settings) { - return NativePath(bs.targetPath) ~ settings.compiler.getTargetFileName(bs, settings.platform); + auto targetFileName = settings.compiler.getTargetFileName(bs, settings.platform); + + if (!targetFileName.length) + return NativePath.init; + return NativePath(bs.targetPath) ~ targetFileName; } private string shrinkPath(NativePath path, NativePath base) diff --git a/test/issue2618-targetType-none-run.sh b/test/issue2618-targetType-none-run.sh new file mode 100755 index 000000000..88a6569d6 --- /dev/null +++ b/test/issue2618-targetType-none-run.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +. $(dirname "${BASH_SOURCE[0]}")/common.sh + +cd "${CURR_DIR}/issue2618-targetType-none-run" + +set +o pipefail + +$DUB run --config dependencies --force 2>&1 | grep -c -F "Target is a library. Skipping execution." diff --git a/test/issue2618-targetType-none-run/.no_build b/test/issue2618-targetType-none-run/.no_build new file mode 100644 index 000000000..e69de29bb diff --git a/test/issue2618-targetType-none-run/.no_run b/test/issue2618-targetType-none-run/.no_run new file mode 100644 index 000000000..e69de29bb diff --git a/test/issue2618-targetType-none-run/.no_test b/test/issue2618-targetType-none-run/.no_test new file mode 100644 index 000000000..e69de29bb diff --git a/test/issue2618-targetType-none-run/b/.gitignore b/test/issue2618-targetType-none-run/b/.gitignore new file mode 100644 index 000000000..a0023fa14 --- /dev/null +++ b/test/issue2618-targetType-none-run/b/.gitignore @@ -0,0 +1,16 @@ +.dub +docs.json +__dummy.html +docs/ +/projb +projb.so +projb.dylib +projb.dll +projb.a +projb.lib +projb-test-* +*.exe +*.pdb +*.o +*.obj +*.lst diff --git a/test/issue2618-targetType-none-run/b/dub.json b/test/issue2618-targetType-none-run/b/dub.json new file mode 100644 index 000000000..2824d7298 --- /dev/null +++ b/test/issue2618-targetType-none-run/b/dub.json @@ -0,0 +1,3 @@ +{ + "name": "b" +} \ No newline at end of file diff --git a/test/issue2618-targetType-none-run/b/source/projb.d b/test/issue2618-targetType-none-run/b/source/projb.d new file mode 100644 index 000000000..b4d5ab0ae --- /dev/null +++ b/test/issue2618-targetType-none-run/b/source/projb.d @@ -0,0 +1,8 @@ +module projb; +import std.stdio; + +int getDependency() +{ + writeln("Edit source/app.d to start your project."); + return 10; +} diff --git a/test/issue2618-targetType-none-run/dub.json b/test/issue2618-targetType-none-run/dub.json new file mode 100644 index 000000000..043f853ac --- /dev/null +++ b/test/issue2618-targetType-none-run/dub.json @@ -0,0 +1,16 @@ +{ + "dependencies": { + "b": {"path": "b"} + }, + "configurations": [ + { + "name": "main", + "targetType": "staticLibrary" + }, + { + "name": "dependencies", + "targetType":"none" + } + ], + "name": "issue2618" +} diff --git a/test/issue2618-targetType-none-run/source/app.d b/test/issue2618-targetType-none-run/source/app.d new file mode 100644 index 000000000..c3eec7f2d --- /dev/null +++ b/test/issue2618-targetType-none-run/source/app.d @@ -0,0 +1,6 @@ +import std.stdio; + +void main() +{ + writeln("Edit source/app.d to start your project."); +}