diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 0d1cdff..f5f5a97 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -559,6 +559,8 @@ class TestCommand : PackageBuildCommand { private { string m_mainFile; + bool m_combined = false; + bool m_force = false; } this() @@ -593,6 +595,12 @@ args.getopt("main-file", &m_mainFile, [ "Specifies a custom file containing the main() function to use for running the tests." ]); + args.getopt("combined", &m_combined, [ + "Tries to build the whole project in a single compiler run." + ]); + args.getopt("f|force", &m_force, [ + "Forces a recompilation even if the target is up to date" + ]); super.prepare(args); } @@ -604,7 +612,17 @@ setupPackage(dub, package_name); - dub.testProject(m_buildSettings, m_buildPlatform, m_build_config, Path(m_mainFile), app_args); + GeneratorSettings settings; + settings.platform = m_buildPlatform; + settings.compiler = getCompiler(m_buildPlatform.compilerBinary); + settings.buildType = "unittest"; + settings.buildSettings = m_buildSettings; + settings.combined = m_combined; + settings.force = m_force; + settings.run = true; + settings.runArgs = app_args; + + dub.testProject(settings, m_build_config, Path(m_mainFile)); return 0; } } diff --git a/source/dub/dub.d b/source/dub/dub.d index 23e3a91..4e55f52 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -200,34 +200,27 @@ generator.generate(settings); } - void testProject(BuildSettings build_settings, BuildPlatform platform, string config, Path custom_main_file, string[] run_args) + void testProject(GeneratorSettings settings, string config, Path custom_main_file) { if (custom_main_file.length && !custom_main_file.absolute) custom_main_file = getWorkingDirectory() ~ custom_main_file; if (config.length == 0) { // if a custom main file was given, favor the first library configuration, so that it can be applied - if (custom_main_file.length) config = m_project.getDefaultConfiguration(platform, false); + if (custom_main_file.length) config = m_project.getDefaultConfiguration(settings.platform, false); // else look for a "unittest" configuration if (!config.length && m_project.mainPackage.configurations.canFind("unittest")) config = "unittest"; // if not found, fall back to the first "library" configuration - if (!config.length) config = m_project.getDefaultConfiguration(platform, false); + if (!config.length) config = m_project.getDefaultConfiguration(settings.platform, false); // if still nothing found, use the first executable configuration - if (!config.length) config = m_project.getDefaultConfiguration(platform, true); + if (!config.length) config = m_project.getDefaultConfiguration(settings.platform, true); } auto generator = createProjectGenerator("build", m_project, m_packageManager); - GeneratorSettings settings; - settings.platform = platform; - settings.compiler = getCompiler(platform.compilerBinary); - settings.buildType = "unittest"; - settings.buildSettings = build_settings; - settings.run = true; - settings.runArgs = run_args; auto test_config = format("__test__%s__", config); - BuildSettings lbuildsettings = build_settings; - m_project.addBuildSettings(lbuildsettings, platform, config, null, true); + BuildSettings lbuildsettings = settings.buildSettings; + m_project.addBuildSettings(lbuildsettings, settings.platform, config, null, true); if (lbuildsettings.targetType == TargetType.none) { logInfo(`Configuration '%s' has target type "none". Skipping test.`, config); return; @@ -241,7 +234,7 @@ } else if (lbuildsettings.sourceFiles.empty) { logInfo(`No source files found in configuration '%s'. Falling back to "dub -b unittest".`, config); if (!custom_main_file.empty) logWarn("Ignoring custom main file."); - settings.config = m_project.getDefaultConfiguration(platform); + settings.config = m_project.getDefaultConfiguration(settings.platform); } else { logInfo(`Generating test runner configuration '%s' for '%s' (%s).`, test_config, config, lbuildsettings.targetType); diff --git a/source/dub/package_.d b/source/dub/package_.d index 8f810cb..e1d7cf0 100644 --- a/source/dub/package_.d +++ b/source/dub/package_.d @@ -232,6 +232,18 @@ config.buildSettings.warnOnSpecialCompilerFlags(m_info.name, config.name); } + const(BuildSettingsTemplate) getBuildSettings(string config = null) + const { + if (config.length) { + foreach (ref conf; m_info.configurations) + if (conf.name == config) + return conf.buildSettings; + assert(false, "Unknown configuration: "~config); + } else { + return m_info.buildSettings; + } + } + /// Returns all BuildSettings for the given platform and config. BuildSettings getBuildSettings(in BuildPlatform platform, string config) const {