#!/usr/bin/env dub /++dub.sdl: name "gen_phobos_sources" +/ // Written in the D programming language. import std.stdio; import std.file; import std.path; import std.range; import std.string; import std.algorithm; string[] filterList = [ "./Makefile.in", "./Makefile.am", "./index.dd", "./libgphobos.spec.in", "./drtstuff.spec", "./LICENSE_1_0.txt", "./MERGE", "./std/experimental/note.md" ]; struct Files { string[] baseList; string[][string] sysList; } void main(string[] args) { Files[string] fileMap; foreach (entry; "." .dirEntries(SpanMode.depth) .filter!(a => !filterList.canFind(a))) { if (entry.isFile) { auto ext = entry.extension.empty ? "" : entry.extension[1 .. $]; if (!(ext in fileMap)) fileMap[ext] = Files.init; string sentry = entry[2 .. $]; if (entry.name.startsWith("./std/c/")) { if (entry.dirName == "./std/c") { fileMap[ext].sysList["stdc"] ~= sentry; } else { auto components = entry.pathSplitter; components.popFrontN(3); fileMap[ext].sysList[components.front] ~= sentry; } } else fileMap[ext].baseList ~= sentry; } } writeln("if ENABLE_LIBDRUNTIME_ONLY"); foreach (extEntry; fileMap.byKeyValue.array.sort!"a.key < b.key") { auto ext = extEntry.key; auto value = extEntry.value; writeList("PHOBOS_" ~ ext.toUpper() ~ "SOURCES", [], !value.baseList.empty); foreach (entry; value.sysList.byKeyValue.array.sort!"a.key < b.key") { string name = "PHOBOS_" ~ ext.toUpper() ~ "SOURCES_" ~ entry.key.toUpper(); writeList(name, [], !entry.value.empty); } } writeln(); writeln("else"); foreach (extEntry; fileMap.byKeyValue.array.sort!"a.key < b.key") { auto ext = extEntry.key; auto value = extEntry.value; writeList("PHOBOS_" ~ ext.toUpper() ~ "SOURCES", value.baseList); foreach (entry; value.sysList.byKeyValue.array.sort!"a.key < b.key") { string name = "PHOBOS_" ~ ext.toUpper() ~ "SOURCES_" ~ entry.key.toUpper(); writeList(name, entry.value); } } writeln(); writeln("endif"); } void writeList(string name, string[] values, bool force = false) { if (!force && values.empty) return; values = sort(values).array(); writeln(); writef("%s =", name); size_t line = name.length + 3; foreach (entry; values) { if (line + entry.length > 70) { line = 0; writeln(` \`); write('\t'); } else write(" "); write(entry); line += entry.length + 1; } writeln(); }