diff --git a/package.json b/package.json index 5e9be10..b3dfc27 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ { "name": "application", "targetType": "executable", + "mainSourceFile": "source/app.d", "libs": ["curl"], "copyFiles-windows": ["curllib.dll", "libeay32.dll", "openldap.dll", "ssleay32.dll"], "versions": ["DubUseCurl"] diff --git a/source/dub/dub.d b/source/dub/dub.d index ae2a24a..5fa2d78 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -234,9 +234,8 @@ settings.config = m_project.getDefaultConfiguration(platform); } else { logInfo(`Generating test runner configuration '%s' for '%s' (%s).`, test_config, config, lbuildsettings.targetType); - enforce(lbuildsettings.mainSourceFile.length, `A "mainSourceFile" is required for testing, but none was set or inferred.`); - BuildSettingsTemplate tcinfo = m_project.mainPackage.info.getConfiguration(config).buildSettings; + BuildSettingsTemplate tcinfo = m_project.mainPackage.info.getConfiguration(config).buildSettings; tcinfo.targetType = TargetType.executable; tcinfo.targetName = test_config; tcinfo.versions[""] ~= "VibeCustomMain"; // HACK for vibe.d's legacy main() behavior @@ -248,7 +247,14 @@ custommodname = custom_main_file.head.toString().baseName(".d"); } - auto mainmodname = lbuildsettings.determineModuleName(Path(lbuildsettings.mainSourceFile), m_project.mainPackage.path); + string[] import_modules; + if (lbuildsettings.mainSourceFile.length) { + import_modules ~= lbuildsettings.determineModuleName(Path(lbuildsettings.mainSourceFile), m_project.mainPackage.path); + } else { + foreach (file; lbuildsettings.sourceFiles){ + import_modules ~= lbuildsettings.determineModuleName(Path(file), m_project.mainPackage.path); + } + } // generate main file Path mainfile = getTempDir() ~ "test_main.d"; @@ -261,12 +267,12 @@ fil.write(format(q{ module test_main; import %s; - import %s; - }, mainmodname, custommodname)); + }, custommodname)); + foreach (mod; import_modules) fil.write(format("import %s;\n", mod)); } else { - fil.write(format(q{ - module test_main; - import %s; + fil.write("module test_main;\n"); + foreach (mod; import_modules) fil.write(format("import %s;", mod)); + fil.write(q{ import std.stdio; import core.runtime; @@ -276,10 +282,10 @@ import core.runtime; Runtime.moduleUnitTester = () => true; //runUnitTests!app(new JsonTestResultWriter("results.json")); - assert(runUnitTests!%s(new ConsoleTestResultWriter), "Unit tests failed."); + assert(runUnitTests!test_main(new ConsoleTestResultWriter), "Unit tests failed."); } } - }, mainmodname, mainmodname)); + }); } } m_project.mainPackage.info.configurations ~= ConfigurationInfo(test_config, tcinfo); @@ -567,5 +573,5 @@ return ret.data; } } - throw new Exception("Main source file not found in any import path."); + throw new Exception(format("Source file '%s' not found in any import path.", file.toNativeString())); } diff --git a/source/dub/project.d b/source/dub/project.d index 84ccf5f..cb9d1cc 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -401,7 +401,8 @@ dst.targetPath = psettings.targetPath; dst.targetName = psettings.targetName; dst.workingDirectory = processVars(psettings.workingDirectory, pkg_path, true); - dst.mainSourceFile = processVars(psettings.mainSourceFile, pkg_path, true); + if (psettings.mainSourceFile.length) + dst.mainSourceFile = processVars(psettings.mainSourceFile, pkg_path, true); } }