diff --git a/source/app.d b/source/app.d index 1efa085..e866689 100644 --- a/source/app.d +++ b/source/app.d @@ -262,7 +262,7 @@ remove-local Removes a local package directory list-locals Prints a list of all locals generate Generates project files using the specified generator: - VisualD, MonoD, build, rdmd + visuald, mono-d, build, rdmd General options: --annotate Do not execute dependency installations, just print diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 3a1fd41..336fe92 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -58,10 +58,10 @@ case "rdmd": logTrace("Generating rdmd generator."); return new RdmdGenerator(app, mgr); - case "MonoD": + case "mono-d": logTrace("Generating MonoD generator."); return new MonoDGenerator(app, mgr); - case "VisualD": + case "visuald": logTrace("Generating VisualD generator."); return new VisualDGenerator(app, mgr); } diff --git a/source/dub/generators/monod.d b/source/dub/generators/monod.d index 2e3db5a..788abbf 100644 --- a/source/dub/generators/monod.d +++ b/source/dub/generators/monod.d @@ -43,11 +43,11 @@ void generateProject(GeneratorSettings settings) { logTrace("About to generate projects for %s, with %s direct dependencies.", m_app.mainPackage().name, to!string(m_app.mainPackage().dependencies().length)); - generateProjects(m_app.mainPackage(), settings.platform); - generateSolution(); + generateProjects(m_app.mainPackage(), settings); + generateSolution(settings); } - private void generateSolution() + private void generateSolution(GeneratorSettings settings) { auto sln = openFile(m_app.mainPackage().name ~ ".sln", FileMode.CreateTrunc); scope(exit) sln.close(); @@ -60,9 +60,9 @@ sln.put("Microsoft Visual Studio Solution File, Format Version 11.00\n"); sln.put("# Visual Studio 2010\n"); - generateSolutionEntry(sln, m_app.mainPackage); + generateSolutionEntry(sln, settings, m_app.mainPackage); if( !m_singleProject ) - performOnDependencies(m_app.mainPackage, pack => generateSolutionEntry(sln, pack)); + performOnDependencies(m_app.mainPackage, pack => generateSolutionEntry(sln, settings, pack)); sln.put("Global\n"); @@ -97,7 +97,7 @@ sln.put("EndGlobal\n"); } - private void generateSolutionEntry(OutputStream ret, const Package pack) + private void generateSolutionEntry(OutputStream ret, GeneratorSettings settings, const Package pack) { auto projUuid = generateUUID(); auto projName = pack.name; @@ -124,7 +124,7 @@ ret.put("EndProject\n"); } - private void generateProjects(in Package pack, BuildPlatform build_platform) + private void generateProjects(in Package pack, GeneratorSettings settings) { bool[const(Package)] visited; @@ -132,7 +132,7 @@ if( p in visited ) return; visited[p] = true; - generateProject(p, build_platform); + generateProject(p, settings); if( !m_singleProject ) performOnDependencies(p, &generateRec); @@ -140,7 +140,7 @@ generateRec(pack); } - private void generateProject(in Package pack, BuildPlatform build_platform) + private void generateProject(in Package pack, GeneratorSettings settings) { logTrace("About to write to '%s.dproj' file", pack.name); auto sln = openFile(pack.name ~ ".dproj", FileMode.CreateTrunc); @@ -152,7 +152,10 @@ auto projName = pack.name; - auto buildsettings = m_app.getBuildSettings(build_platform, m_app.getDefaultConfiguration(build_platform)); + auto buildsettings = m_app.getBuildSettings(settings.platform, m_app.getDefaultConfiguration(settings.platform)); + + // Mono-D does not have a setting for string import paths + settings.compiler.prepareBuildSettings(buildsettings, BuildSetting.all & ~BuildSetting.stringImportPaths); sln.put(" \n"); sln.put(" Debug\n"); @@ -167,7 +170,8 @@ if( !buildsettings.versions.empty ){ sln.put(" \n"); sln.put(" \n"); - sln.formattedWrite(" %s\n", buildsettings.versions.join(", ")); + foreach(ver; buildsettings.versions) + sln.formattedWrite(" %s\n", ver); sln.put(" \n"); sln.put(" \n"); } @@ -183,11 +187,10 @@ sln.put(" \n"); sln.put(" \n"); foreach(dir; buildsettings.libs) - sln.formattedWrite(" %s\n", build_platform.platform.canFind("windows") ? dir ~ ".lib" : dir); + sln.formattedWrite(" %s\n", settings.platform.platform.canFind("windows") ? dir ~ ".lib" : dir); sln.put(" \n"); sln.put(" \n"); } - buildsettings.dflags ~= buildsettings.stringImportPaths.map!(p => "-J"~p)().array(); sln.formattedWrite(" %s\n", buildsettings.dflags.join(" ")); sln.formattedWrite(" %s\n", buildsettings.lflags.join(" ")); sln.put(" \n"); @@ -218,8 +221,11 @@ if( p in visited ) return; visited[p] = true; - foreach( s; p.sources ) + foreach( s; p.sources ){ + if( p !is m_app.mainPackage && s == Path("source/app.d") ) + continue; sln.formattedWrite(" \n", (p.path.relativeTo(pack.path) ~ s).toNativeString()); + } foreach( s; buildsettings.files ) sln.formattedWrite(" \n", s); } @@ -236,16 +242,24 @@ void performOnDependencies(const Package main, void delegate(const Package pack) op) { - foreach(id, dependency; main.dependencies){ - logDebug("Retrieving package %s from package manager.", id); - auto pack = m_pkgMgr.getBestPackage(id, dependency); - if(pack is null) { - logWarn("Package %s (%s) could not be retrieved continuing...", id, to!string(dependency)); - continue; + bool[const(Package)] visited; + void perform_rec(const Package parent_pack){ + foreach(id, dependency; parent_pack.dependencies){ + logDebug("Retrieving package %s from package manager.", id); + auto pack = m_pkgMgr.getBestPackage(id, dependency); + if( pack in visited ) continue; + visited[pack] = true; + if(pack is null) { + logWarn("Package %s (%s) could not be retrieved continuing...", id, to!string(dependency)); + continue; + } + logDebug("Performing on retrieved package %s", pack.name); + op(pack); + perform_rec(pack); } - logDebug("Performing on retrieved package %s", pack.name); - op(pack); } + + perform_rec(main); } string generateUUID() diff --git a/source/dub/generators/visuald.d b/source/dub/generators/visuald.d index 537ab89..df5b199 100644 --- a/source/dub/generators/visuald.d +++ b/source/dub/generators/visuald.d @@ -62,7 +62,13 @@ Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010"); - generateSolutionEntries(ret, m_app.mainPackage()); + generateSolutionEntry(ret, m_app.mainPackage); + version(VISUALD_SEPERATE_PROJECT_FILES) + { + performOnDependencies(m_app.mainPackage, (pack){ + generateSolutionEntry(ret, pack); + }); + } // Global section contains configurations ret.formattedWrite(" @@ -91,17 +97,7 @@ sln.write(ret.data()); sln.flush(); } - - void generateSolutionEntries(Appender!(char[]) ret, const Package main) { - generateSolutionEntry(ret, main); - version(VISUALD_SEPERATE_PROJECT_FILES) { - performOnDependencies(main, (const Package pack) { generateSolutionEntries(ret, pack); } ); - } - version(VISUALD_SINGLE_PROJECT_FILE) { - enforce(main == m_app.mainPackage()); - } - } - + void generateSolutionEntry(Appender!(char[]) ret, const Package pack) { auto projUuid = generateUUID(); auto projName = pack.name; @@ -153,7 +149,7 @@ performOnDependencies(main, (const Package dependency) { if(dependency.name in generatedProjects) return; - generateProjects(dependency, buildPlatform); + generateProj(dependency, buildPlatform); } ); } } @@ -175,9 +171,15 @@ // Add all files bool[SourceFile] sourceFiles; void gatherSources(const(Package) pack, bool prefixPkgId) { - logTrace("Gathering sources for %s", pack.name); + logTrace("Gathering sources for %s (%s)", pack.name, pack is m_app.mainPackage); foreach(source; pack.sources) { - SourceFile f = { pack.name, prefixPkgId? Path(pack.name)~source : source, pack.path ~ source }; + if( pack !is m_app.mainPackage && source == Path("source/app.d") ) + continue; + SourceFile f = { + pack.name, + prefixPkgId ? Path(pack.name)~source : source, + (pack.path ~ source).relativeTo(m_app.mainPackage.path) + }; sourceFiles[f] = true; logTrace(" pkg file: %s", source); } @@ -186,16 +188,8 @@ version(VISUALD_SINGLE_PROJECT_FILE) { // gather all sources enforce(pack == m_app.mainPackage(), "Some setup has gone wrong in VisualD.generateProj()"); - bool[string] gathered; - void gatherAll(const Package package_) { - logDebug("Looking at %s", package_.name); - if(package_.name in gathered) - return; - gathered[package_.name] = true; - gatherSources(package_, true); - performOnDependencies(package_, (const Package dependency) { gatherAll(dependency); }); - } - gatherAll(pack); + gatherSources(pack, true); + performOnDependencies(pack, (dependency) { gatherSources(dependency, true); }); } version(VISUALD_SEPERATE_PROJECT_FILES) { // gather sources for this package only @@ -207,7 +201,7 @@ Path lastFolder; foreach(source; sortedSources(sourceFiles.keys)) { logTrace("source looking at %s", source.structurePath); - auto cur = source.structurePath[0..$-1]; + auto cur = source.structurePath[0 .. source.structurePath.length-1]; if(lastFolder != cur) { size_t same = 0; foreach(idx; 0..min(lastFolder.length, cur.length)) @@ -380,18 +374,24 @@ } void performOnDependencies(const Package main, void delegate(const Package pack) op) { - // TODO: cyclic check - - foreach(id, dependency; main.dependencies) { - logDebug("Retrieving package %s from package manager.", id); - auto pack = m_pkgMgr.getBestPackage(id, dependency); - if(pack is null) { - logWarn("Package %s (%s) could not be retrieved continuing...", id, to!string(dependency)); - continue; + bool[const(Package)] visited; + void perform_rec(const Package parent_pack){ + foreach(id, dependency; parent_pack.dependencies){ + logDebug("Retrieving package %s from package manager.", id); + auto pack = m_pkgMgr.getBestPackage(id, dependency); + if( pack in visited ) continue; + visited[pack] = true; + if(pack is null) { + logWarn("Package %s (%s) could not be retrieved continuing...", id, to!string(dependency)); + continue; + } + logDebug("Performing on retrieved package %s", pack.name); + op(pack); + perform_rec(pack); } - logDebug("Performing on retrieved package %s", pack.name); - op(pack); } + + perform_rec(main); } string generateUUID() const {