@@ -18,12 +18,24 @@ interface
1818 TBuilder = class (TObject)
1919 private
2020 FConfig: TConfig;
21+ FScriptStream: TFileStream;
22+ FScriptFile: String;
23+
24+ function GenerateProgressBar (APBPosition, APBMax, APBWIdth: Integer): String;
2125 protected
2226 public
2327 constructor Create(AConfigFile: String);
2428 destructor Destroy; override;
2529
30+ { $IFDEF UNIX}
2631 procedure BuildCompileScriptBash ;
32+ procedure BuildTestScriptBash ;
33+ procedure BuildRunScriptBash ;
34+ { $ELSE}
35+ procedure BuildCompileScriptPowerShell ;
36+ procedure BuildTestScriptPowerShell ;
37+ procedure BuildRunScriptPowerShell ;
38+ { $ENDIF}
2739 published
2840 end ;
2941
@@ -38,6 +50,20 @@ implementation
3850 { $ENDIF}
3951;
4052
53+ const
54+ lineBreak = #13 ;
55+ cCompileBash = ' compile_all.sh' ;
56+ cTestBash = ' test_all.sh' ;
57+ cRunBash = ' run_all.sh' ;
58+
59+ cReplaceName = ' [[name]]' ;
60+ cReplaceJSONResults = ' [[results-json]]' ;
61+ cReplaceEntryBinary = ' [[entry-binary]]' ;
62+ cReplaceEntryInput = ' [[input]]' ;
63+ cReplaceEntryThreads = ' [[threads]]' ;
64+
65+ cOfficialOutputHash = ' 0000000000000000000000000000000000000000000000000000000000000000' ;
66+
4167{ TBuilder }
4268
4369constructor TBuilder.Create(AConfigFile: String);
@@ -62,19 +88,32 @@ destructor TBuilder.Destroy;
6288 inherited Destroy;
6389end ;
6490
91+ function TBuilder.GenerateProgressBar (APBPosition, APBMax, APBWIdth: Integer
92+ ): String;
93+ var
94+ percentDone: Double;
95+ filled: Integer;
96+ begin
97+ percentDone := 100 * (APBPosition / APBMax);
98+ filled := trunc(APBWIdth * (percentDone / 100 ));
99+ Result := ' [' ;
100+ Result := Result + StringOfChar(' #' , filled);
101+ Result := Result + StringOfChar(' -' , APBWIdth - filled);
102+ Result := Result + Format(' ] %5.2f %%' , [percentDone]);
103+ end ;
104+
65105procedure TBuilder.BuildCompileScriptBash ;
66106var
67- scriptStream: TFileStream;
68107 index: Integer;
69- scriptFile, line: String;
108+ line: String;
70109begin
71- scriptFile := IncludeTrailingPathDelimiter(FConfig.RootFolder) + ' compile_all.sh ' ;
72- scriptStream := TFileStream.Create(scriptFile , fmCreate);
110+ FScriptFile := IncludeTrailingPathDelimiter(FConfig.RootFolder) + cCompileBash ;
111+ FScriptStream := TFileStream.Create(FScriptFile , fmCreate);
73112 try
74- line:= ' #!/bin/bash' + LineEnding;
75- line:= line + LineEnding;
113+ line:= ' #!/bin/bash' + LineEnding + LineEnding;
76114 for index:= 0 to Pred(FConfig.Entries.Count) do
77115 begin
116+ Write(GenerateProgressBar(index+1 , FConfig.Entries.Count, 50 ), lineBreak);
78117 line:= line + ' echo "===== ' + FConfig.Entries[index].Name +' ======"' + LineEnding;
79118 if FConfig.Entries[index].HasRelease then
80119 begin
@@ -101,11 +140,126 @@ procedure TBuilder.BuildCompileScriptBash;
101140 line:= line + ' echo "==========="' + LineEnding;
102141 line:= line + ' echo' + LineEnding + LineEnding;
103142 end ;
104- scriptStream.WriteBuffer(line[1 ], Length(line));
143+ FScriptStream.WriteBuffer(line[1 ], Length(line));
144+ finally
145+ FScriptStream.Free;
146+ end ;
147+ FpChmod(PChar(FScriptFile), &775 );
148+ end ;
149+
150+ procedure TBuilder.BuildTestScriptBash ;
151+ var
152+ index: Integer;
153+ line, tmpStr: String;
154+ begin
155+ FScriptFile:= IncludeTrailingPathDelimiter(FConfig.RootFolder) + cTestBash;
156+ FScriptStream:= TFileStream.Create(FScriptFile, fmCreate);
157+ try
158+ line:= ' #!/bin/bash' + LineEnding + LineEnding;
159+ for index:= 0 to Pred(FConfig.Entries.Count) do
160+ begin
161+ Write(GenerateProgressBar(index+1 , FConfig.Entries.Count, 50 ), lineBreak);
162+ line:= line + ' echo "===== ' + FConfig.Entries[index].Name +' ======"' + LineEnding;
163+ tmpStr:= Format(' %s%s %s' , [
164+ IncludeTrailingPathDelimiter(FConfig.BinFolder),
165+ FConfig.Entries[index].EntryBinary,
166+ FConfig.Entries[index].RunParams
167+ ]);
168+ tmpStr:= StringReplace(
169+ tmpStr,
170+ cReplaceEntryInput,
171+ FConfig.InputSSD,
172+ [rfReplaceAll]
173+ );
174+ tmpStr:= StringReplace(
175+ tmpStr,
176+ cReplaceEntryThreads,
177+ IntToStr(FConfig.Entries[index].Threads),
178+ [rfReplaceAll]
179+ );
180+ tmpStr:= Format(' %s > %s%s.output' , [
181+ tmpStr,
182+ IncludeTrailingPathDelimiter(FConfig.ResultsFolder),
183+ FConfig.Entries[index].EntryBinary
184+ ]);
185+ line:= line + tmpStr + LineEnding;
186+ tmpStr:= Format(' sha256sum %s%s.output' ,[
187+ IncludeTrailingPathDelimiter(FConfig.ResultsFolder),
188+ FConfig.Entries[index].EntryBinary
189+ ]);
190+ line:= line + tmpStr + LineEnding;
191+ line:= line + Format(' echo "%s Official Output Hash"' ,[
192+ cOfficialOutputHash
193+ ]) + LineEnding;
194+ line:= line + ' echo "==========="' + LineEnding;
195+ line:= line + ' echo' + LineEnding + LineEnding;
196+ end ;
197+ FScriptStream.WriteBuffer(line[1 ], Length(line));
198+ finally
199+ FScriptStream.Free;
200+ end ;
201+ FpChmod(PChar(FScriptFile), &775 );
202+ end ;
203+
204+ procedure TBuilder.BuildRunScriptBash ;
205+ var
206+ index: Integer;
207+ line, tmpStr: String;
208+ begin
209+ FScriptFile:= IncludeTrailingPathDelimiter(FConfig.RootFolder) + cRunBash;
210+ FScriptStream:= TFileStream.Create(FScriptFile, fmCreate);
211+ try
212+ line:= ' #!/bin/bash' + LineEnding + LineEnding;
213+ for index:= 0 to Pred(FConfig.Entries.Count) do
214+ begin
215+ Write(GenerateProgressBar(index+1 , FConfig.Entries.Count, 50 ), lineBreak);
216+ line:= line + ' echo "===== ' + FConfig.Entries[index].Name +' ======"' + LineEnding;
217+ tmpStr := StringReplace(
218+ FConfig.Hyperfine,
219+ cReplaceName,
220+ FConfig.Entries[index].EntryBinary,
221+ [rfReplaceAll]
222+ );
223+ tmpStr := StringReplace(
224+ tmpStr,
225+ cReplaceJSONResults,
226+ Format(' %s%s' , [
227+ IncludeTrailingPathDelimiter(FConfig.ResultsFolder),
228+ FConfig.Entries[index].EntryBinary + ' -1_000_000_000.json'
229+ ]),
230+ [rfReplaceAll]
231+ );
232+ tmpStr := StringReplace(
233+ tmpStr,
234+ cReplaceEntryBinary,
235+ Format(' %s%s %s' , [
236+ IncludeTrailingPathDelimiter(FConfig.BinFolder),
237+ FConfig.Entries[index].EntryBinary,
238+ FConfig.Entries[index].RunParams
239+ ]),
240+ [rfReplaceAll]
241+ );
242+ tmpStr := StringReplace(
243+ tmpStr,
244+ cReplaceEntryInput,
245+ FConfig.InputSSD,
246+ [rfReplaceAll]
247+ );
248+ tmpStr := StringReplace(
249+ tmpStr,
250+ cReplaceEntryThreads,
251+ IntToStr(FConfig.Entries[index].Threads),
252+ [rfReplaceAll]
253+ );
254+ line:= line + tmpStr + LineEnding;
255+ line:= line + ' echo "==========="' + LineEnding;
256+ line:= line + ' echo' + LineEnding + LineEnding;
257+ end ;
258+ FScriptStream.WriteBuffer(line[1 ], Length(line));
105259 finally
106- scriptStream .Free;
260+ FScriptStream .Free;
107261 end ;
108- FpChmod(PChar(scriptFile ), &775 );
262+ FpChmod(PChar(FScriptFile ), &775 );
109263end ;
110264
111265end .
0 commit comments