diff --git a/source/dub/compilers/compiler.d b/source/dub/compilers/compiler.d index 2e96292..45f064e 100644 --- a/source/dub/compilers/compiler.d +++ b/source/dub/compilers/compiler.d @@ -182,6 +182,7 @@ string targetPath; string targetName; string workingDirectory; + string mainSourceFile; string[] dflags; string[] lflags; string[] libs; diff --git a/source/dub/generators/build.d b/source/dub/generators/build.d index 72b6f3b..7024acf 100644 --- a/source/dub/generators/build.d +++ b/source/dub/generators/build.d @@ -123,9 +123,10 @@ void performRDMDBuild(GeneratorSettings settings, ref BuildSettings buildsettings) { + auto cwd = Path(getcwd()); //Added check for existance of [AppNameInPackagejson].d //If exists, use that as the starting file. - auto mainsrc = getMainSourceFile(m_project); + auto mainsrc = buildsettings.mainSourceFile.length ? m_project.mainPackage.path ~ buildsettings.mainSourceFile : getMainSourceFile(m_project); // do not pass all source files to RDMD, only the main source file buildsettings.sourceFiles = buildsettings.sourceFiles.filter!(s => !s.endsWith(".d"))().array(); @@ -156,7 +157,7 @@ string[] flags = ["--build-only", "--compiler="~settings.platform.compilerBinary]; flags ~= buildsettings.dflags; - flags ~= (mainsrc).toNativeString(); + flags ~= mainsrc.relativeTo(cwd).toNativeString(); prepareGeneration(buildsettings); finalizeGeneration(buildsettings, generate_binary); @@ -368,10 +369,10 @@ private Path getMainSourceFile(in Project prj) { - foreach( f; ["source/app.d", "src/app.d", "source/"~prj.name~".d", "src/"~prj.name~".d"]) - if( exists(f) ) - return Path(f); - return Path("source/app.d"); + foreach (f; ["source/app.d", "src/app.d", "source/"~prj.name~".d", "src/"~prj.name~".d"]) + if (existsFile(prj.mainPackage.path ~ f)) + return prj.mainPackage.path ~ f; + return prj.mainPackage.path ~ "source/app.d"; } private bool isLinkerFile(string f) diff --git a/source/dub/package_.d b/source/dub/package_.d index a0318d0..8ceda86 100644 --- a/source/dub/package_.d +++ b/source/dub/package_.d @@ -57,17 +57,25 @@ m_info.buildSettings.stringImportPaths[""] ~= defvf; } - string[] app_files; + string app_main_file, lib_main_file; auto pkg_name = packageInfo.name.get!string(); // check for default source folders - foreach(defsf; ["source", "src"]){ + foreach(defsf; ["source/", "src/"]){ auto p = m_path ~ defsf; if( existsFile(p) ){ m_info.buildSettings.sourcePaths[""] ~= defsf; m_info.buildSettings.importPaths[""] ~= defsf; - if( existsFile(p ~ "app.d") ) app_files ~= Path(defsf ~ "/app.d").toNativeString(); - else if( existsFile(p ~ (pkg_name~".d")) ) app_files ~= Path(defsf ~ "/"~pkg_name~".d").toNativeString(); + foreach (fil; ["app.d", "main.d", pkg_name ~ "/main.d", pkg_name ~ "/" ~ pkg_name ~ ".d"]) + if (existsFile(p ~ fil)) { + app_main_file = Path(defsf ~ fil).toNativeString(); + break; + } + foreach (fil; [pkg_name ~ "/all.d", pkg_name ~ "/package.d", pkg_name ~ "/" ~ pkg_name ~ ".d"]) + if (existsFile(p ~ fil)) { + lib_main_file = Path(defsf ~ fil).toNativeString(); + break; + } } } @@ -104,21 +112,24 @@ if (m_info.buildSettings.targetType == TargetType.executable) { BuildSettingsTemplate app_settings; app_settings.targetType = TargetType.executable; + if (m_info.buildSettings.mainSourceFile.empty) app_settings.mainSourceFile = app_main_file; m_info.configurations ~= ConfigurationInfo("application", app_settings); } else if (m_info.buildSettings.targetType != TargetType.none) { BuildSettingsTemplate lib_settings; lib_settings.targetType = m_info.buildSettings.targetType == TargetType.autodetect ? TargetType.library : m_info.buildSettings.targetType; if (m_info.buildSettings.targetType == TargetType.autodetect) { - if (app_files.length) { - lib_settings.excludedSourceFiles[""] = app_files; + if (app_main_file.length) { + lib_settings.excludedSourceFiles[""] ~= app_main_file; BuildSettingsTemplate app_settings; app_settings.targetType = TargetType.executable; + app_settings.mainSourceFile = app_main_file; m_info.configurations ~= ConfigurationInfo("application", app_settings); } } + if (m_info.buildSettings.mainSourceFile.empty) lib_settings.mainSourceFile = lib_main_file; m_info.configurations ~= ConfigurationInfo("library", lib_settings); } } @@ -495,6 +506,7 @@ string targetPath; string targetName; string workingDirectory; + string mainSourceFile; string[string] subConfigurations; string[][string] dflags; string[][string] lflags; @@ -567,6 +579,10 @@ enforce(suffix.empty, "workingDirectory does not support platform customization."); this.workingDirectory = value.get!string; break; + case "mainSourceFile": + enforce(suffix.empty, "mainSourceFile does not support platform customization."); + this.mainSourceFile = value.get!string; + break; case "subConfigurations": enforce(suffix.empty, "subConfigurations does not support platform customization."); this.subConfigurations = deserializeJson!(string[string])(value); @@ -626,6 +642,7 @@ if (!targetPath.empty) ret["targetPath"] = targetPath; if (!targetName.empty) ret["targetName"] = targetName; if (!workingDirectory.empty) ret["workingDirectory"] = workingDirectory; + if (!mainSourceFile.empty) ret["mainSourceFile"] = mainSourceFile; foreach (suffix, arr; dflags) ret["dflags"~suffix] = serializeToJson(arr); foreach (suffix, arr; lflags) ret["lflags"~suffix] = serializeToJson(arr); foreach (suffix, arr; libs) ret["libs"~suffix] = serializeToJson(arr); @@ -663,6 +680,7 @@ if (!this.targetPath.empty) dst.targetPath = this.targetPath; if (!this.targetName.empty) dst.targetName = this.targetName; if (!this.workingDirectory.empty) dst.workingDirectory = this.workingDirectory; + if (!this.mainSourceFile.empty) dst.mainSourceFile = this.mainSourceFile; void collectFiles(string method)(in string[][string] paths_map, string pattern) {