diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index dfb0670..8c2535a 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -89,18 +89,20 @@ if (!settings.config.length) settings.config = m_project.getDefaultConfiguration(settings.platform); - TargetInfo[string] targets; string[string] configs = m_project.getPackageConfigs(settings.platform, settings.config); + TargetInfo[string] targets; foreach (pack; m_project.getTopologicalPackageList(true, null, configs)) { - BuildSettings buildsettings; - buildsettings.processVars(m_project, pack, pack.getBuildSettings(settings.platform, configs[pack.name]), true); - prepareGeneration(pack, m_project, settings, buildsettings); + BuildSettings buildSettings; + auto config = configs[pack.name]; + buildSettings.processVars(m_project, pack, pack.getBuildSettings(settings.platform, config), true); + targets[pack.name] = TargetInfo(pack, [pack], config, buildSettings); + + prepareGeneration(pack, m_project, settings, buildSettings); } - string[] mainfiles; - collect(settings, m_project.rootPackage, targets, configs, mainfiles, null); - downwardsInheritSettings(m_project.rootPackage.name, targets, targets[m_project.rootPackage.name].buildSettings); + string[] mainfiles = configurePackages(m_project.rootPackage, targets, settings); + addBuildTypeSettings(targets, settings); foreach (ref t; targets.byValue) enforceBuildRequirements(t.buildSettings); auto bs = &targets[m_project.rootPackage.name].buildSettings; @@ -143,144 +145,281 @@ */ protected void performPostGenerateActions(GeneratorSettings settings, in TargetInfo[string] targets) {} - private BuildSettings collect(GeneratorSettings settings, Package pack, ref TargetInfo[string] targets, in string[string] configs, ref string[] main_files, string bin_pack) + /** Configure `rootPackage` and all of it's dependencies. + + 1. Merge versions, debugVersions, and inheritable build + settings from dependents to their dependencies. + + 2. Define version identifiers Have_dependency_xyz for all + direct dependencies of all packages. + + 3. Merge versions, debugVersions, and inheritable build settings from + dependencies to their dependents, so that importer and importee are ABI + compatible. This also transports all Have_dependency_xyz version + identifiers to `rootPackage`. + + Note: The upwards inheritance is done at last so that siblings do not + influence each other, also see https://github.com/dlang/dub/pull/1128. + + Note: Targets without output are integrated into their + dependents and removed from `targets`. + */ + private string[] configurePackages(Package rootPackage, TargetInfo[string] targets, GeneratorSettings genSettings) { - import std.algorithm : sort; + import std.algorithm : remove, sort; + import std.range : repeat; + + // 0. do shallow configuration (not including dependencies) of all packages + TargetType determineTargetType(const ref TargetInfo ti) + { + TargetType tt = ti.buildSettings.targetType; + if (ti.pack is rootPackage) { + if (tt == TargetType.autodetect || tt == TargetType.library) tt = TargetType.staticLibrary; + } else { + if (tt == TargetType.autodetect || tt == TargetType.library) tt = genSettings.combined ? TargetType.sourceLibrary : TargetType.staticLibrary; + else if (tt == TargetType.dynamicLibrary) { + logWarn("Dynamic libraries are not yet supported as dependencies - building as static library."); + tt = TargetType.staticLibrary; + } + } + if (tt != TargetType.none && tt != TargetType.sourceLibrary && ti.buildSettings.sourceFiles.empty) { + logWarn(`Configuration '%s' of package %s contains no source files. Please add {"targetType": "none"} to its package description to avoid building it.`, + ti.config, ti.pack.name); + tt = TargetType.none; + } + return tt; + } + + string[] mainSourceFiles; + bool[string] hasOutput; + + foreach (ref ti; targets.byValue) + { + auto bs = &ti.buildSettings; + // determine the actual target type + bs.targetType = determineTargetType(ti); + + switch (bs.targetType) + { + case TargetType.none: + // ignore any build settings for targetType none (only dependencies will be processed) + *bs = BuildSettings.init; + bs.targetType = TargetType.none; + break; + + case TargetType.executable: + break; + + case TargetType.dynamicLibrary: + // set -fPIC for dynamic library builds + ti.buildSettings.addOptions(BuildOption.pic); + goto default; + + default: + // remove any mainSourceFile from non-executable builds + if (bs.mainSourceFile.length) { + bs.sourceFiles = bs.sourceFiles.remove!(f => f == bs.mainSourceFile); + mainSourceFiles ~= bs.mainSourceFile; + } + break; + } + bool generatesBinary = bs.targetType != TargetType.sourceLibrary && bs.targetType != TargetType.none; + hasOutput[ti.pack.name] = generatesBinary || ti.pack is rootPackage; + } + + // mark packages as visited (only used during upwards propagation) + void[0][Package] visited; + + // collect all dependencies + void collectDependencies(Package pack, ref TargetInfo ti, TargetInfo[string] targets, size_t level = 0) + { + // use `visited` here as pkgs cannot depend on themselves + if (pack in visited) + return; + visited[pack] = typeof(visited[pack]).init; + + auto bs = &ti.buildSettings; + if (hasOutput[pack.name]) + logDebug("%sConfiguring target %s (%s %s %s)", ' '.repeat(2 * level), pack.name, bs.targetType, bs.targetPath, bs.targetName); + else + logDebug("%sConfiguring target without output %s", ' '.repeat(2 * level), pack.name); + + // get specified dependencies, e.g. vibe-d ~0.8.1 + auto deps = pack.getDependencies(targets[pack.name].config); + logDebug("deps: %s -> %(%s, %)", pack.name, deps.byKey); + foreach (depname; deps.keys.sort()) + { + auto depspec = deps[depname]; + // get selected package for that dependency, e.g. vibe-d 0.8.2-beta.2 + auto deppack = m_project.getDependency(depname, depspec.optional); + if (deppack is null) continue; // optional and not selected + + // if dependency has no output + if (!hasOutput[depname]) { + // add itself + ti.packages ~= deppack; + // and it's transitive dependencies to current target + collectDependencies(deppack, ti, targets, level + 1); + continue; + } + auto depti = &targets[depname]; + const depbs = &depti.buildSettings; + if (depbs.targetType == TargetType.executable) + continue; + // add to (link) dependencies + ti.dependencies ~= depname; + ti.linkDependencies ~= depname; + + // recurse + collectDependencies(deppack, *depti, targets, level + 1); + + // also recursively add all link dependencies of static libraries + // preserve topological sorting of dependencies for correct link order + if (depbs.targetType == TargetType.staticLibrary) + ti.linkDependencies = ti.linkDependencies.filter!(d => !depti.linkDependencies.canFind(d)).array ~ depti.linkDependencies; + } + } + + collectDependencies(rootPackage, targets[rootPackage.name], targets); + static if (__VERSION__ > 2070) + visited.clear(); + else + destroy(visited); + + // 1. downwards inherits versions, debugVersions, and inheritable build settings + static void configureDependencies(in ref TargetInfo ti, TargetInfo[string] targets, size_t level = 0) + { + // do not use `visited` here as dependencies must inherit + // configurations from *all* of their parents + logDebug("%sConfigure dependencies of %s, deps:%(%s, %)", ' '.repeat(2 * level), ti.pack.name, ti.dependencies); + foreach (depname; ti.dependencies) + { + auto pti = &targets[depname]; + mergeFromDependent(ti.buildSettings, pti.buildSettings); + configureDependencies(*pti, targets, level + 1); + } + } + + configureDependencies(targets[rootPackage.name], targets); + + // 2. add Have_dependency_xyz for all direct dependencies of a target + // (includes incorporated non-target dependencies and their dependencies) + foreach (ref ti; targets.byValue) + { + import std.range : chain; + import dub.internal.utils : stripDlangSpecialChars; + + auto bs = &ti.buildSettings; + auto pkgnames = ti.packages.map!(p => p.name).chain(ti.dependencies); + bs.addVersions(pkgnames.map!(pn => "Have_" ~ stripDlangSpecialChars(pn)).array); + } + + // 3. upwards inherit full build configurations (import paths, versions, debugVersions, ...) + void configureDependents(ref TargetInfo ti, TargetInfo[string] targets, size_t level = 0) + { + // use `visited` here as pkgs cannot depend on themselves + if (ti.pack in visited) + return; + visited[ti.pack] = typeof(visited[ti.pack]).init; + + logDiagnostic("%sConfiguring dependent %s, deps:%(%s, %)", ' '.repeat(2 * level), ti.pack.name, ti.dependencies); + // embedded non-binary dependencies + foreach (deppack; ti.packages[1 .. $]) + ti.buildSettings.add(targets[deppack.name].buildSettings); + // binary dependencies + foreach (depname; ti.dependencies) + { + auto pdepti = &targets[depname]; + configureDependents(*pdepti, targets, level + 1); + mergeFromDependency(pdepti.buildSettings, ti.buildSettings); + } + } + + configureDependents(targets[rootPackage.name], targets); + static if (__VERSION__ > 2070) + visited.clear(); + else + destroy(visited); + + // 4. override string import files in dependencies + static void overrideStringImports(ref TargetInfo ti, TargetInfo[string] targets, string[] overrides) + { + // do not use visited here as string imports can be overridden by *any* parent + // + // special support for overriding string imports in parent packages + // this is a candidate for deprecation, once an alternative approach + // has been found + if (ti.buildSettings.stringImportPaths.length) { + // override string import files (used for up to date checking) + foreach (ref f; ti.buildSettings.stringImportFiles) + { + foreach (o; overrides) + { + NativePath op; + if (f != o && NativePath(f).head == (op = NativePath(o)).head) { + logDebug("string import %s overridden by %s", f, o); + f = o; + ti.buildSettings.prependStringImportPaths(op.parentPath.toNativeString); + } + } + } + } + // add to overrides for recursion + overrides ~= ti.buildSettings.stringImportFiles; + // override dependencies + foreach (depname; ti.dependencies) + overrideStringImports(targets[depname], targets, overrides); + } + + overrideStringImports(targets[rootPackage.name], targets, null); + + // remove targets without output + foreach (name; targets.keys) + { + if (!hasOutput[name]) + targets.remove(name); + } + + return mainSourceFiles; + } + + private static void mergeFromDependent(in ref BuildSettings parent, ref BuildSettings child) + { + child.addVersions(parent.versions); + child.addDebugVersions(parent.debugVersions); + child.addOptions(BuildOptions(cast(BuildOptions)parent.options & inheritedBuildOptions)); + } + + private static void mergeFromDependency(in ref BuildSettings child, ref BuildSettings parent) + { import dub.compilers.utils : isLinkerFile; - if (auto pt = pack.name in targets) return pt.buildSettings; - - // determine the actual target type - auto shallowbs = pack.getBuildSettings(settings.platform, configs[pack.name]); - TargetType tt = shallowbs.targetType; - if (pack is m_project.rootPackage) { - if (tt == TargetType.autodetect || tt == TargetType.library) tt = TargetType.staticLibrary; - } else { - if (tt == TargetType.autodetect || tt == TargetType.library) tt = settings.combined ? TargetType.sourceLibrary : TargetType.staticLibrary; - else if (tt == TargetType.dynamicLibrary) { - logWarn("Dynamic libraries are not yet supported as dependencies - building as static library."); - tt = TargetType.staticLibrary; - } + parent.addDFlags(child.dflags); + parent.addVersions(child.versions); + parent.addDebugVersions(child.debugVersions); + parent.addImportPaths(child.importPaths); + parent.addStringImportPaths(child.stringImportPaths); + // linking of static libraries is done by parent + if (child.targetType == TargetType.staticLibrary) { + parent.addLinkerFiles(child.sourceFiles.filter!isLinkerFile.array); + parent.addLibs(child.libs); + parent.addLFlags(child.lflags); } - if (tt != TargetType.none && tt != TargetType.sourceLibrary && shallowbs.sourceFiles.empty) { - logWarn(`Configuration '%s' of package %s contains no source files. Please add {"targetType": "none"} to its package description to avoid building it.`, - configs[pack.name], pack.name); - tt = TargetType.none; - } - - shallowbs.targetType = tt; - bool generates_binary = tt != TargetType.sourceLibrary && tt != TargetType.none; - bool is_target = generates_binary || pack is m_project.rootPackage; - - if (tt == TargetType.none) { - // ignore any build settings for targetType none (only dependencies will be processed) - shallowbs = BuildSettings.init; - shallowbs.targetType = TargetType.none; - } - - // start to build up the build settings - BuildSettings buildsettings; - processVars(buildsettings, m_project, pack, shallowbs, true); - - // remove any mainSourceFile from library builds - if (buildsettings.targetType != TargetType.executable && buildsettings.mainSourceFile.length) { - buildsettings.sourceFiles = buildsettings.sourceFiles.filter!(f => f != buildsettings.mainSourceFile)().array; - main_files ~= buildsettings.mainSourceFile; - } - - // set pic for dynamic library builds. - if (buildsettings.targetType == TargetType.dynamicLibrary) - buildsettings.addOptions(BuildOption.pic); - - logDiagnostic("Generate target %s (%s %s %s)", pack.name, buildsettings.targetType, buildsettings.targetPath, buildsettings.targetName); - if (is_target) - targets[pack.name] = TargetInfo(pack, [pack], configs[pack.name], buildsettings, null); - - auto deps = pack.getDependencies(configs[pack.name]); - foreach (depname; deps.keys.sort()) { - auto depspec = deps[depname]; - auto dep = m_project.getDependency(depname, depspec.optional); - if (!dep) continue; - - auto depbs = collect(settings, dep, targets, configs, main_files, is_target ? pack.name : bin_pack); - - if (depbs.targetType != TargetType.sourceLibrary && depbs.targetType != TargetType.none) { - // add a reference to the target binary and remove all source files in the dependency build settings - depbs.sourceFiles = depbs.sourceFiles.filter!(f => f.isLinkerFile()).array; - depbs.importFiles = null; - } - - buildsettings.add(depbs); - - if (depbs.targetType == TargetType.executable) - continue; - - auto pt = (is_target ? pack.name : bin_pack) in targets; - assert(pt !is null); - if (auto pdt = depname in targets) { - pt.dependencies ~= depname; - pt.linkDependencies ~= depname; - if (depbs.targetType == TargetType.staticLibrary) - pt.linkDependencies = pt.linkDependencies.filter!(d => !pdt.linkDependencies.canFind(d)).array ~ pdt.linkDependencies; - } else pt.packages ~= dep; - } - - if (is_target) targets[pack.name].buildSettings = buildsettings.dup; - - return buildsettings; } - private string[] downwardsInheritSettings(string target, TargetInfo[string] targets, in BuildSettings root_settings) - { - import dub.internal.utils : stripDlangSpecialChars; - - auto ti = &targets[target]; - ti.buildSettings.addVersions(root_settings.versions); - ti.buildSettings.addDebugVersions(root_settings.debugVersions); - ti.buildSettings.addOptions(BuildOptions(cast(BuildOptions)root_settings.options & inheritedBuildOptions)); - - // special support for overriding string imports in parent packages - // this is a candidate for deprecation, once an alternative approach - // has been found - if (ti.buildSettings.stringImportPaths.length) { - // override string import files (used for up to date checking) - foreach (ref f; ti.buildSettings.stringImportFiles) - foreach (fi; root_settings.stringImportFiles) - if (f != fi && NativePath(f).head == NativePath(fi).head) { - f = fi; - } - - // add the string import paths (used by the compiler to find the overridden files) - ti.buildSettings.prependStringImportPaths(root_settings.stringImportPaths); - } - - string[] packs = ti.packages.map!(p => p.name).array; - foreach (d; ti.dependencies) - packs ~= downwardsInheritSettings(d, targets, root_settings); - - logDebug("%s: %s", target, packs); - - // Add Have_* versions *after* downwards inheritance, so that dependencies - // are build independently of the parent packages w.r.t the other parent - // dependencies. This enables sharing of the same package build for - // multiple dependees. - ti.buildSettings.addVersions(packs.map!(pn => "Have_" ~ stripDlangSpecialChars(pn)).array); - - return packs; - } - + // configure targets for build types such as release, or unittest-cov private void addBuildTypeSettings(TargetInfo[string] targets, GeneratorSettings settings) { - foreach (ref t; targets) { - t.buildSettings.add(settings.buildSettings); + foreach (ref ti; targets.byValue) { + ti.buildSettings.add(settings.buildSettings); // add build type settings and convert plain DFLAGS to build options - m_project.addBuildTypeSettings(t.buildSettings, settings.platform, settings.buildType, t.pack is m_project.rootPackage); - settings.compiler.extractBuildOptions(t.buildSettings); + m_project.addBuildTypeSettings(ti.buildSettings, settings.platform, settings.buildType, ti.pack is m_project.rootPackage); + settings.compiler.extractBuildOptions(ti.buildSettings); - auto tt = t.buildSettings.targetType; - bool generates_binary = tt != TargetType.sourceLibrary && tt != TargetType.none; - enforce (generates_binary || t.pack !is m_project.rootPackage || (t.buildSettings.options & BuildOption.syntaxOnly), + auto tt = ti.buildSettings.targetType; + bool generatesBinary = tt != TargetType.sourceLibrary && tt != TargetType.none; + enforce (generatesBinary || ti.pack !is m_project.rootPackage || (ti.buildSettings.options & BuildOption.syntaxOnly), format("Main package must have a binary target type, not %s. Cannot build.", tt)); } } diff --git a/test/4-describe-data-1-list.sh b/test/4-describe-data-1-list.sh index 3cfe5dc..def3899 100755 --- a/test/4-describe-data-1-list.sh +++ b/test/4-describe-data-1-list.sh @@ -77,11 +77,11 @@ echo >> "$expected_file" # --data=versions echo "someVerIdent" >> "$expected_file" -echo "anotherVerIdent" >> "$expected_file" echo "Have_describe_project" >> "$expected_file" echo "Have_describe_dependency_1" >> "$expected_file" echo "Have_describe_dependency_2" >> "$expected_file" echo "Have_describe_dependency_3" >> "$expected_file" +echo "anotherVerIdent" >> "$expected_file" echo >> "$expected_file" # --data=debug-versions echo "someDebugVerIdent" >> "$expected_file" diff --git a/test/4-describe-data-2-dmd.sh b/test/4-describe-data-2-dmd.sh index d323bc5..225537a 100755 --- a/test/4-describe-data-2-dmd.sh +++ b/test/4-describe-data-2-dmd.sh @@ -54,11 +54,11 @@ echo -n "'$CURR_DIR/describe-dependency-1/source/dummy.d' " >> "$expected_file" # --data=versions echo -n "-version=someVerIdent " >> "$expected_file" -echo -n "-version=anotherVerIdent " >> "$expected_file" echo -n "-version=Have_describe_project " >> "$expected_file" echo -n "-version=Have_describe_dependency_1 " >> "$expected_file" echo -n "-version=Have_describe_dependency_2 " >> "$expected_file" echo -n "-version=Have_describe_dependency_3 " >> "$expected_file" +echo -n "-version=anotherVerIdent " >> "$expected_file" # --data=debug-versions echo -n "-debug=someDebugVerIdent " >> "$expected_file" echo -n "-debug=anotherDebugVerIdent " >> "$expected_file" diff --git a/test/issue1262-version-inheritance-diamond/.gitignore b/test/issue1262-version-inheritance-diamond/.gitignore new file mode 100644 index 0000000..c09a597 --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/.gitignore @@ -0,0 +1,15 @@ +.dub +docs.json +__dummy.html +docs/ +issue1262-version-inheritance-diamond +issue1262-version-inheritance-diamond.so +issue1262-version-inheritance-diamond.dylib +issue1262-version-inheritance-diamond.dll +issue1262-version-inheritance-diamond.a +issue1262-version-inheritance-diamond.lib +issue1262-version-inheritance-diamond-test-* +*.exe +*.o +*.obj +*.lst diff --git a/test/issue1262-version-inheritance-diamond/.no_run b/test/issue1262-version-inheritance-diamond/.no_run new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/.no_run diff --git a/test/issue1262-version-inheritance-diamond/.no_test b/test/issue1262-version-inheritance-diamond/.no_test new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/.no_test diff --git a/test/issue1262-version-inheritance-diamond/daughter/.gitignore b/test/issue1262-version-inheritance-diamond/daughter/.gitignore new file mode 100644 index 0000000..f190acb --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/daughter/.gitignore @@ -0,0 +1,14 @@ +.dub +docs.json +__dummy.html +docs/ +daughter.so +daughter.dylib +daughter.dll +daughter.a +daughter.lib +daughter-test-* +*.exe +*.o +*.obj +*.lst diff --git a/test/issue1262-version-inheritance-diamond/daughter/dub.sdl b/test/issue1262-version-inheritance-diamond/daughter/dub.sdl new file mode 100644 index 0000000..3a0eee7 --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/daughter/dub.sdl @@ -0,0 +1,3 @@ +name "daughter" +versions "Daughter" +dependency "diamond" path="../diamond" diff --git a/test/issue1262-version-inheritance-diamond/daughter/source/dummy.d b/test/issue1262-version-inheritance-diamond/daughter/source/dummy.d new file mode 100644 index 0000000..89139c3 --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/daughter/source/dummy.d @@ -0,0 +1,6 @@ +module daughter.dummy; + +version (Parent) {} else static assert(0, "Expected Parent to be set"); +version (Daughter) {} else static assert(0, "Expected Daughter to be set"); +version (Son) {} else static assert(0, "Expected Son to be set"); +version (Diamond) {} else static assert(0, "Expected Diamond to be set"); diff --git a/test/issue1262-version-inheritance-diamond/diamond/.gitignore b/test/issue1262-version-inheritance-diamond/diamond/.gitignore new file mode 100644 index 0000000..c359a73 --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/diamond/.gitignore @@ -0,0 +1,14 @@ +.dub +docs.json +__dummy.html +docs/ +diamond.so +diamond.dylib +diamond.dll +diamond.a +diamond.lib +diamond-test-* +*.exe +*.o +*.obj +*.lst diff --git a/test/issue1262-version-inheritance-diamond/diamond/dub.sdl b/test/issue1262-version-inheritance-diamond/diamond/dub.sdl new file mode 100644 index 0000000..85cb8a1 --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/diamond/dub.sdl @@ -0,0 +1,2 @@ +name "diamond" +versions "Diamond" diff --git a/test/issue1262-version-inheritance-diamond/diamond/source/dummy.d b/test/issue1262-version-inheritance-diamond/diamond/source/dummy.d new file mode 100644 index 0000000..fb1499e --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/diamond/source/dummy.d @@ -0,0 +1,6 @@ +module diamond.dummy; + +version (Parent) {} else static assert(0, "Expected Parent to be set"); +version (Daughter) {} else static assert(0, "Expected Daughter to be set"); +version (Son) {} else static assert(0, "Expected Son to be set"); +version (Diamond) {} else static assert(0, "Expected Diamond to be set"); diff --git a/test/issue1262-version-inheritance-diamond/dub.sdl b/test/issue1262-version-inheritance-diamond/dub.sdl new file mode 100644 index 0000000..588adb8 --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/dub.sdl @@ -0,0 +1,4 @@ +name "issue1262-version-inheritance-diamond" +versions "Parent" +dependency "daughter" path="daughter" +dependency "son" path="son" diff --git a/test/issue1262-version-inheritance-diamond/son/.gitignore b/test/issue1262-version-inheritance-diamond/son/.gitignore new file mode 100644 index 0000000..601a33b --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/son/.gitignore @@ -0,0 +1,14 @@ +.dub +docs.json +__dummy.html +docs/ +son.so +son.dylib +son.dll +son.a +son.lib +son-test-* +*.exe +*.o +*.obj +*.lst diff --git a/test/issue1262-version-inheritance-diamond/son/dub.sdl b/test/issue1262-version-inheritance-diamond/son/dub.sdl new file mode 100644 index 0000000..41dc1be --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/son/dub.sdl @@ -0,0 +1,3 @@ +name "son" +versions "Son" +dependency "diamond" path="../diamond" diff --git a/test/issue1262-version-inheritance-diamond/son/source/dummy.d b/test/issue1262-version-inheritance-diamond/son/source/dummy.d new file mode 100644 index 0000000..85841ad --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/son/source/dummy.d @@ -0,0 +1,6 @@ +module son.dummy; + +version (Parent) {} else static assert(0, "Expected Parent to be set"); +version (Daughter) {} else static assert(0, "Expected Daughter to be set"); +version (Son) {} else static assert(0, "Expected Son to be set"); +version (Diamond) {} else static assert(0, "Expected Diamond to be set"); diff --git a/test/issue1262-version-inheritance-diamond/source/app.d b/test/issue1262-version-inheritance-diamond/source/app.d new file mode 100644 index 0000000..10f0ae6 --- /dev/null +++ b/test/issue1262-version-inheritance-diamond/source/app.d @@ -0,0 +1,8 @@ +version (Parent) {} else static assert(0, "Expected Parent to be set"); +version (Daughter) {} else static assert(0, "Expected Daughter to be set"); +version (Son) {} else static assert(0, "Expected Son to be set"); +version (Diamond) {} else static assert(0, "Expected Diamond to be set"); + +void main() +{ +} diff --git a/test/issue1262-version-inheritance/.gitignore b/test/issue1262-version-inheritance/.gitignore new file mode 100644 index 0000000..84dca77 --- /dev/null +++ b/test/issue1262-version-inheritance/.gitignore @@ -0,0 +1,15 @@ +.dub +docs.json +__dummy.html +docs/ +issue1262-version-inheritance +issue1262-version-inheritance.so +issue1262-version-inheritance.dylib +issue1262-version-inheritance.dll +issue1262-version-inheritance.a +issue1262-version-inheritance.lib +issue1262-version-inheritance-test-* +*.exe +*.o +*.obj +*.lst diff --git a/test/issue1262-version-inheritance/.no_run b/test/issue1262-version-inheritance/.no_run new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue1262-version-inheritance/.no_run diff --git a/test/issue1262-version-inheritance/.no_test b/test/issue1262-version-inheritance/.no_test new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue1262-version-inheritance/.no_test diff --git a/test/issue1262-version-inheritance/daughter/.gitignore b/test/issue1262-version-inheritance/daughter/.gitignore new file mode 100644 index 0000000..f190acb --- /dev/null +++ b/test/issue1262-version-inheritance/daughter/.gitignore @@ -0,0 +1,14 @@ +.dub +docs.json +__dummy.html +docs/ +daughter.so +daughter.dylib +daughter.dll +daughter.a +daughter.lib +daughter-test-* +*.exe +*.o +*.obj +*.lst diff --git a/test/issue1262-version-inheritance/daughter/dub.sdl b/test/issue1262-version-inheritance/daughter/dub.sdl new file mode 100644 index 0000000..baa3295 --- /dev/null +++ b/test/issue1262-version-inheritance/daughter/dub.sdl @@ -0,0 +1,3 @@ +name "daughter" +versions "Daughter" + diff --git a/test/issue1262-version-inheritance/daughter/source/dummy.d b/test/issue1262-version-inheritance/daughter/source/dummy.d new file mode 100644 index 0000000..aad7fc8 --- /dev/null +++ b/test/issue1262-version-inheritance/daughter/source/dummy.d @@ -0,0 +1,5 @@ +module daughter.dummy; + +version (Parent) {} else static assert(0, "Expected Parent to be set"); +version (Daughter) {} else static assert(0, "Expected Daughter to be set"); +version (Son) static assert(0, "Expected Son to no be set"); diff --git a/test/issue1262-version-inheritance/dub.sdl b/test/issue1262-version-inheritance/dub.sdl new file mode 100644 index 0000000..46568fb --- /dev/null +++ b/test/issue1262-version-inheritance/dub.sdl @@ -0,0 +1,4 @@ +name "issue1262-version-inheritance" +versions "Parent" +dependency "daughter" path="daughter" +dependency "son" path="son" diff --git a/test/issue1262-version-inheritance/son/.gitignore b/test/issue1262-version-inheritance/son/.gitignore new file mode 100644 index 0000000..601a33b --- /dev/null +++ b/test/issue1262-version-inheritance/son/.gitignore @@ -0,0 +1,14 @@ +.dub +docs.json +__dummy.html +docs/ +son.so +son.dylib +son.dll +son.a +son.lib +son-test-* +*.exe +*.o +*.obj +*.lst diff --git a/test/issue1262-version-inheritance/son/dub.sdl b/test/issue1262-version-inheritance/son/dub.sdl new file mode 100644 index 0000000..5882548 --- /dev/null +++ b/test/issue1262-version-inheritance/son/dub.sdl @@ -0,0 +1,2 @@ +name "son" +versions "Son" diff --git a/test/issue1262-version-inheritance/son/source/dummy.d b/test/issue1262-version-inheritance/son/source/dummy.d new file mode 100644 index 0000000..63995a1 --- /dev/null +++ b/test/issue1262-version-inheritance/son/source/dummy.d @@ -0,0 +1,5 @@ +module son.dummy; + +version (Parent) {} else static assert(0, "Expected Parent to be set"); +version (Daughter) static assert(0, "Expected Daughter to not be set"); +version (Son) {} else static assert(0, "Expected Son to be set"); diff --git a/test/issue1262-version-inheritance/source/app.d b/test/issue1262-version-inheritance/source/app.d new file mode 100644 index 0000000..b6bb4be --- /dev/null +++ b/test/issue1262-version-inheritance/source/app.d @@ -0,0 +1,7 @@ +version (Parent) {} else static assert(0, "Expected Parent to be set"); +version (Daughter) {} else static assert(0, "Expected Daughter to be set"); +version (Son) {} else static assert(0, "Expected Son to be set"); + +void main() +{ +} diff --git a/test/issue616-subpack/dub.json b/test/issue616-subpack/dub.json index 552ddcd..31c525a 100644 --- a/test/issue616-subpack/dub.json +++ b/test/issue616-subpack/dub.json @@ -1,6 +1,6 @@ { "name": "issue616-subpack", - "targetType": "executable", + "targetType": "library", "dependencies": { "issue616-subsubpack": { "version": "1.0", diff --git a/test/issue616-subsubpack/dub.json b/test/issue616-subsubpack/dub.json index e4e4b5b..207761f 100644 --- a/test/issue616-subsubpack/dub.json +++ b/test/issue616-subsubpack/dub.json @@ -1,4 +1,4 @@ { "name": "issue616-subsubpack", - "targetType": "executable" + "targetType": "library" }