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 {