├── .gitignore
├── Gen.pas
├── LICENSE.TXT
├── Logo.png
├── PackagesGenerator.dpr
├── PackagesGenerator.dproj
├── PackagesGenerator.exe
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | # Uncomment these types if you want even more clean repository. But be careful.
2 | # It can make harm to an existing project source. Read explanations below.
3 | #
4 | # Resource files are binaries containing manifest, project icon and version info.
5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files.
6 | #*.res
7 | #
8 | # Type library file (binary). In old Delphi versions it should be stored.
9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored.
10 | #*.tlb
11 | #
12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7.
13 | # Uncomment this if you are not using diagrams or use newer Delphi version.
14 | #*.ddp
15 | #
16 | # Visual LiveBindings file. Added in Delphi XE2.
17 | # Uncomment this if you are not using LiveBindings Designer.
18 | #*.vlb
19 | #
20 | # Deployment Manager configuration file for your project. Added in Delphi XE2.
21 | # Uncomment this if it is not mobile development and you do not use remote debug feature.
22 | #*.deployproj
23 | #
24 | # C++ object files produced when C/C++ Output file generation is configured.
25 | # Uncomment this if you are not using external objects (zlib library for example).
26 | #*.obj
27 | #
28 |
29 | # Delphi compiler-generated binaries (safe to delete)
30 | *.exe
31 | *.dll
32 | *.bpl
33 | *.bpi
34 | *.dcp
35 | *.so
36 | *.apk
37 | *.drc
38 | *.map
39 | *.dres
40 | *.rsm
41 | *.tds
42 | *.dcu
43 | *.lib
44 | *.a
45 | *.o
46 | *.ocx
47 |
48 | # Delphi autogenerated files (duplicated info)
49 | *.cfg
50 | *.hpp
51 | *Resource.rc
52 |
53 | # Delphi local files (user-specific info)
54 | *.local
55 | *.identcache
56 | *.projdata
57 | *.tvsconfig
58 | *.dsk
59 |
60 | # Delphi history and backups
61 | __history/
62 | __recovery/
63 | *.~*
64 |
65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi)
66 | *.stat
67 |
--------------------------------------------------------------------------------
/Gen.pas:
--------------------------------------------------------------------------------
1 | {******************************************************************************}
2 | { PackagesGenerator }
3 | { ErrorSoft(c) 2018 }
4 | { }
5 | { More beautiful things: errorsoft.org }
6 | { }
7 | { https://github.com/errorcalc/PackagesGenerator/ }
8 | { }
9 | { Absolutely free for Open Source and Non Commercial projects. }
10 | { Please contact me for information on purchasing the commercial license. }
11 | { $10 for individual developers, $50 for company. }
12 | { Email: dr.enter256@gmail.com for contacts. }
13 | {******************************************************************************}
14 | unit Gen;
15 |
16 | interface
17 |
18 | procedure Generate;
19 |
20 | implementation
21 |
22 | uses
23 | System.IniFiles, System.SysUtils, System.Classes, System.Generics.Collections, System.RegularExpressionsCore,
24 | System.RegularExpressions;
25 |
26 | const
27 | sDelimiter = '===============================================================================';
28 | sLiteDelimiter = '-------------------------------------------------------------------------------';
29 | sTitle =
30 | '{****************************************************************************}' + sLineBreak +
31 | '{ PackagesGenerator }' + sLineBreak +
32 | '{ ErrorSoft(c) Peter Sokolov, 2018 }' + sLineBreak +
33 | '{ }' + sLineBreak +
34 | '{ More beautiful things: errorsoft.org }' + sLineBreak +
35 | '{ }' + sLineBreak +
36 | '{ https://github.com/errorcalc/PackagesGenerator/ }' + sLineBreak +
37 | '{ }' + sLineBreak +
38 | '{ Absolutely free for Open Source and Non Commercial projects. }' + sLineBreak +
39 | '{ Please contact me for information on purchasing the commercial license. }' + sLineBreak +
40 | '{ $10 for individual developers, $50 for company. }' + sLineBreak +
41 | '{ Email: dr.enter256@gmail.com for contacts. }' + sLineBreak +
42 | '{****************************************************************************}';
43 | sVer = 'ErrorSoft PackagesGenerator for Delphi, v0.8 Alpha';
44 |
45 | var
46 | Ini: TMemIniFile;
47 | HideOutput: Boolean = False;
48 |
49 | function GetConfigFile: string;
50 | begin
51 | if ParamCount >= 2 then
52 | if ParamStr(1).ToLower = '-config' then
53 | if IsRelativePath(ParamStr(2)) then
54 | Exit(GetCurrentDir + '\' + ParamStr(2))
55 | else
56 | Exit(ParamStr(2));
57 | // else
58 | // raise EProgrammerNotFound.Create('Bad command line!');
59 |
60 | Result := GetCurrentDir + '\PackagesGenerator.ini';
61 | end;
62 |
63 | procedure Print(Text: string; Level: Byte = 0);
64 | begin
65 | if HideOutput then
66 | Exit;
67 | Writeln(''.PadRight(Level * 2), Text);
68 | end;
69 |
70 | procedure ProcessDpk(F: TStrings; Ver: string; Base, Gen: string);
71 | const
72 | Files = '.*in.*''.+''';
73 | OneFile = '''.*''';
74 | LibSuffix = '.*\{\$LIBSUFFIX.*\}';
75 | AnyDirrective = '\{\$.*\}';
76 |
77 | var
78 | p: Integer;
79 | I: Integer;
80 | NameFrom, NameTo: string;
81 | begin
82 | // search 'contains'
83 | p := -1;
84 | for I := 0 to F.Count - 1 do
85 | if F[I].IndexOf('contains') <> -1 then
86 | begin
87 | p := I;
88 | end;
89 | // replace file names
90 | if p <> -1 then
91 | for I := p to F.Count - 1 do
92 | if TRegEx.IsMatch(F[I], Files) then
93 | begin
94 | NameTo := ExtractRelativePath(Gen, Base + TRegEx.Match(F[I], OneFile, [roIgnoreCase]).Value.DeQuotedString(''''));
95 | NameFrom := TRegEx.Match(F[I], OneFile, [roIgnoreCase]).Value.DeQuotedString('''');
96 | F[I] := F[I].Replace(NameFrom, NameTo);
97 | Print('Replace: ' + NameFrom + ' -> ' + NameTo, 2);
98 | end;
99 |
100 | // search 'requires'
101 | for I := P downto 0 do
102 | if F[I].IndexOf('requires') <> -1 then
103 | begin
104 | p := I;
105 | end;
106 | // add libsuffix
107 | if p <> -1 then
108 | begin
109 | for I := p downto 0 do
110 | begin
111 | if TRegEx.IsMatch(F[I], LibSuffix, [roIgnoreCase]) then
112 | begin
113 | Print('Replace: ' + F[I] + ' -> ' + '{$LIBSUFFIX ''' + Ver + '''}', 2);
114 | F[I] := '{$LIBSUFFIX ''' + Ver + '''}';
115 | Exit;
116 | end;
117 | end;
118 | for I := p downto 0 do
119 | begin
120 | if TRegEx.IsMatch(F[I], AnyDirrective, [roIgnoreCase]) then
121 | begin
122 | F.Insert(I + 1, '{$LIBSUFFIX ''' + Ver + '''}');
123 | Print('Insert: ' + F[I + 1], 2);
124 | Exit;
125 | end;
126 | end;
127 | end;
128 |
129 | // hrm... error
130 | raise EParserError.Create('Bad dpk file!');
131 | end;
132 |
133 | procedure ProcessGroupproj(F: TStrings; Files: TStrings; Ver: string; Base, Gen, SuperBase: string);
134 | const
135 | dproj = '".*\.dproj\s*"';
136 | var
137 | I: Integer;
138 | NameFrom, NameTo, s: string;
139 | IsFound: Boolean;
140 | begin
141 |
142 | for I := 0 to F.Count - 1 do
143 | begin
144 | if TRegEx.IsMatch(F[I], '".*"', [roIgnoreCase]) then
145 | begin
146 | IsFound := False;
147 | // include files
148 | for s in Files do
149 | if TRegEx.IsMatch(F[I], '"\s*' + TPerlRegEx.EscapeRegExChars(s) + '\s*"', [roIgnoreCase]) then
150 | begin
151 | NameTo := ExtractRelativePath(Gen, Base +
152 | TRegEx.Match(F[I], '"\s*' + TPerlRegEx.EscapeRegExChars(s) + '\s*"', [roIgnoreCase]).Value.DeQuotedString('"'));
153 | NameFrom := TRegEx.Match(F[I], '"\s*' + TPerlRegEx.EscapeRegExChars(s) + '\s*"', [roIgnoreCase]).Value.DeQuotedString('"');
154 | F[I] := F[I].Replace(NameFrom, NameTo);
155 | Print('Replace: ' + NameFrom + ' -> ' + NameTo, 2);
156 | IsFound := True;
157 | Break;
158 | end;
159 | // deinclude files
160 | if not IsFound and TRegEx.IsMatch(F[I], dproj, [roIgnoreCase]) then
161 | begin
162 | NameTo := ExtractRelativePath(Gen, SuperBase +
163 | TRegEx.Match(F[I], dproj, [roIgnoreCase]).Value.DeQuotedString('"'));
164 | NameFrom := TRegEx.Match(F[I], dproj, [roIgnoreCase]).Value.DeQuotedString('"');
165 | F[I] := F[I].Replace(NameFrom, NameTo);
166 | Print('Replace: ' + NameFrom + ' -> ' + NameTo, 2);
167 | end;
168 | end;
169 | end;
170 | end;
171 |
172 | procedure ProcessDproj(F: TStrings; Ver: string; Base, Gen: string);
173 | function GenDllSuffix: string;
174 | begin
175 | Result := '' + Ver + '';
176 | end;
177 |
178 | const
179 | DllSuffix = '< *DllSuffix *>.*< */ *DllSuffix *>';
180 | PropertyGroup = '< *PropertyGroup +Condition *= *"''\$ *\( *Base *\) *'' *! *= *'' *'' *" *>';
181 | EndPropertyGroup = '< */ *PropertyGroup *>';
182 | IncludeFiles = '(Include *= *".*\.(pas|inc) *"|RcItem\s*Include\s*=\s*".*")';
183 | ReplaceFile = '(".*\.(pas|inc) *"|".*")';
184 |
185 | var
186 | I, J: Integer;
187 | FromName, ToName: string;
188 | RxDll, RxFile, RxPG: TRegEx;
189 | IsBadFile: Boolean;
190 |
191 | begin
192 | RxDll := TRegEx.Create(DllSuffix, [roIgnoreCase]);
193 | RxFile := TRegEx.Create(IncludeFiles, [roIgnoreCase]);
194 | RxPG := TRegEx.Create(PropertyGroup, [roIgnoreCase]);
195 |
196 | IsBadFile := True;
197 | I := 0;
198 | while I < F.Count do
199 | begin
200 | if RxFile.IsMatch(F[I]) then
201 | begin
202 | ToName := ExtractRelativePath(Gen, Base +
203 | TRegEx.Match(F[I], ReplaceFile, [roIgnoreCase]).Value.DeQuotedString('"'));
204 | FromName := TRegEx.Match(F[I], ReplaceFile, [roIgnoreCase]).Value.DeQuotedString('"');
205 | F[I] := F[I].Replace(FromName, ToName);
206 | Print('Replace: ' + FromName + ' -> ' + ToName, 2);
207 | end else
208 | if RxDll.IsMatch(F[I]) then
209 | begin
210 | Print('Replace: ' + RxDll.Match(F[I]).Value + ' -> ' + GenDllSuffix, 2);
211 | F[I] := F[I].Replace(RxDll.Match(F[I]).Value, GenDllSuffix);
212 | end else
213 | if RxPG.IsMatch(F[I]) then
214 | begin
215 | for J := I to F.Count - 1 do
216 | begin
217 | if RxDll.IsMatch(F[J]) then
218 | begin
219 | Print('Replace: ' + RxDll.Match(F[J]).Value + ' -> ' + GenDllSuffix, 2);
220 | F[J] := F[J].Replace(RxDll.Match(F[J]).Value, GenDllSuffix);
221 | IsBadFile := False;
222 | break;
223 | end else
224 | if TRegEx.IsMatch(F[J], EndPropertyGroup, [roIgnoreCase]) then
225 | begin
226 | F.Insert(J, ' ' + GenDllSuffix);
227 | Print('Insert: ' + GenDllSuffix, 2);
228 | IsBadFile := False;
229 | break;
230 | end;
231 | end;
232 | I := J;
233 | end;
234 | Inc(I);
235 | end;
236 |
237 | if IsBadFile then
238 | raise EParserError.Create('Bad dproj file!');
239 | end;
240 |
241 | procedure Generate;
242 | var
243 | BaseDir, GenDir, s, ext, Dir, Suffix, FileName: string;
244 | Files, F, Temp: TStringList;
245 | Versions: TDictionary;
246 | I: Integer;
247 | GroupAbove: Boolean;
248 | begin
249 | if FindCmdLineSwitch('hide', True) then
250 | HideOutput := True;
251 |
252 | Print(sVer);
253 | Print(sTitle);
254 | Print(sDelimiter);
255 |
256 | Print('Config File: ' + Ini.FileName);
257 |
258 | // Folders
259 | BaseDir := Ini.ReadString('Folders', 'Base', GetCurrentDir);
260 | if IsRelativePath(BaseDir) then
261 | BaseDir := ExpandFileName(GetCurrentDir + '\' + IncludeTrailingPathDelimiter(BaseDir));
262 | BaseDir := IncludeTrailingPathDelimiter(BaseDir);
263 | GenDir := Ini.ReadString('Folders', 'Gen', GetCurrentDir);
264 | if IsRelativePath(GenDir) then
265 | GenDir := ExpandFileName(GetCurrentDir + '\' + IncludeTrailingPathDelimiter(GenDir));
266 | GenDir := IncludeTrailingPathDelimiter(GenDir);
267 |
268 | GroupAbove := Ini.ReadString('Folders', 'GroupAbove', 'False').ToLower = 'true';
269 | Print(sDelimiter);
270 | Print('Folders:');
271 | Print(sLiteDelimiter);
272 | Print('Base: ' + BaseDir);
273 | Print('Gen: ' + GenDir);
274 | Print('GroupAbove: ' + GroupAbove.ToString);
275 |
276 | Versions := nil;
277 | Files := TStringList.Create;
278 | try
279 | // Versions
280 | Print(sDelimiter);
281 | Print('Versions:');
282 | Print(sLiteDelimiter);
283 | Versions := TDictionary.Create;
284 | Temp := TStringList.Create;
285 | try
286 | Ini.ReadSection('Versions', Temp);
287 | for s in Temp do
288 | begin
289 | Versions.Add(s, Ini.ReadString('Versions', s, ''));
290 | Print(s + ' = ' + Versions[s]);
291 | end;
292 | finally
293 | Temp.Free;
294 | end;
295 |
296 | // Files
297 | Print(sDelimiter);
298 | Print('Processing files:');
299 | Print(sDelimiter);
300 | Ini.ReadSectionValues('Files', Files);
301 | for I := 0 to Files.Count - 1 do
302 | begin
303 | Print(sDelimiter);
304 | Print(Files[I] + ':');
305 | Print(sLiteDelimiter);
306 | F := TStringList.Create;
307 | try
308 | for s in Versions.Keys do
309 | begin
310 | Print(s + '(' + Files[I] + '):');
311 | F.LoadFromFile(BaseDir + Files[I]);
312 |
313 | ext := ExtractFileExt(Files[I]).ToLower;
314 | // process
315 | if ext = '.dpk' then
316 | ProcessDpk(F, Versions[s], BaseDir, GenDir + s + '\')
317 | else if ext = '.groupproj' then
318 | if GroupAbove then
319 | ProcessGroupproj(F, Files, s, GenDir + s + '\', GenDir, BaseDir)
320 | else
321 | ProcessGroupproj(F, Files, s, GenDir + s + '\', GenDir + s + '\', BaseDir)
322 | else if ext = '.dproj' then
323 | ProcessDproj(F, Versions[s], BaseDir, GenDir + s + '\');
324 |
325 | if (ext <> '.groupproj') or (GroupAbove = False) then
326 | begin
327 | Dir := GenDir + s + '\';
328 | Suffix := '';
329 | end else
330 | begin
331 | Dir := GenDir;
332 | Suffix := s;
333 | end;
334 |
335 | FileName := Dir + Files[I].Substring(0, Files[I].Length - ExtractFileExt(Files[I]).Length) + Suffix +
336 | ExtractFileExt(Files[I]);
337 |
338 | if not DirectoryExists(ExtractFilePath(FileName)) then
339 | ForceDirectories(ExtractFilePath(FileName));
340 |
341 | F.SaveToFile(FileName);
342 |
343 | Print('Done, Saved as: "' + ExtractRelativePath(GenDir, FileName) + '"', 1);
344 | Print('---', 1);
345 | end;
346 | finally
347 | F.Free;
348 | end;
349 | end;
350 |
351 | finally
352 | Files.Free;
353 | Versions.Free;
354 | end;
355 |
356 | Writeln('All files was processed!');
357 |
358 | if not FindCmdLineSwitch('skip', True) then
359 | begin
360 | Writeln('Press any key...');
361 | Readln;
362 | end;
363 | end;
364 |
365 | initialization
366 | try
367 | Ini := TMemIniFile.Create(GetConfigFile);
368 | except
369 | on E: Exception do
370 | begin
371 | Writeln(E.ClassName, ': ', E.Message);
372 | Halt;
373 | end;
374 | end;
375 |
376 | finalization;
377 | Ini.Free;
378 |
379 | end.
380 |
--------------------------------------------------------------------------------
/LICENSE.TXT:
--------------------------------------------------------------------------------
1 | === License ===
2 | This project has three licenses, you can select one of three license:
3 |
4 | 1) Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License.
5 | That means that you can use the product for non commercial purposes.
6 | (exaple: Personal use, Study, Open Source,...)
7 |
8 | 2) GNU GPL v3: https://www.gnu.org/licenses/gpl.html, only for opensource projects with GNU GPL license
9 |
10 | 3) ErrorSoft PackagesGenerator Commercial license.
11 | Copyright (c) 2016 Peter Sokolov, ErrorSoft(c)
12 | ---
13 | This license allows the use of the product for commercial purposes.
14 | But subject to the following conditions:
15 | 1. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
16 | 2. Do not have to sell this product as a standalone product.
17 | 3. Can selling as part of another paid product (ex: Components Library), if you have "company license".
18 | 3.1. Purchase information: Enter256@yandex.ru
19 | ---
20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/errorcalc/PackagesGenerator/e3a577ed22130611bf996a6b0fa9d05b59d02175/Logo.png
--------------------------------------------------------------------------------
/PackagesGenerator.dpr:
--------------------------------------------------------------------------------
1 | {******************************************************************************}
2 | { PackagesGenerator }
3 | { ErrorSoft(c) 2016 }
4 | { }
5 | { More beautiful things: errorsoft.org }
6 | { }
7 | { https://github.com/errorcalc/PackagesGenerator/ }
8 | { }
9 | { Absolutely free for Open Source and Non Commercial projects. }
10 | { Please contact me for information on purchasing the commercial license. }
11 | { $10 for individual developers, $50 for company. }
12 | { Email: dr.enter256@gmail.com for contacts. }
13 | {******************************************************************************}
14 | program PackagesGenerator;
15 |
16 | {$APPTYPE CONSOLE}
17 |
18 | {$R *.res}
19 |
20 | uses
21 | System.SysUtils,
22 | Gen in 'Gen.pas',
23 | WinApi.Windows;
24 |
25 | const
26 | Coord: TCoord = (x: 80; y: 2048);
27 |
28 | begin
29 | try
30 | SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), Coord);
31 | Generate;
32 | except
33 | on E: Exception do
34 | begin
35 | Writeln(E.ClassName, ': ', E.Message);
36 | if not FindCmdLineSwitch('skip', True) then
37 | begin
38 | Writeln('Press any key...');
39 | Readln;
40 | end;
41 | end;
42 | end;
43 | end.
44 |
--------------------------------------------------------------------------------
/PackagesGenerator.dproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | {0ED080EF-D50F-4F70-9FB2-66EEFC3FD3B2}
4 | 18.0
5 | None
6 | PackagesGenerator.dpr
7 | True
8 | Release
9 | Win32
10 | 1
11 | Console
12 |
13 |
14 | true
15 |
16 |
17 | true
18 | Base
19 | true
20 |
21 |
22 | true
23 | Base
24 | true
25 |
26 |
27 | true
28 | Base
29 | true
30 |
31 |
32 | true
33 | Base
34 | true
35 |
36 |
37 | true
38 | Base
39 | true
40 |
41 |
42 | true
43 | Base
44 | true
45 |
46 |
47 | true
48 | Base
49 | true
50 |
51 |
52 | true
53 | Base
54 | true
55 |
56 |
57 | true
58 | Cfg_1
59 | true
60 | true
61 |
62 |
63 | true
64 | Base
65 | true
66 |
67 |
68 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
69 | CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=
70 | PackagesGenerator
71 | 1049
72 | .\$(Platform)\$(Config)
73 | .\
74 | false
75 | false
76 | false
77 | false
78 | false
79 |
80 |
81 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
82 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
83 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
84 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
85 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
86 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
87 | android-support-v4.dex.jar;apk-expansion.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar
88 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
89 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
90 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;fgx;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage)
91 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
92 |
93 |
94 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;fgx;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;fmxase;$(DCC_UsePackage)
95 |
96 |
97 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;fmxase;$(DCC_UsePackage)
98 |
99 |
100 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;fgx;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;fmxase;$(DCC_UsePackage)
101 |
102 |
103 | true
104 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;ibxpress;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;fgx;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage)
105 |
106 |
107 | 1033
108 | true
109 | CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=
110 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
111 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;frxe23;vclFireDAC;emsclientfiredac;DataSnapFireDAC;svnui;tethering;JvGlobus;FireDACADSDriver;JvPluginSystem;DBXMSSQLDriver;JvMM;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;PngComponentsD;vcltouch;JvBands;vcldb;bindcompfmx;svn;JvJans;DBXOracleDriver;JvNet;Intraweb;inetdb;JvAppFrm;VirtualTreesDR;RaizeComponentsVcl_Seattle;FmxTeeUI;JvDotNetCtrls;FireDACIBDriver;fmx;fmxdae;EasyListviewD;vclib;VirtualShellToolsD;JvWizards;FireDACDBXDriver;dbexpress;IndyCore;vclx;JvPageComps;dsnap;DataSnapCommon;emsclient;FireDACCommon;JvDB;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;frxTee23;JclDeveloperTools;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;JvCmp;JvHMI;FixInsight_10;acntDelphiXE7_R;FireDACCommonDriver;DataSnapClient;inet;UIRibbonPackageDR;bindcompdbx;IndyIPCommon;JvCustom;vcl;DBXSybaseASEDriver;IndyIPServer;JvXPCtrls;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;Jcl;JvCore;JvCrypt;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;ChromeTabs_R;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;JvDlgs;JvRuntimeDesign;ibxpress;Tee;JvManagedThreads;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;JvTimeFramework;DBXSybaseASADriver;CustomIPTransport;vcldsnap;JvSystem;JvStdCtrls;bindcomp;appanalytics;fgx;DBXInformixDriver;officeXPrt;IndyIPClient;bindcompvcl;frxDB23;TeeUI;vclribbon;dbxcds;VclSmp;JvDocking;adortl;FireDACODBCDriver;JvPascalInterpreter;KernowSoftwareFMX;JclVcl;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;frx23;JvControls;JvPrintPreview;JclContainers;FmxEsChatList;fmxase;$(DCC_UsePackage)
112 |
113 |
114 | true
115 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;emsclientfiredac;DataSnapFireDAC;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;PngComponentsD;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;Intraweb;inetdb;VirtualTreesDR;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;EasyListviewD;vclib;VirtualShellToolsD;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;acntDelphiXE7_R;FireDACCommonDriver;DataSnapClient;inet;UIRibbonPackageDR;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;ChromeTabs_R;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;ibxpress;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;fgx;DBXInformixDriver;officeXPrt;IndyIPClient;bindcompvcl;TeeUI;vclribbon;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage)
116 |
117 |
118 | DEBUG;$(DCC_Define)
119 | true
120 | false
121 | true
122 | true
123 | true
124 |
125 |
126 | 1033
127 | None
128 | false
129 |
130 |
131 | false
132 | RELEASE;$(DCC_Define)
133 | 0
134 | 0
135 |
136 |
137 |
138 | MainSource
139 |
140 |
141 |
142 | Cfg_2
143 | Base
144 |
145 |
146 | Base
147 |
148 |
149 | Cfg_1
150 | Base
151 |
152 |
153 |
154 | Delphi.Personality.12
155 | Application
156 |
157 |
158 |
159 | PackagesGenerator.dpr
160 |
161 |
162 |
163 |
164 |
165 | true
166 |
167 |
168 |
169 |
170 | true
171 |
172 |
173 |
174 |
175 | true
176 |
177 |
178 |
179 |
180 | PackagesGenerator.exe
181 | true
182 |
183 |
184 |
185 |
186 | 0
187 | .dll;.bpl
188 |
189 |
190 | 1
191 | .dylib
192 |
193 |
194 | Contents\MacOS
195 | 1
196 | .dylib
197 |
198 |
199 | 1
200 | .dylib
201 |
202 |
203 | 1
204 | .dylib
205 |
206 |
207 |
208 |
209 | Contents\Resources
210 | 1
211 |
212 |
213 |
214 |
215 | classes
216 | 1
217 |
218 |
219 |
220 |
221 | Contents\MacOS
222 | 0
223 |
224 |
225 | 1
226 |
227 |
228 | Contents\MacOS
229 | 1
230 |
231 |
232 |
233 |
234 | 1
235 |
236 |
237 | 1
238 |
239 |
240 | 1
241 |
242 |
243 |
244 |
245 | res\drawable-xxhdpi
246 | 1
247 |
248 |
249 |
250 |
251 | library\lib\mips
252 | 1
253 |
254 |
255 |
256 |
257 | 0
258 |
259 |
260 | 1
261 |
262 |
263 | Contents\MacOS
264 | 1
265 |
266 |
267 | 1
268 |
269 |
270 | library\lib\armeabi-v7a
271 | 1
272 |
273 |
274 | 1
275 |
276 |
277 |
278 |
279 | 0
280 |
281 |
282 | Contents\MacOS
283 | 1
284 | .framework
285 |
286 |
287 |
288 |
289 | 1
290 |
291 |
292 | 1
293 |
294 |
295 | 1
296 |
297 |
298 |
299 |
300 | 1
301 |
302 |
303 | 1
304 |
305 |
306 | 1
307 |
308 |
309 |
310 |
311 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
312 | 1
313 |
314 |
315 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
316 | 1
317 |
318 |
319 |
320 |
321 | library\lib\x86
322 | 1
323 |
324 |
325 |
326 |
327 | 1
328 |
329 |
330 | 1
331 |
332 |
333 | 1
334 |
335 |
336 |
337 |
338 | 1
339 |
340 |
341 | 1
342 |
343 |
344 | 1
345 |
346 |
347 |
348 |
349 | library\lib\armeabi
350 | 1
351 |
352 |
353 |
354 |
355 | 0
356 |
357 |
358 | 1
359 |
360 |
361 | Contents\MacOS
362 | 1
363 |
364 |
365 |
366 |
367 | 1
368 |
369 |
370 | 1
371 |
372 |
373 | 1
374 |
375 |
376 |
377 |
378 | res\drawable-normal
379 | 1
380 |
381 |
382 |
383 |
384 | res\drawable-xhdpi
385 | 1
386 |
387 |
388 |
389 |
390 | res\drawable-large
391 | 1
392 |
393 |
394 |
395 |
396 | 1
397 |
398 |
399 | 1
400 |
401 |
402 | 1
403 |
404 |
405 |
406 |
407 | ../
408 | 1
409 |
410 |
411 | ../
412 | 1
413 |
414 |
415 |
416 |
417 | res\drawable-hdpi
418 | 1
419 |
420 |
421 |
422 |
423 | library\lib\armeabi-v7a
424 | 1
425 |
426 |
427 |
428 |
429 | Contents
430 | 1
431 |
432 |
433 |
434 |
435 | ../
436 | 1
437 |
438 |
439 |
440 |
441 | 1
442 |
443 |
444 | 1
445 |
446 |
447 | 1
448 |
449 |
450 |
451 |
452 | res\values
453 | 1
454 |
455 |
456 |
457 |
458 | res\drawable-small
459 | 1
460 |
461 |
462 |
463 |
464 | res\drawable
465 | 1
466 |
467 |
468 |
469 |
470 | 1
471 |
472 |
473 | 1
474 |
475 |
476 | 1
477 |
478 |
479 |
480 |
481 | 1
482 |
483 |
484 |
485 |
486 | res\drawable
487 | 1
488 |
489 |
490 |
491 |
492 | 0
493 |
494 |
495 | 0
496 |
497 |
498 | Contents\Resources\StartUp\
499 | 0
500 |
501 |
502 | 0
503 |
504 |
505 | 0
506 |
507 |
508 | 0
509 |
510 |
511 |
512 |
513 | library\lib\armeabi-v7a
514 | 1
515 |
516 |
517 |
518 |
519 | 0
520 | .bpl
521 |
522 |
523 | 1
524 | .dylib
525 |
526 |
527 | Contents\MacOS
528 | 1
529 | .dylib
530 |
531 |
532 | 1
533 | .dylib
534 |
535 |
536 | 1
537 | .dylib
538 |
539 |
540 |
541 |
542 | res\drawable-mdpi
543 | 1
544 |
545 |
546 |
547 |
548 | res\drawable-xlarge
549 | 1
550 |
551 |
552 |
553 |
554 | res\drawable-ldpi
555 | 1
556 |
557 |
558 |
559 |
560 | 1
561 |
562 |
563 | 1
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 |
572 |
573 |
574 |
575 | False
576 | False
577 | False
578 | False
579 | False
580 | True
581 | False
582 |
583 |
584 | 12
585 |
586 |
587 |
588 |
589 |
590 |
--------------------------------------------------------------------------------
/PackagesGenerator.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/errorcalc/PackagesGenerator/e3a577ed22130611bf996a6b0fa9d05b59d02175/PackagesGenerator.exe
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PackagesGenerator
2 | PackagesGenerator for Delphi - Automatic Generator Package files for multiple versions of Delphi.
3 |
4 | ## What is it
5 | PackagesGenerator for Delphi
6 |
7 | If you are writing a components for Delphi, then you know how difficult it is to maintain multiple versions of Delphi.
8 | Usually you get a lot of almost identical **dpk**, **dproj**, **groupproj** files for different versions of Delphi,
9 | **For example:**
10 | ```
11 | MyComponents_XE2.groupproj
12 | MyComponents_XE2.dpk
13 | MyComponents_XE2.dproj
14 | MyComponentsDesign_XE2.dpk
15 | MyComponentsDesign_XE2.dproj
16 | MyComponents_XE3.groupproj
17 | MyComponents_XE3.dpk
18 | MyComponents_XE3.dproj
19 | MyComponentsDesign_XE3.dpk
20 | MyComponentsDesign_XE3.dproj
21 | ...
22 | MyComponentsDesign_RX12Athens.dproj
23 | ```
24 | **Tiring create these files manually, also you can make mistakes.**
25 |
26 | ErrorSoft PackagesGenerator can solve this problem!
27 | The PackagesGenerator itself generates the necessary files, doing the necessary internal changes (LIBSUFFUX, contains ...).
28 |
29 | **Сonversion parameters are set in the INI file (Example):**
30 | ```
31 | [Folders]
32 | Base=Source\ <- the path to the original files
33 | Gen=Packages\ <- the path to the generated files
34 | GroupAbove=True
35 |
36 | [Versions]
37 | RX12Athens=290
38 | RX11Alexandria=280
39 | RX10Sydney=270
40 | RX10Rio=260
41 | RX10Tokyo=250
42 | RX10Berlin=240
43 | RX10Seattle=230
44 | XE8=220
45 | XE7=210
46 | XE6=200
47 | XE5=190
48 | XE4=180
49 | XE3=170
50 | XE2=160
51 |
52 | [Files]
53 | MyComponents.groupproj
54 | MyComponentsDesign.dpk
55 | MyComponents.dpk
56 | MyComponentsDesign.dproj
57 | MyComponents.dproj
58 | ```
59 | **This ini and PackagesGenerator generate all necessary files!**
60 |
61 | ## Command Line parameters
62 |
63 | ### -config "path to ini file"
64 | * If not specified, will be selected **PackagesGenerator.ini** from the current directory
65 | * This option must be the first
66 |
67 | ### -hide
68 | * Hide output
69 |
70 | ### -skip
71 | * Close program after completely done
72 |
73 | ## Example:
74 | For example see https://github.com/errorcalc/FreeEsVclComponents, "Packages" dir.
75 |
76 | ## License:
77 |
78 | This project has three licenses, you can select one of three license:
79 |
80 | 1) Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License.
81 | That means that you can use the product for non commercial purposes.
82 | (example: Personal use, Study, Open Source,...)
83 |
84 | 2) GNU GPL v3: https://www.gnu.org/licenses/gpl.html, only for opensource projects uses GNU GPL license
85 |
86 | 3) ErrorSoft PackagesGenerator Commercial license.(see LICENSE.TXT)
87 | $10 for individual developers, $50 for company.
88 | Email: dr.enter256@gmail.com for contacts.
89 |
--------------------------------------------------------------------------------