├── .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 | --------------------------------------------------------------------------------