diff --git a/source/dub/compilers/buildsettings.d b/source/dub/compilers/buildsettings.d index 2d821a4..c874c88 100644 --- a/source/dub/compilers/buildsettings.d +++ b/source/dub/compilers/buildsettings.d @@ -298,6 +298,7 @@ static if (__VERSION__ >= 2067) { @ignore BitFlags!BuildOption values; this(BuildOption opt) { values = opt; } + this(BitFlags!BuildOption v) { values = v; } deprecated("Use BuildOption.* instead.") { enum none = BuildOption.none; enum debugMode = BuildOption.debugMode; @@ -342,3 +343,21 @@ alias values this; } + +/** + All build options that will be inherited upwards in the dependency graph + + Build options in this category fulfill one of the following properties: + $(UL + $(LI The option affects the semantics of the generated code) + $(LI The option affects if a certain piece of code is valid or not) + $(LI The option enabled meta information in dependent projects that are useful for the dependee (e.g. debug information)) + ) +*/ +enum BuildOptions inheritedBuildOptions = BuildOption.debugMode | BuildOption.releaseMode + | BuildOption.coverage | BuildOption.debugInfo | BuildOption.debugInfoC + | BuildOption.alwaysStackFrame | BuildOption.stackStomping | BuildOption.inline + | BuildOption.noBoundsCheck | BuildOption.profile | BuildOption.ignoreUnknownPragmas + | BuildOption.syntaxOnly | BuildOption.warnings | BuildOption.warningsAsErrors + | BuildOption.ignoreDeprecations | BuildOption.deprecationWarnings + | BuildOption.deprecationErrors | BuildOption.property | BuildOption.profileGC; diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 541efd6..d4ac442 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -219,7 +219,7 @@ targetbs.add(settings.buildSettings); // add build type settings and convert plain DFLAGS to build options - m_project.addBuildTypeSettings(targetbs, settings.platform, settings.buildType); + m_project.addBuildTypeSettings(targetbs, settings.platform, settings.buildType, pack is m_project.rootPackage); settings.compiler.extractBuildOptions(targetbs); enforce (generates_binary || pack !is m_project.rootPackage || (targetbs.options & BuildOption.syntaxOnly), @@ -236,7 +236,7 @@ auto ti = &targets[target]; ti.buildSettings.addVersions(root_settings.versions); ti.buildSettings.addDebugVersions(root_settings.debugVersions); - ti.buildSettings.addOptions(root_settings.options); + ti.buildSettings.addOptions(BuildOptions(root_settings.options & inheritedBuildOptions)); // special support for overriding string imports in parent packages // this is a candidate for deprecation, once an alternative approach diff --git a/source/dub/project.d b/source/dub/project.d index a83bf26..fa902e7 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -530,12 +530,20 @@ } } - void addBuildTypeSettings(ref BuildSettings dst, in BuildPlatform platform, string build_type) + void addBuildTypeSettings(ref BuildSettings dst, in BuildPlatform platform, string build_type, bool for_root_package = true) { bool usedefflags = !(dst.requirements & BuildRequirement.noDefaultFlags); if (usedefflags) { BuildSettings btsettings; m_rootPackage.addBuildTypeSettings(btsettings, platform, build_type); + + if (!for_root_package) { + // don't propagate unittest switch to dependencies, as dependent + // unit tests aren't run anyway and the additional code may + // cause linking to fail on Windows (issue #640) + btsettings.removeOptions(BuildOption.unittests); + } + processVars(dst, this, m_rootPackage, btsettings); } }