xref: /aosp_15_r20/external/cpu_features/scripts/generate_badges.d (revision eca53ba6d2e951e174b64682eaf56a36b8204c89)
1*eca53ba6SRoland Levillain #!/usr/bin/env -S docker run --rm -v ${PWD}/scripts:/scripts -v ${PWD}/.github/workflows:/.github/workflows dlanguage/dmd dmd -run /scripts/generate_badges.d
2*eca53ba6SRoland Levillain 
3*eca53ba6SRoland Levillain // To run this script:
4*eca53ba6SRoland Levillain // cd /path/to/cpu_features
5*eca53ba6SRoland Levillain // ./scripts/generate_badges.d
6*eca53ba6SRoland Levillain 
7*eca53ba6SRoland Levillain import std.algorithm : each, map, cartesianProduct, filter, joiner, sort, uniq;
8*eca53ba6SRoland Levillain import std.array;
9*eca53ba6SRoland Levillain import std.base64 : Base64;
10*eca53ba6SRoland Levillain import std.conv : to;
11*eca53ba6SRoland Levillain import std.file : exists;
12*eca53ba6SRoland Levillain import std.format;
13*eca53ba6SRoland Levillain import std.range : chain, only;
14*eca53ba6SRoland Levillain import std.stdio;
15*eca53ba6SRoland Levillain import std.string : representation;
16*eca53ba6SRoland Levillain import std.traits : EnumMembers;
17*eca53ba6SRoland Levillain 
18*eca53ba6SRoland Levillain immutable string bazel_svg = `<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 .16l5.786 5.786L6 11.732.214 5.946 6 .161zM0 6.214V12l5.786 5.786V12L0 6.214zM18 .16l5.786 5.786L18 11.732l-5.786-5.786L18 .161zM24 6.214V12l-5.786 5.786V12L24 6.214zM12 6.16l5.786 5.786L12 17.732l-5.786-5.786L12 6.161zM11.84 18.054v5.785l-5.786-5.785v-5.786l5.785 5.786zM12.16 18.054l5.786-5.786v5.786l-5.785 5.785v-5.785z" stroke="transparent" fill="white"/></svg>`;
19*eca53ba6SRoland Levillain const string bazel_svg_base64 = Base64.encode(representation(bazel_svg));
20*eca53ba6SRoland Levillain 
21*eca53ba6SRoland Levillain enum BuildSystem
22*eca53ba6SRoland Levillain {
23*eca53ba6SRoland Levillain     CMake,
24*eca53ba6SRoland Levillain     Bazel
25*eca53ba6SRoland Levillain }
26*eca53ba6SRoland Levillain 
27*eca53ba6SRoland Levillain enum Cpu
28*eca53ba6SRoland Levillain {
29*eca53ba6SRoland Levillain     amd64,
30*eca53ba6SRoland Levillain     AArch64,
31*eca53ba6SRoland Levillain     ARM,
32*eca53ba6SRoland Levillain     MIPS,
33*eca53ba6SRoland Levillain     POWER,
34*eca53ba6SRoland Levillain     RISCV,
35*eca53ba6SRoland Levillain     LOONGARCH,
36*eca53ba6SRoland Levillain     s390x,
37*eca53ba6SRoland Levillain }
38*eca53ba6SRoland Levillain 
39*eca53ba6SRoland Levillain enum Os
40*eca53ba6SRoland Levillain {
41*eca53ba6SRoland Levillain     Linux,
42*eca53ba6SRoland Levillain     FreeBSD,
43*eca53ba6SRoland Levillain     MacOS,
44*eca53ba6SRoland Levillain     Windows,
45*eca53ba6SRoland Levillain }
46*eca53ba6SRoland Levillain 
47*eca53ba6SRoland Levillain struct Badge
48*eca53ba6SRoland Levillain {
49*eca53ba6SRoland Levillain const:
50*eca53ba6SRoland Levillain 
51*eca53ba6SRoland Levillain     Cpu cpu;
52*eca53ba6SRoland Levillain     Os os;
53*eca53ba6SRoland Levillain     BuildSystem build_system;
54*eca53ba6SRoland Levillain 
55*eca53ba6SRoland Levillain private:
id()56*eca53ba6SRoland Levillain     string id()
57*eca53ba6SRoland Levillain     {
58*eca53ba6SRoland Levillain         return format("%d%c%d", cast(uint)(os) + 1, cast(char)('a' + cpu),
59*eca53ba6SRoland Levillain             cast(uint)(build_system));
60*eca53ba6SRoland Levillain     }
61*eca53ba6SRoland Levillain 
link_ref()62*eca53ba6SRoland Levillain     string link_ref()
63*eca53ba6SRoland Levillain     {
64*eca53ba6SRoland Levillain         return format("[l%s]", id());
65*eca53ba6SRoland Levillain     }
66*eca53ba6SRoland Levillain 
image_ref()67*eca53ba6SRoland Levillain     string image_ref()
68*eca53ba6SRoland Levillain     {
69*eca53ba6SRoland Levillain         return format("[i%s]", id());
70*eca53ba6SRoland Levillain     }
71*eca53ba6SRoland Levillain 
filename()72*eca53ba6SRoland Levillain     string filename()
73*eca53ba6SRoland Levillain     {
74*eca53ba6SRoland Levillain         import std.uni : toLower;
75*eca53ba6SRoland Levillain 
76*eca53ba6SRoland Levillain         return toLower(format("%s_%s_%s.yml", cpu, os, build_system));
77*eca53ba6SRoland Levillain     }
78*eca53ba6SRoland Levillain 
enabled()79*eca53ba6SRoland Levillain     bool enabled()
80*eca53ba6SRoland Levillain     {
81*eca53ba6SRoland Levillain         return exists("../.github/workflows/" ~ filename());
82*eca53ba6SRoland Levillain     }
83*eca53ba6SRoland Levillain 
append_logo(string url)84*eca53ba6SRoland Levillain     string append_logo(string url)
85*eca53ba6SRoland Levillain     {
86*eca53ba6SRoland Levillain         final switch (build_system)
87*eca53ba6SRoland Levillain         {
88*eca53ba6SRoland Levillain         case BuildSystem.CMake:
89*eca53ba6SRoland Levillain             return url ~ "&logo=cmake";
90*eca53ba6SRoland Levillain         case BuildSystem.Bazel:
91*eca53ba6SRoland Levillain             return url ~ "&logo=data:image/svg%2bxml;base64," ~ bazel_svg_base64;
92*eca53ba6SRoland Levillain         }
93*eca53ba6SRoland Levillain     }
94*eca53ba6SRoland Levillain 
95*eca53ba6SRoland Levillain public:
96*eca53ba6SRoland Levillain 
disabled_image_ref()97*eca53ba6SRoland Levillain     string disabled_image_ref()
98*eca53ba6SRoland Levillain     {
99*eca53ba6SRoland Levillain         return format("[d%d]", cast(uint)(build_system));
100*eca53ba6SRoland Levillain     }
101*eca53ba6SRoland Levillain 
text()102*eca53ba6SRoland Levillain     string text()
103*eca53ba6SRoland Levillain     {
104*eca53ba6SRoland Levillain         if (enabled())
105*eca53ba6SRoland Levillain             return format("[![%s]%s]%s", build_system, image_ref, link_ref);
106*eca53ba6SRoland Levillain         return format("![%s]%s", build_system, disabled_image_ref);
107*eca53ba6SRoland Levillain     }
108*eca53ba6SRoland Levillain 
disabled_image_link()109*eca53ba6SRoland Levillain     string disabled_image_link()
110*eca53ba6SRoland Levillain     {
111*eca53ba6SRoland Levillain         return append_logo(format("%s: https://img.shields.io/badge/n%%2Fa-lightgrey?",
112*eca53ba6SRoland Levillain                 disabled_image_ref));
113*eca53ba6SRoland Levillain     }
114*eca53ba6SRoland Levillain 
link_decl()115*eca53ba6SRoland Levillain     string link_decl()
116*eca53ba6SRoland Levillain     {
117*eca53ba6SRoland Levillain         return format("%s: https://github.com/google/cpu_features/actions/workflows/%s",
118*eca53ba6SRoland Levillain             link_ref, filename());
119*eca53ba6SRoland Levillain     }
120*eca53ba6SRoland Levillain 
image_decl()121*eca53ba6SRoland Levillain     string image_decl()
122*eca53ba6SRoland Levillain     {
123*eca53ba6SRoland Levillain         return append_logo(format("%s: https://img.shields.io/github/actions/workflow/status/google/cpu_features/%s?branch=main&event=push&label=",
124*eca53ba6SRoland Levillain                 image_ref, filename()));
125*eca53ba6SRoland Levillain     }
126*eca53ba6SRoland Levillain 
127*eca53ba6SRoland Levillain }
128*eca53ba6SRoland Levillain 
tableHeader(in Os[]oses)129*eca53ba6SRoland Levillain auto tableHeader(in Os[] oses)
130*eca53ba6SRoland Levillain {
131*eca53ba6SRoland Levillain     return chain(only(""), oses.map!(to!string)).array;
132*eca53ba6SRoland Levillain }
133*eca53ba6SRoland Levillain 
tableAlignment(in Os[]oses)134*eca53ba6SRoland Levillain auto tableAlignment(in Os[] oses)
135*eca53ba6SRoland Levillain {
136*eca53ba6SRoland Levillain     return chain(only(":--"), oses.map!(v => "--:")).array;
137*eca53ba6SRoland Levillain }
138*eca53ba6SRoland Levillain 
tableCell(Range)139*eca53ba6SRoland Levillain auto tableCell(Range)(in Os os, in Cpu cpu, Range badges)
140*eca53ba6SRoland Levillain {
141*eca53ba6SRoland Levillain     return badges.filter!(b => b.cpu == cpu && b.os == os)
142*eca53ba6SRoland Levillain         .map!(b => b.text())
143*eca53ba6SRoland Levillain         .joiner("<br/>").to!string;
144*eca53ba6SRoland Levillain }
145*eca53ba6SRoland Levillain 
tableRow(Range)146*eca53ba6SRoland Levillain auto tableRow(Range)(in Cpu cpu, in Os[] oses, Range badges)
147*eca53ba6SRoland Levillain {
148*eca53ba6SRoland Levillain     return chain(only(cpu.to!string), oses.map!(os => tableCell(os, cpu, badges))).array;
149*eca53ba6SRoland Levillain }
150*eca53ba6SRoland Levillain 
tableRows(Range)151*eca53ba6SRoland Levillain auto tableRows(Range)(in Os[] oses, in Cpu[] cpus, Range badges)
152*eca53ba6SRoland Levillain {
153*eca53ba6SRoland Levillain     return cpus.map!(cpu => tableRow(cpu, oses, badges)).array;
154*eca53ba6SRoland Levillain }
155*eca53ba6SRoland Levillain 
table(Range)156*eca53ba6SRoland Levillain auto table(Range)(in Os[] oses, in Cpu[] cpus, Range badges)
157*eca53ba6SRoland Levillain {
158*eca53ba6SRoland Levillain     return chain(only(tableHeader(oses)), only(tableAlignment(oses)),
159*eca53ba6SRoland Levillain         tableRows(oses, cpus, badges));
160*eca53ba6SRoland Levillain }
161*eca53ba6SRoland Levillain 
main()162*eca53ba6SRoland Levillain void main()
163*eca53ba6SRoland Levillain {
164*eca53ba6SRoland Levillain     immutable allCpus = [EnumMembers!Cpu];
165*eca53ba6SRoland Levillain     immutable allOses = [EnumMembers!Os];
166*eca53ba6SRoland Levillain     immutable allBuildSystems = [EnumMembers!BuildSystem];
167*eca53ba6SRoland Levillain     auto badges = cartesianProduct(allCpus, allOses, allBuildSystems).map!(
168*eca53ba6SRoland Levillain         t => Badge(t[0], t[1], t[2]));
169*eca53ba6SRoland Levillain     writefln("%(|%-( %s |%) |\n%) |", table(allOses, allCpus, badges));
170*eca53ba6SRoland Levillain     writeln();
171*eca53ba6SRoland Levillain     badges.filter!(b => !b.enabled)
172*eca53ba6SRoland Levillain         .map!(b => b.disabled_image_link())
173*eca53ba6SRoland Levillain         .array
174*eca53ba6SRoland Levillain         .sort
175*eca53ba6SRoland Levillain         .uniq
176*eca53ba6SRoland Levillain         .each!writeln;
177*eca53ba6SRoland Levillain     badges.filter!(b => b.enabled)
178*eca53ba6SRoland Levillain         .map!(b => [b.link_decl(), b.image_decl()])
179*eca53ba6SRoland Levillain         .joiner().array.sort.uniq.each!writeln;
180*eca53ba6SRoland Levillain }
181