diff --git a/build-files.txt b/build-files.txt index 62e5f54..64b9fe6 100644 --- a/build-files.txt +++ b/build-files.txt @@ -15,7 +15,6 @@ source/dub/compilers/ldc.d source/dub/generators/build.d source/dub/generators/generator.d -source/dub/generators/monod.d source/dub/generators/visuald.d source/dub/internal/utils.d source/dub/internal/vibecompat/core/file.d diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 3d3405a..13d4aee 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -9,7 +9,6 @@ import dub.compilers.compiler; import dub.generators.build; -import dub.generators.monod; import dub.generators.visuald; import dub.internal.vibecompat.core.file; import dub.internal.vibecompat.core.log; @@ -103,7 +102,17 @@ auto dep = m_project.getDependency(depname, depspec.optional); if (!dep) continue; - buildsettings.add(collect(settings, dep, targets, configs, main_files)); + auto depbs = collect(settings, dep, targets, configs, main_files); + + if (depbs.targetType != TargetType.sourceLibrary && depbs.targetType != TargetType.none) { + // add a reference to the target binary and remove all source files in the dependency build settings + depbs.sourceFiles = depbs.sourceFiles.filter!(f => f.isLinkerFile()).array; + auto target = Path(depbs.targetPath) ~ getTargetFileName(depbs, settings.platform); + if (!target.absolute) target = pack.path ~ target; + depbs.prependSourceFiles(target.toNativeString()); + } + + buildsettings.add(depbs); if (depname in targets) targets[pack.name].dependencies ~= dep.name; @@ -115,12 +124,6 @@ settings.compiler.extractBuildOptions(buildsettings); targets[pack.name].buildSettings = buildsettings.dup; - // add a reference to the target binary and remove all source files in the dependency build settings - buildsettings.sourceFiles = buildsettings.sourceFiles.filter!(f => f.isLinkerFile()).array; - auto target = Path(buildsettings.targetPath) ~ getTargetFileName(buildsettings, settings.platform); - if (!target.absolute) target = pack.path ~ target; - buildsettings.prependSourceFiles(target.toNativeString()); - logInfo("TARGET %s %s", buildsettings.targetPath, buildsettings.targetName); } @@ -171,8 +174,7 @@ logDebug("Creating build generator."); return new BuildGenerator(app, mgr); case "mono-d": - logDebug("Creating MonoD generator."); - return new MonoDGenerator(app, mgr); + throw new Exception("The Mono-D generator has been removed. Use Mono-D's built in DUB support instead."); case "visuald": logDebug("Creating VisualD generator."); return new VisualDGenerator(app, mgr, false); diff --git a/source/dub/generators/monod.d b/source/dub/generators/monod.d deleted file mode 100644 index 6fcd953..0000000 --- a/source/dub/generators/monod.d +++ /dev/null @@ -1,309 +0,0 @@ -/** - Generator for MonoD project files - - Copyright: © 2013-2013 rejectedsoftware e.K. - License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. - Authors: Sönke Ludwig -*/ -module dub.generators.monod; - -import dub.compilers.compiler; -import dub.generators.generator; -import dub.internal.utils; -import dub.internal.vibecompat.core.file; -import dub.internal.vibecompat.core.log; -import dub.package_; -import dub.packagemanager; -import dub.project; - -import std.algorithm; -import std.array; -import std.conv; -import std.format; -import std.uuid; -import std.exception; - - -// TODO: handle pre/post build commands - -class MonoDGenerator : ProjectGenerator { - private { - PackageManager m_pkgMgr; - string[string] m_projectUuids; - bool m_singleProject = true; - Config[] m_allConfigs; - } - - this(Project app, PackageManager mgr) - { - super(app); - m_pkgMgr = mgr; - m_allConfigs ~= Config("Debug", "AnyCPU", "Any CPU"); - } - - override void generateTargets(GeneratorSettings settings, in TargetInfo[string] targets) { assert(false); } - - override void generate(GeneratorSettings settings) - { - logWarn("Note that the latest Mono-D has direct support for building DUB projects. It is recommended to directly open package.json instead of generating a Mono-D project."); - - auto buildsettings = settings.buildSettings; - m_project.addBuildSettings(buildsettings, settings.platform, settings.config); - - prepareGeneration(buildsettings); - - logDebug("About to generate projects for %s, with %s direct dependencies.", m_project.mainPackage().name, m_project.mainPackage().dependencies().length); - generateProjects(m_project.mainPackage(), settings); - generateSolution(settings); - - finalizeGeneration(buildsettings, true); - } - - private void generateSolution(GeneratorSettings settings) - { - auto sln = openFile(m_project.mainPackage().name ~ ".sln", FileMode.CreateTrunc); - scope(exit) sln.close(); - - // Writing solution file - logDebug("About to write to .sln file."); - - // Solution header - sln.put('\n'); - sln.put("Microsoft Visual Studio Solution File, Format Version 11.00\n"); - sln.put("# Visual Studio 2010\n"); - - generateSolutionEntry(sln, settings, m_project.mainPackage); - if( !m_singleProject ) - performOnDependencies(m_project.mainPackage, pack => generateSolutionEntry(sln, settings, pack)); - - sln.put("Global\n"); - - // configuration platforms - sln.put("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n"); - foreach(config; m_allConfigs) - sln.formattedWrite("\t\t%s|%s = %s|%s\n", config.configName, config.platformName2, - config.configName, config.platformName2); - sln.put("\tEndGlobalSection\n"); - - // configuration platforms per project - sln.put("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n"); - auto projectUuid = guid(m_project.mainPackage.name); - foreach(config; m_allConfigs) - foreach(s; ["ActiveCfg", "Build.0"]) - sln.formattedWrite("\t\t%s.%s|%s.%s = %s|%s\n", - projectUuid, config.configName, config.platformName2, s, - config.configName, config.platformName2); - // TODO: for all dependencies - sln.put("\tEndGlobalSection\n"); - - // solution properties - sln.put("\tGlobalSection(SolutionProperties) = preSolution\n"); - sln.put("\t\tHideSolutionNode = FALSE\n"); - sln.put("\tEndGlobalSection\n"); - - // monodevelop properties - sln.put("\tGlobalSection(MonoDevelopProperties) = preSolution\n"); - sln.formattedWrite("\t\tStartupItem = %s\n", "monodtest/monodtest.dproj"); - sln.put("\tEndGlobalSection\n"); - - sln.put("EndGlobal\n"); - } - - private void generateSolutionEntry(RangeFile ret, GeneratorSettings settings, const Package pack) - { - auto projUuid = generateUUID(); - auto projName = pack.name; - auto projPath = pack.name ~ ".dproj"; - auto projectUuid = guid(projName); - - // Write project header, like so - // Project("{002A2DE9-8BB6-484D-9802-7E4AD4084715}") = "derelict", "..\inbase\source\derelict.visualdproj", "{905EF5DA-649E-45F9-9C15-6630AA815ACB}" - ret.formattedWrite("Project(\"%s\") = \"%s\", \"%s\", \"%s\"\n", - projUuid, projName, projPath, projectUuid); - - if( !m_singleProject ){ - if(pack.dependencies.length > 0) { - ret.put(" ProjectSection(ProjectDependencies) = postProject\n"); - foreach(id, dependency; pack.dependencies) { - // TODO: clarify what "uuid = uuid" should mean - auto uuid = guid(id); - ret.formattedWrite(" %s = %s\n", uuid, uuid); - } - ret.put(" EndProjectSection\n"); - } - } - - ret.put("EndProject\n"); - } - - private void generateProjects(in Package pack, GeneratorSettings settings) - { - bool[const(Package)] visited; - - void generateRec(in Package p){ - if( p in visited ) return; - visited[p] = true; - - generateProject(p, settings); - - if( !m_singleProject ) - performOnDependencies(p, &generateRec); - } - generateRec(pack); - } - - private void generateProject(in Package pack, GeneratorSettings settings) - { - logDebug("About to write to '%s.dproj' file", pack.name); - auto sln = openFile(pack.name ~ ".dproj", FileMode.CreateTrunc); - scope(exit) sln.close(); - - sln.put("\n"); - sln.put("\n"); - // TODO: property groups - - auto projName = pack.name; - - auto buildsettings = settings.buildSettings; - m_project.addBuildSettings(buildsettings, settings.platform, m_project.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"); - sln.put(" AnyCPU\n"); - sln.put(" 10.0.0\n"); - sln.put(" 2.0\n"); - sln.formattedWrite(" %s\n", guid(pack.name)); - sln.put(" True\n"); - sln.put(" True\n"); - sln.put(" True\n"); - sln.put(" DMD2\n"); - if( !buildsettings.versions.empty ){ - sln.put(" \n"); - sln.put(" \n"); - foreach(ver; buildsettings.versions) - sln.formattedWrite(" %s\n", ver); - sln.put(" \n"); - sln.put(" \n"); - } - if( !buildsettings.importPaths.empty ){ - sln.put(" \n"); - sln.put(" \n"); - foreach(dir; buildsettings.importPaths) - sln.formattedWrite(" %s\n", dir); - sln.put(" \n"); - sln.put(" \n"); - } - if( !buildsettings.libs.empty ){ - sln.put(" \n"); - sln.put(" \n"); - foreach(dir; buildsettings.libs) - sln.formattedWrite(" %s\n", settings.platform.platform.canFind("windows") ? dir ~ ".lib" : dir); - sln.put(" \n"); - sln.put(" \n"); - } - sln.formattedWrite(" %s\n", buildsettings.dflags.join(" ")); - sln.formattedWrite(" %s\n", buildsettings.lflags.join(" ")); - sln.put(" \n"); - - void generateProperties(Config config) - { - sln.formattedWrite(" \n", - config.configName, config.platformName); - - sln.put(" True\n"); - auto outpath = Path(buildsettings.targetPath).toNativeString(); - sln.formattedWrite(" %s\n", outpath.length ? outpath : "."); - sln.put(" True\n"); - sln.put(" Executable\n"); - sln.formattedWrite(" %s\n", buildsettings.targetName); - sln.put(" False\n"); - sln.formattedWrite(" %s\n", (Path("obj/")~config.configName).toNativeString()); - sln.put(" 0\n"); - sln.put(" \n"); - } - - foreach(config; m_allConfigs) - generateProperties(config); - - - bool[const(Package)] visited; - void generateSourceEntry(Path path, Path base_path, bool compile = true) - { - auto rel_path = path.relativeTo(pack.path); - rel_path.normalize(); - - Path pretty_path; - foreach (i; 0 .. rel_path.length) - if (rel_path[i] != "..") { - pretty_path = rel_path[i .. $]; - break; - } - string kind = compile ? "Compile" : "None"; - - if (base_path == pretty_path) { - sln.formattedWrite(" <%s Include=\"%s\" />\n", kind, rel_path.toNativeString()); - } else { - sln.formattedWrite(" <%s Include=\"%s\">\n", kind, rel_path.toNativeString()); - sln.formattedWrite(" %s\n", pretty_path.toNativeString()); - sln.formattedWrite(" \n", kind); - } - } - - sln.put(" \n"); - // add source files - foreach (s; buildsettings.sourceFiles) { - auto sp = Path(s); - if (!sp.absolute) sp = pack.path ~ sp; - generateSourceEntry(sp, pack.path); - } - // TODO: add all files in stringImportFolders - // add package.json files - foreach (p; m_project.getTopologicalPackageList()) - generateSourceEntry(p.packageInfoFile, pack.path, false); - sln.put(" \n"); - sln.put(""); - } - - void performOnDependencies(const Package main, void delegate(const Package pack) op) - { - bool[const(Package)] visited; - void perform_rec(const Package parent_pack){ - foreach(id, dependency; parent_pack.dependencies){ - logDiagnostic("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; - } - logDiagnostic("Performing on retrieved package %s", pack.name); - op(pack); - perform_rec(pack); - } - } - - perform_rec(main); - } - - string generateUUID() - const { - return "{" ~ randomUUID().toString() ~ "}"; - } - - string guid(string projectName) - { - if(projectName !in m_projectUuids) - m_projectUuids[projectName] = generateUUID(); - return m_projectUuids[projectName]; - } -} - -struct Config { - string configName; - string platformName; - string platformName2; -} \ No newline at end of file