| #!/usr/bin/env dub | |
| /++dub.sdl: | |
| name "gen_druntime_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", | |
| "./gcc/config.d.in", "./gcc/libbacktrace.d.in", "./gcc/drtstuff.c", | |
| "./LICENSE.txt", "./MERGE", | |
| "./rt/dylib_fixes.c" | |
| ]; | |
| struct Files | |
| { | |
| string[] baseList, cppList; | |
| string[][string] sysList; | |
| } | |
| void main(string[] args) | |
| { | |
| Files[string] fileMap; | |
| foreach(entry; ".".dirEntries(SpanMode.depth).filter!(a => !filterList.canFind(a))) | |
| { | |
| if (entry.name.startsWith("./config/")) | |
| continue; | |
| 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("./core/stdcpp/")) | |
| fileMap[ext].cppList ~= sentry; | |
| else if(entry.name.startsWith("./core/sys/")) | |
| { | |
| auto components = entry.pathSplitter; | |
| components.popFrontN(3); | |
| fileMap[ext].sysList[components.front] ~= sentry; | |
| } | |
| else | |
| fileMap[ext].baseList ~= sentry; | |
| } | |
| } | |
| foreach(extEntry; fileMap.byKeyValue.array.sort!"a.key < b.key") | |
| { | |
| auto ext = extEntry.key; | |
| auto value = extEntry.value; | |
| writeList("DRUNTIME_" ~ ext.toUpper() ~ "SOURCES", value.baseList); | |
| writeList("DRUNTIME_" ~ ext.toUpper() ~ "SOURCES_STDCXX", value.cppList); | |
| foreach(entry; value.sysList.byKeyValue.array.sort!"a.key < b.key") | |
| { | |
| writeList("DRUNTIME_" ~ ext.toUpper() ~ "SOURCES_" ~ entry.key.toUpper(), entry.value); | |
| } | |
| } | |
| } | |
| 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(); | |
| } |