| #!/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(); |
| } |