diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 4d1b44e..bb33973 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -489,6 +489,7 @@ "Generates project files using one of the supported generators:", "", "visuald - VisualD project files", + "sublimetext - SublimeText project file", "build - Builds the package directly", "", "An optional package name can be given to generate a different package than the root/CWD package." diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 533a1c4..d20b305 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -9,6 +9,7 @@ import dub.compilers.compiler; import dub.generators.build; +import dub.generators.sublimetext; import dub.generators.visuald; import dub.internal.vibecompat.core.file; import dub.internal.vibecompat.core.log; @@ -302,6 +303,9 @@ case "visuald": logDebug("Creating VisualD generator."); return new VisualDGenerator(project); + case "sublimetext": + logDebug("Creating SublimeText generator."); + return new SublimeTextGenerator(project); } } diff --git a/source/dub/generators/sublimetext.d b/source/dub/generators/sublimetext.d new file mode 100644 index 0000000..c39ea6f --- /dev/null +++ b/source/dub/generators/sublimetext.d @@ -0,0 +1,90 @@ +/** +Generator for SublimeText project files + +Copyright: © 2014 Nicholas Londey +License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. +Authors: Nicholas Londey +*/ +module dub.generators.sublimetext; + +import dub.compilers.compiler; +import dub.generators.generator; +import dub.internal.vibecompat.core.log; +import dub.internal.vibecompat.data.json; +import dub.packagemanager; +import dub.project; + +import std.algorithm; +import std.array; +import std.compiler; +import std.file; +import std.path; +import std.range; +import std.string; + + +class SublimeTextGenerator : ProjectGenerator { + + this(Project project) + { + super(project); + } + + override void generateTargets(GeneratorSettings settings, in TargetInfo[string] targets) + { + auto buildSettings = targets[m_project.name].buildSettings; + logDebug("About to generate sublime project for %s.", m_project.rootPackage.name); + + auto root = Json([ + "folders": targets.byValue.map!sourceFolderJson.joiner.array.Json, + "build_systems": buildSystems(settings.platform), + ]); + + auto jsonString = appender!string(); + writePrettyJsonString(jsonString, root); + + write(m_project.name ~ ".sublime-project", jsonString.data); + + logInfo("SublimeText project generated."); + } +} + + +Json[] sourceFolderJson(in ProjectGenerator.TargetInfo target) +{ + Json createFolderPath(string path) + { + return Json([ + "path": path.Json, + "name": (target.pack.name ~ "/" ~ path.baseName).Json, + "follow_symlinks": true.Json, + ]); + } + + auto allImportPaths = chain(target.buildSettings.importPaths, target.buildSettings.stringImportPaths); + return allImportPaths.map!createFolderPath.array; +} + + +Json buildSystems(BuildPlatform buildPlatform, string workingDiretory = getcwd()) +{ + Json makeBuildSystem(string operation) + { + auto arch = buildPlatform.architecture[0]; + return Json([ + "name": "DUB " ~ operation.capitalize ~ " " ~ arch.Json, + "cmd": ["dub", operation.toLower, "--arch=" ~ arch].map!Json.array.Json, + "working_dir": workingDiretory.Json, + ]); + } + + return ["run", "build", "test"].map!makeBuildSystem.array.Json; +} + +unittest +{ + auto buildPlatform = BuildPlatform(); + buildPlatform.architecture ~= "x86_64"; + + auto result = buildPlatform.buildSystems.toString; +}