root/branches/0_1_3/IssBuilderServiceClass.pas

Revision 107, 12.6 kB (checked in by sagrer, 1 year ago)
  1. Добавил дефолтный iss-скрипт для cборки бинарного пакета, поправил экзамплный вариант скрипта - добавил туды шапку. Пока что не переделана секция [Code] - для распознавания версий апдейтов.
  2. IssBuilder? научен находить компилер iss через реестр, а также читать инфу из iss и vit-файлов проекта.
  • Property svnmailer:content-charset set to cp1251
Line 
1 ///////////////////////////////////////////////////////////
2 //                     GGBuildTools                      //
3 //    Набор утилит для сборки проектов Gipat Group       //
4 //             Copyright (C) 2007 Gipat Group            //
5 //              Распространяется на условиях             //
6 //    Gipat Group's opened EI-editor-utility license     //
7 //                      версии 1.0                       //
8 //                                                       //
9 //                  www.gipatgroup.org                   //
10 ///////////////////////////////////////////////////////////
11
12 //К работе над данным файлом приложили руки, ноги.... короче аффтары:
13 // 1) Sagrer (sagrer@yandex.ru)
14
15 ////////////////////////////////////////////////////////////////////////
16
17 ////////////////////////////////////////////////////////////
18 //             Служебный класс для IssBuilder             //
19 ////////////////////////////////////////////////////////////
20
21 unit IssBuilderServiceClass;
22
23 {$mode objfpc}{$H+}
24
25 interface
26
27 uses
28   Classes, SysUtils, Forms, ExtraFunctionsLcl, GGConsUtilServiceClass, GGBuildToolsShared, ExtraFileUtilsLCL,
29   IssBuilderLogic;
30  
31 const
32   GGBT_IssBuilderAppName = ' - Inno Setup builder';
33  
34 type
35   TIssBuilderServiceClass = class (TGGConsUtilServiceClass)       //Класс с основным функционалом и данными IssBuilder
36   private
37   protected
38     LogicClass : TIssBuilderLogic;
39
40     //Защищенные методы.
41     procedure PostExternalMessage(const TextMessage : AnsiString);    //Функция для вывода мессаги другими объектами.
42   public
43     //Переменные
44     SconfFilename : AnsiString;
45
46     //Конструкторы-деструкторы...
47     constructor Create; override;
48     destructor Destroy; override;
49
50     //Открытые методы...
51     procedure ProcessParameters;  override;     //Проверить параметры командной строки.
52     procedure DoWork;        override;          //Выполнить боевую задачу %).
53     procedure ShowDescription; override;        //Вывести описание утилиты.
54     procedure ShowOptions;  override;           //Вывести справку по использованию тулсы.
55     procedure ProcessExtraSconfParams;          //Прочитать параметры, перекрывающие настройки sconf.
56   end;
57
58 var
59   IssBuilderServClass : TIssBuilderServiceClass;
60
61 implementation
62
63 /////////////////////////////////////////////
64 //         TIssBuilderServiceClass         //
65 /////////////////////////////////////////////
66
67 //-----------------------------------------//
68 //        Конструкторы-деструкторы...      //
69 //-----------------------------------------//
70
71 constructor TIssBuilderServiceClass.Create;
72 begin
73   //Проставить дефолтные значения...
74   SconfFilename := '';
75
76   //Создать вложенные объекты классов...
77   LogicClass := TIssBuilderLogic.Create;
78
79   //Вбить имя приложения.
80   Self.GGConsAppName := GGBT_IssBuilderAppName;
81
82   //Выполнить конструктор предка...
83   inherited;
84 end;
85
86 destructor TIssBuilderServiceClass.Destroy;
87 begin
88   //Выкидываем мусор
89   LogicClass.Free;
90
91   //Выполнить унаследованный деструктор
92   inherited;
93 end;
94
95 //------------------------------------------//
96 //           Защищенные методы...           //
97 //------------------------------------------//
98
99 procedure TIssBuilderServiceClass.PostExternalMessage(const TextMessage : AnsiString);
100 //Функция для вывода мессаги другими объектами.
101 begin
102   Writeln(TextMessage);
103 end;
104
105 //------------------------------------------//
106 //            Открытые методы...            //
107 //------------------------------------------//
108
109 procedure TIssBuilderServiceClass.ProcessParameters;
110 //Проверить параметры командной строки.
111 begin
112   //Выполнить унаследованную функцию
113   inherited;
114
115   if Application.HasOption('filepath') then begin
116     //Прочитать имя файла проекта.
117     Self.SconfFilename := Application.GetOptionValue('filepath');
118   end;
119  
120   if Application.HasOption('nocachewrite') or Application.HasOption('n') then begin
121     //Запрещаем записывать что-либо в кеш.
122     Self.LogicClass.NoCacheWrite := true;
123   end;
124  
125   //Параметры, переопределяющие настройки из sconf обрабатываются отдельно. См код в DoWork().
126 end;
127
128 procedure TIssBuilderServiceClass.DoWork;
129 //Выполнить боевую задачу %).
130 var
131   AllOk : Boolean;
132 begin
133   //Выполнить нужно одну из задач - по её завершении ProcessFurther := false
134   //и дальше нифига не выполняется.
135
136   //Выполнить унаследованную функцию
137   inherited;
138  
139   //Дополнительная инициализация.
140   AllOk := true;
141
142   //Если ничего до сих пор не выполнилось - то выполняем боевую задачу....
143   if ProcessFurther = true then begin
144     //Блокировка других веток
145     ProcessFurther := false;
146     //Работаем....
147     if Application.HasOption('filepath') = true then begin
148       //Собсно выполняем боевую задачу.
149       //Выводим версию софтины...
150       Self.ShowVersion();
151       Writeln('');
152       //Превращаем локальный путь в глобальный.
153       Self.SconfFilename := ResolveLocalPath(Self.SconfFilename,GetCurrentDir);
154
155       //В данный момент у нас должен быть глобальный путь. Проверим существует ли файл.
156       if FileExists(Self.SconfFilename) = true then begin
157         //Существует.
158        
159         //Читаем Sconf.
160         Writeln('Reading sconf from '+Self.SconfFilename);
161         AllOk := Self.LogicClass.ProjectSconf.Load(Self.SconfFilename);
162         Self.LogicClass.SconfFilePath := Self.SconfFilename;
163        
164         if AllOk = true then begin
165           //Прочитали.
166           Writeln('Readed.');
167          
168           //Теперь надо перекрыть настройки в sconf перекрывающими параметрами из командной строки, если они там такие есть.
169           Self.ProcessExtraSconfParams;
170          
171           //Ок. Ну, а теперь, собсно гря, настраиваем и запускаем в работу логику.
172           Self.LogicClass.PostExternalMessage := @Self.PostExternalMessage;
173           AllOk := Self.LogicClass.ProcessSconf();
174          
175           //Если фсеок - то выводим сообщение что типо увсе зделано.
176           if AllOk = true then begin
177             //Фсеок.
178             Writeln('Done.');
179             Writeln('');
180           end
181           else begin
182             //Был какой-то обломс.
183             Writeln('Error. IssBuilding stopped.');
184             Writeln('');
185           end;
186         end;
187        
188       end
189       else begin
190         //Облом. Сообщаем про ошибк.
191         Writeln('Error! Project sconf file is not exists! : ');
192         Writeln(Self.SconfFilename);
193         Writeln('');
194       end;
195     end
196     else begin
197       //Обломс. Нехватает опции которая обязательна для работы софтины.
198       Self.ShowHelp();
199       Writeln('Error!!! "--filepath=<value>" option is required!');
200       Writeln('');
201     end;
202   end;
203
204 end;
205
206 procedure TIssBuilderServiceClass.ShowDescription;
207 //Вывести описание утилиты.
208 begin
209   inherited;
210   Writeln('Description:');
211   Writeln('             Generates *.iss Inno Setup scripts for your program''s installs,');
212   Writeln('             then launching Inno Setup compiler to create an installation');
213   Writeln('             package.');
214 end;
215
216 procedure TIssBuilderServiceClass.ShowOptions;
217 //Вывести справку по использованию тулсы.
218 begin
219   //Вызвать унаследованную функцию...
220   inherited;
221
222   //И собсно запостить нашенские дополнения %).
223   Writeln('          --filepath=<value> : sets path to the project''s configuration file.');
224   Writeln('          -n, --nocachewrite : don''t save anything into cache, ignoring');
225   Writeln('            project''s configuration file options.');
226   Writeln('          ');
227   Writeln('Options to redeclare [IssBuilder] section''s elements from project''s');
228   Writeln('configuration file:');
229   Writeln('          ');
230   Writeln('          --FilesDir=<value> : path (relative to project''s root or absolute)');
231   Writeln('            to directory with files for installation. All paths may be relative');
232   Writeln('            to project''s root or they may be absolute.');
233   Writeln('          --DefaultIssName=<value> : name of default *.iss file.');
234   Writeln('          --OutputDir=<value> : directory, where to put compiled installs.');
235   Writeln('          --VersionsCacheDir=<value> : directory for versions cache.');
236   Writeln('          --SaveToCache=<value> : value is 0 or 1. If 1 - saves all version''s');
237   Writeln('            files into cache (from FilesDir), not only *.iss and *.flist files.');
238   Writeln('          --CreateFull=<value> : value is 0 or 1. If 1 - creates a full');
239   Writeln('            installation package (full version and may be updates).');
240   Writeln('          --CreateFull_AllowUpdate=<value> : value is 0 or 1. If 1 - gives full');
241   Writeln('            installation an ability to update previous versions without they ');
242   Writeln('            uninstallation.');
243   Writeln('          --CreateFull_UpdVers=<value> : What previous versions to make');
244   Writeln('            updatable - if value is "All" - all previous versions which are');
245   Writeln('            exists in a cache will be updatable. If value is "From:X", where X');
246   Writeln('            is a ver number (4 nubers, delimited by dots) - all versions from');
247   Writeln('            X (including it), which are exists in a cache will be updatable. If');
248   Writeln('            value is a number - last value number of versions, which are exists');
249   Writeln('            in a cache will be updatable.');
250   Writeln('          --CreateSeparateUpds=<value> : value is 0 or 1. If 1 - separate');
251   Writeln('            update installs, which can only update a speciefic one version');
252   Writeln('            will be created.');
253   Writeln('          --CreateSeparateUpds_UpdVers=<value> : same as CreateFull_UpdVers.');
254   Writeln('          --CreateCumulateUpdate=<value> : value is 0 or 1. If 1 - cumulative');
255   Writeln('            update install, which can update a number of different versions');
256   Writeln('            will be created.');
257   Writeln('          --CreateCumulateUpdate_UpdVers=<value> : same as CreateFull_UpdVers.');
258 end;
259
260 procedure TIssBuilderServiceClass.ProcessExtraSconfParams;
261 //Прочитать параметры, перекрывающие настройки sconf.
262 begin
263
264   if Application.HasOption('FilesDir') then begin
265     Self.LogicClass.ProjectSconf.IssBuilderSection.FilesDir := Application.GetOptionValue('FilesDir');
266   end;
267  
268   if Application.HasOption('DefaultIssName') then begin
269     Self.LogicClass.ProjectSconf.IssBuilderSection.DefaultIssName := Application.GetOptionValue('DefaultIssName');
270   end;
271  
272   if Application.HasOption('OutputDir') then begin
273     Self.LogicClass.ProjectSconf.IssBuilderSection.OutputDir := Application.GetOptionValue('OutputDir');
274   end;
275  
276   if Application.HasOption('VersionsCacheDir') then begin
277     Self.LogicClass.ProjectSconf.IssBuilderSection.VersionsCacheDir := Application.GetOptionValue('VersionsCacheDir');
278   end;
279  
280   if Application.HasOption('SaveToCache') then begin
281     Self.LogicClass.ProjectSconf.IssBuilderSection.SaveToCache := StrToBool(Application.GetOptionValue('SaveToCache'));
282   end;
283  
284   if Application.HasOption('CreateFull') then begin
285     Self.LogicClass.ProjectSconf.IssBuilderSection.CreateFull := StrToBool(Application.GetOptionValue('CreateFull'));
286   end;
287  
288   if Application.HasOption('CreateFull_AllowUpdate') then begin
289     Self.LogicClass.ProjectSconf.IssBuilderSection.CreateFull_AllowUpdate := StrToBool(Application.GetOptionValue('CreateFull_AllowUpdate'));
290   end;
291  
292   if Application.HasOption('CreateFull_UpdVers') then begin
293     Self.LogicClass.ProjectSconf.IssBuilderSection.CreateFull_UpdVers := Application.GetOptionValue('CreateFull_UpdVers');
294   end;
295  
296   if Application.HasOption('CreateSeparateUpds') then begin
297     Self.LogicClass.ProjectSconf.IssBuilderSection.CreateSeparateUpds := StrToBool(Application.GetOptionValue('CreateSeparateUpds'));
298   end;
299  
300   if Application.HasOption('CreateSeparateUpds_UpdVers') then begin
301     Self.LogicClass.ProjectSconf.IssBuilderSection.CreateSeparateUpds_UpdVers := Application.GetOptionValue('CreateSeparateUpds_UpdVers');
302   end;
303  
304   if Application.HasOption('CreateCumulateUpdate') then begin
305     Self.LogicClass.ProjectSconf.IssBuilderSection.CreateCumulateUpdate := StrToBool(Application.GetOptionValue('CreateCumulateUpdate'));
306   end;
307  
308   if Application.HasOption('CreateCumulateUpdate_UpdVers') then begin
309     Self.LogicClass.ProjectSconf.IssBuilderSection.CreateCumulateUpdate_UpdVers := Application.GetOptionValue('CreateCumulateUpdate_UpdVers');
310   end;
311
312 end;
313
314 /////////////////////////////////
315 initialization
316
317 //Инициализация %). Выделим память, создадим всякую херню... как обычно в общем %)
318 begin
319   IssBuilderServClass := TIssBuilderServiceClass.Create;
320 end;
321
322 finalization
323 //Мочим все лишнее...
324 begin
325   IssBuilderServClass.Free;
326 end;
327
328 end.
Note: See TracBrowser for help on using the browser.