Componentes.Terceros.jcl/official/1.100/install/JclInstall.pas

3492 lines
128 KiB
ObjectPascal

{**************************************************************************************************}
{ }
{ Project JEDI Code Library (JCL) extension }
{ }
{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); }
{ you may not use this file except in compliance with the License. You may obtain a copy of the }
{ License at http://www.mozilla.org/MPL/ }
{ }
{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF }
{ ANY KIND, either express or implied. See the License for the specific language governing rights }
{ and limitations under the License. }
{ }
{ The Original Code is JclInstall.pas. }
{ }
{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are }
{ Copyright (C) of Petr Vones. All Rights Reserved. }
{ }
{ Contributor(s): }
{ - Robert Rossmair - crossplatform & BCB support, refactoring }
{ - Florent Ouchet (outchy) - New installer core for .net compilation }
{ }
{ Last modified: $Date: 2007-06-16 20:31:47 +0200 (sam., 16 juin 2007) $ }
{ }
{**************************************************************************************************}
unit JclInstall;
interface
{$I jcl.inc}
{$I crossplatform.inc}
uses
SysUtils, Classes, Contnrs,
JclSysUtils, JclBorlandTools, JediInstall;
type
TJclOption = (
joLibrary,
joDef,
joDefMath,
joDefDebug,
joDefEDI,
joDefPCRE,
joDefBZip2,
joDefThreadSafe,
joDefDropObsoleteCode,
joDefUnitVersioning,
joDefMathPrecSingle,
joDefMathPrecDouble,
joDefMathPrecExtended,
joDefMathExtremeValues,
joDefHookDllExceptions,
joDefDebugNoBinary,
joDefDebugNoTD32,
joDefDebugNoMap,
joDefDebugNoExports,
joDefDebugNoSymbols,
joDefEDIWeakPackageUnits,
joDefPCREStaticLink,
joDefPCRELinkDLL,
joDefPCRELinkOnRequest,
joDefBZip2StaticLink,
joDefBZip2LinkDLL,
joDefBZip2LinkOnRequest,
joEnvironment,
joEnvLibPath,
joEnvBrowsingPath,
joEnvDebugDCUPath,
joMake,
joMakeRelease,
joMakeReleaseVClx,
joMakeReleaseVCL,
joMakeDebug,
joMakeDebugVClx,
joMakeDebugVCL,
joCopyHppFiles,
joPackages,
joDualPackages,
joCopyPackagesHppFiles,
joPdbCreate,
joMapCreate,
joJdbgCreate,
joJdbgInsert,
joMapDelete,
joExperts,
joExpertsDsgnPackages,
joExpertsDLL,
joExpertDebug,
joExpertAnalyzer,
joExpertFavorite,
joExpertRepository,
joExpertThreadNames,
joExpertUses,
joExpertSimdView,
joExpertVersionControl,
joExceptDlg,
joExceptDlgVCL,
joExceptDlgVCLSnd,
joExceptDlgCLX,
joHelp,
joHelpHlp,
joHelpChm,
joHelpHxS,
joHelpHxSPlugin,
joMakeDemos);
TJclDistribution = class;
TJclInstallation = class
private
// identification
FDistribution: TJclDistribution;
FTarget: TJclBorRADToolInstallation;
FCLRVersion: string;
FTargetName: string;
FTargetPlatform: TJclBorPlatform;
FGUIPage: IJediInstallPage;
FGUI: IJediInstallGUI;
FGUIBPLPathIndex: Integer;
FGUIDCPPathIndex: Integer;
FDebugDcuDir: string;
FLibDir: string;
FLibObjDir: string;
FJclDcpPath: string;
FDemoList: TStringList;
FLogLines: TJclSimpleLog;
FDemoSectionName: string;
FLogFileName: string;
FSilent: Boolean;
procedure AddDemo(const Directory: string; const FileInfo: TSearchRec);
procedure AddDemos(const Directory: string);
function GetDemoList: TStringList;
function MakePath(const FormatStr: string): string;
procedure WriteLog(const Msg: string);
function GetEnabled: Boolean;
protected
// if CLRVersion = '' then it is a native installation
constructor Create(JclDistribution: TJclDistribution;
InstallTarget: TJclBorRADToolInstallation; const ACLRVersion: string = '';
ATargetPlatform: TJclBorPlatform = bp32bit; AGUIPage: IJediInstallPage = nil);
function CompileLibraryUnits(const SubDir: string; Debug: Boolean): Boolean;
{$IFDEF MSWINDOWS}
function CompileCLRPackage(const Name: string): Boolean;
{$ENDIF MSWINDOWS}
function CompilePackage(const Name: string; InstallPackage: Boolean): Boolean;
function CompileApplication(FileName: string): Boolean;
function UninstallPackage(const Name: string): Boolean;
procedure ConfigureBpr2Mak(const PackageFileName: string);
{$IFDEF MSWINDOWS}
function CompileExpert(const Name: string; InstallExpert: Boolean): Boolean;
function UninstallExpert(const Option: TJclOption): Boolean;
{$ENDIF MSWINDOWS}
function GetBplPath: string;
function GetDcpPath: string;
function GetOptionChecked(Option: TJclOption): Boolean; overload;
function GetOptionCheckedById(Id: Integer): Boolean; overload;
procedure MarkOptionBegin(Id: Integer); overload;
procedure MarkOptionBegin(Option: TJclOption); overload;
procedure MarkOptionEnd(Id: Integer; Success: Boolean); overload;
procedure MarkOptionEnd(Option: TJclOption; Success: Boolean); overload;
public
destructor Destroy; override;
procedure Close;
procedure Init;
function RemoveSettings: Boolean;
function Install: Boolean;
function Uninstall(AUninstallHelp: Boolean): Boolean;
property Distribution: TJclDistribution read FDistribution;
property Target: TJclBorRADToolInstallation read FTarget;
property CLRVersion: string read FCLRVersion;
property TargetName: string read FTargetName;
property GUIPage: IJediInstallPage read FGUIPage;
property GUI: IJediInstallGUI read FGUI;
property TargetPlatform: TJclBorPlatform read FTargetPlatform;
property Enabled: Boolean read GetEnabled;
property OptionCheckedById[Id: Integer]: Boolean read GetOptionCheckedById;
property OptionChecked[Option: TJclOption]: Boolean read GetOptionChecked;
property LogFileName: string read FLogFileName;
property Silent: Boolean read FSilent write FSilent;
end;
TJclDistribution = class (TInterfacedObject, IJediProduct)
private
FJclPath: string;
FJclBinDir: string;
FLibDirMask: string;
FLibDebugDirMask: string;
FLibObjDirMask: string;
FJclSourceDir: string;
FJclSourcePath: string;
FJclExamplesDir: string;
FClxDialogFileName: string;
FClxDialogIconFileName: string;
FVclDialogFileName: string;
FVclDialogSendFileName: string;
FVclDialogIconFileName: string;
FVclDialogSendIconFileName: string;
FJclChmHelpFileName: string;
FJclHlpHelpFileName: string;
FJclHxSHelpFileName: string;
FJclReadmeFileName: string;
FGUI: IJediInstallGUI;
FNbEnabled: Integer;
FNbInstalled: Integer;
{$IFDEF MSWINDOWS}
FCLRVersions: TStrings;
FRegHelpCommands: TStrings;
{$ENDIF MSWINDOWS}
FRadToolInstallations: TJclBorRADToolInstallations;
FTargetInstalls: TObjectList;
{ FIniFile: TMemIniFile;
FOnStarting: TInstallationEvent;
FOnEnding: TInstallationEvent;
FInstalling: Boolean;
function CreateInstall(Target: TJclBorRADToolInstallation): Boolean;
function GetTargetInstall(Installation: TJclBorRADToolInstallation): TJclInstallation;
procedure InitInstallationTargets; }
function GetVersion: string;
{protected
constructor Create;
function DocFileName(const BaseFileName: string): string;
procedure SetTool(const Value: IJediInstallTool);
property TargetInstall[Target: TJclBorRADToolInstallation]: TJclInstallation read GetTargetInstall;
public
destructor Destroy; override;
function FeatureInfoFileName(FeatureID: Cardinal): string;
function GetHint(Option: TJediInstallOption): string;
function InitInformation(const ApplicationFileName: string): Boolean;
function Install: Boolean;
function Uninstall: Boolean;
function ReadmeFileName: string;
procedure SetOnWriteLog(Installation: TJclBorRADToolInstallation; Value: TTextHandler);
procedure SetOnEnding(Value: TInstallationEvent);
procedure SetOnStarting(Value: TInstallationEvent);
function Supports(Target: TJclBorRADToolInstallation): Boolean;
property BinDir: string read FJclBinDir;
property ChmHelpFileName: string read FJclChmHelpFileName;
property HlpHelpFileName: string read FJclHlpHelpFileName;
property HxSHelpFileName: string read FJclHxSHelpFileName;
property Installing: Boolean read FInstalling;
property Path: string read FJclPath;
property SourceDir: string read FJclSourceDir;
property Tool: IJediInstallTool read FTool write SetTool;}
property Version: string read GetVersion;
function CreateInstall(Target: TJclBorRADToolInstallation): Boolean;
function GetTargetInstall(Index: Integer): TJclInstallation;
function GetTargetInstallCount: Integer;
{$IFDEF MSWINDOWS}
procedure RegHelpInternalAdd(Command: Integer; Arguments: string; DoNotRepeatCommand: Boolean);
function RegHelpExecuteCommands(DisplayErrors: Boolean): Boolean;
procedure RegHelpClearCommands;
{$ENDIF MSWINDOWS}
public
constructor Create;
destructor Destroy; override;
{$IFDEF MSWINDOWS}
procedure RegHelpCreateTransaction;
procedure RegHelpCommitTransaction;
procedure RegHelpRegisterNameSpace(const Name, Collection, Description: WideString);
procedure RegHelpUnregisterNameSpace(const Name: WideString);
procedure RegHelpRegisterHelpFile(const NameSpace, Identifier: WideString;
const LangId: Integer; const HxSFile, HxIFile: WideString);
procedure RegHelpUnregisterHelpFile(const NameSpace, Identifier: WideString;
const LangId: Integer);
procedure RegHelpPlugNameSpaceIn(const SourceNameSpace, TargetNameSpace: WideString);
procedure RegHelpUnPlugNameSpace(const SourceNameSpace, TargetNameSpace: WideString);
{$ENDIF MSWINDOWS}
// IJediProduct
procedure Init;
procedure Install;
procedure Uninstall;
procedure Close;
property JclPath: string read FJclPath;
property JclBinDir: string read FJclBinDir;
property LibDirMask: string read FLibDirMask;
property LibDebugDirMask: string read FLibDebugDirMask;
property LibObjDirMask: string read FLibObjDirMask;
property JclSourceDir: string read FJclSourceDir;
property JclSourcePath: string read FJclSourcePath;
property JclExamplesDir: string read FJclExamplesDir;
property ClxDialogFileName: string read FClxDialogFileName;
property ClxDialogIconFileName: string read FClxDialogIconFileName;
property VclDialogFileName: string read FVclDialogFileName;
property VclDialogSendFileName: string read FVclDialogSendFileName;
property VclDialogIconFileName: string read FVclDialogIconFileName;
property VclDialogSendIconFileName: string read FVclDialogSendIconFileName;
property JclChmHelpFileName: string read FJclChmHelpFileName;
property JclHlpHelpFileName: string read FJclHlpHelpFileName;
property JclHxSHelpFileName: string read FJclHxSHelpFileName;
property JclReadmeFileName: string read FJclReadmeFileName;
{$IFDEF MSWINDOWS}
property CLRVersions: TStrings read FCLRVersions;
{$ENDIF MSWINDOWS}
property RadToolInstallations: TJclBorRADToolInstallations read FRadToolInstallations;
property TargetInstalls[Index: Integer]: TJclInstallation read GetTargetInstall;
property TargetInstallCount: Integer read GetTargetInstallCount;
property GUI: IJediInstallGUI read FGUI;
property NbEnabled: Integer read FNbEnabled;
property NbInstalled: Integer read FNbInstalled;
end;
implementation
uses
TypInfo,
JclBase, JclResources, JclSysInfo,
{$IFDEF MSWINDOWS}
Windows,
JclPeImage,
JclRegistry,
JclDebug,
JclDotNet,
JclSecurity,
JediRegInfo,
JclShell,
{$ENDIF MSWINDOWS}
JclFileUtils, JclStrings;
resourcestring
// Names
RsNameBPLPath = 'BPL-Path';
RsNameDCPPath = 'DCP-Path';
RsNameBPIPath = 'BPI-Path';
// Captions
RsCaptionOutputPath = '&Output path:';
RsCaptionBPLPath = '&BPL path:';
RsCaptionDCPPath = '&DCP path:';
RsCaptionBPIPath = 'BP&I path:';
// Products
RsCaptionLibrary = 'JEDI Code Library';
// Conditional features
RsCaptionDef = 'Conditional defines';
RsCaptionDefThreadSafe = 'Enable thread safe code';
RsCaptionDefDropObsoleteCode = 'Drop obsolete code';
RsCaptionDefUnitVersioning = 'Include Unit Versioning';
// math options
RsCaptionDefMath = 'Math options';
RsCaptionDefMathPrecSingle = 'Single float precision';
RsCaptionDefMathPrecDouble = 'Double float precision';
RsCaptionDefMathPrecExtended = 'Extended float precision';
RsCaptionDefMathExtremeValues = 'Support for infinite and NaN';
// debug options
RsCaptionDefDebug = 'Debug and exception hooking options';
RsCaptionDefHookDllExceptions = 'Hook exceptions in DLL';
RsCaptionDefDebugNoBinary = 'No debug source from Jedi debug informations';
RsCaptionDefDebugNoTD32 = 'No debug source from TD32 debug symbols';
RsCaptionDefDebugNoMap = 'No debug source from Map files';
RsCaptionDefDebugNoExports = 'No debug source from function export table for libraries';
RsCaptionDefDebugNoSymbols = 'No debug source from Microsoft debug symbols';
// EDI options
RsCaptionDefEDI = 'EDI options';
RsCaptionDefEDIWeakPackageUnits = 'EDI weak package units';
// PCRE options
RsCaptionDefPCRE = 'PCRE options';
RsCaptionDefPCREStaticLink = 'Static link to PCRE code';
RsCaptionDefPCRELinkDLL = 'Static bind to pcre.dll';
RsCaptionDefPCRELinkOnRequest = 'Late bind to pcre.dll';
// BZip2 options
RsCaptionDefBZip2 = 'BZip2 options';
RsCaptionDefBZip2StaticLink = 'Static link to BZip2 code (experimental)';
RsCaptionDefBZip2LinkDLL = 'Static bind to bzip2.dll';
RsCaptionDefBZip2LinkOnRequest = 'Late bind to bzip2.dll';
// post compilation
RsCaptionPdbCreate = 'Create PDB debug information';
RsCaptionMapCreate = 'Create MAP files';
RsCaptionJdbgCreate = 'Create Jedi Debug Informations';
RsCaptionJdbgInsert = 'Insert Jedi Debug Informations in the libraries';
RsCaptionMapDelete = 'Do not keep MAP files';
// environment
RsCaptionEnvironment = 'Environment';
RsCaptionEnvLibPath = 'Add JCL to IDE Library Path';
RsCaptionEnvBrowsingPath = 'Add JCL to IDE Browsing Path';
RsCaptionEnvDebugDCUPath = 'Add JCL to Debug DCU Path';
// make units
RsCaptionMake = 'Make library units';
RsCaptionMakeRelease = 'Release';
RsCaptionMakeDebug = 'Debug';
RsCaptionMakeVClx = 'Visual CLX';
RsCaptionMakeVCL = 'Visual Component Library';
RsCaptionCopyHppFiles = 'Copy HPP files to %s';
// packages
RsCaptionPackages = 'Packages';
RsCaptionDualPackages = 'Dual packages';
RsCaptionCopyPackagesHppFiles = 'Output HPP files to %s';
// exception dialogs
RsCaptionExceptDlg = 'Sample Exception Dialogs in the Object Repository';
RsCaptionExceptDlgVCL = 'VCL Exception Dialog';
RsCaptionExceptDlgVCLSnd = 'VCL Exception Dialog with Send button';
RsCaptionExceptDlgCLX = 'CLX Exception Dialog';
// experts
RsCaptionExperts = 'IDE experts';
RsCaptionExpertsDsgnPackages = 'Design packages';
RsCaptionExpertsDLL = 'DLL experts';
RsCaptionExpertDebug = 'Debug Extension';
RsCaptionExpertAnalyzer = 'Project Analyzer';
RsCaptionExpertFavorite = 'Favorite combobox in Open/Save dialogs';
RsCaptionExpertRepository = 'Exception dialog expert';
RsCaptionExpertThreadNames = 'Displaying thread names in Thread Status window';
RsCaptionExpertUses = 'Uses Wizard';
RsCaptionExpertSimdView = 'Debug window for XMM registers';
RsCaptionExpertVersionControl = 'Version control';
// help
RsCaptionHelp = 'Help files';
RsCaptionHelpHlp = 'Add help file to IDE help system';
RsCaptionHelpChm = 'Add HTML help to the Tools menu';
RsCaptionHelpHxS = 'Register help 2.0 files';
RsCaptionHelpHxSPlugin = 'Plug help 2.0 files in the Borland help system';
// demos
RsCaptionMakeDemos = 'Make demos';
// Hints
// products
RsHintLibrary = 'Select to install JCL for this target.';
// conditional defines
RsHintDef = 'Enable or disable specific features to be compiled';
RsHintDefThreadSafe = 'Conditionally some pieces of code to be thread safe, the ThreadSafe.txt file contains more informations about this feature';
RsHintDefDropObsoleteCode = 'Do not compile deprecated code';
RsHintDefUnitVersioning = 'Includes JCL Unit Versioning informations into each JCL unit (see also JclUnitVersioning.pas)';
// math options
RsHintDefMath = 'Math specific options (JclMath.pas)';
RsHintDefMathPrecSingle = 'type Float = Single';
RsHintDefMathPrecDouble = 'type Float = Double';
RsHintDefMathPrecExtended = 'type Float = Extended';
RsHintDefMathExtremeValues = 'Exp en Power functions accept and return infinite and NaN';
// Debug options
RsHintDefDebug = 'Debug and exception hooking specific options (JclDebug.pas and JclHookExcept.pas)';
RsHintDefHookDllExceptions = 'Hook exceptions raised in DLL compiled with the JCL';
RsHintDefDebugNoBinary = 'Disable support for JDBG files';
RsHintDefDebugNoMap = 'Disable support for MAP files';
RsHintDefDebugNoTD32 = 'Disable support for TD32 informations';
RsHintDefDebugNoExports = 'Disable support for export names of libraries';
RsHintDefDebugNoSymbols = 'Disable support for Microsoft debug symbols (PDB and DBG files)';
// EDI options
RsHintDefEDI = 'EDI specific options (JclEDI*.pas)';
RsHintDefEDIWeakPackageUnits = 'Mark EDI units as weak package units (check if you use the original EDI package)';
// PCRE options
RsHintDefPCRE = 'PCRE specific options (pcre.pas and JclPCRE.pas)';
RsHintDefPCREStaticLink = 'Code from PCRE is linked into JCL binaries';
RsHintDefPCRELinkDLL = 'JCL binaries require pcre.dll to be present';
RsHintDefPCRELinkOnRequest = 'JCL binaries require pcre.dll when calling PCRE functions';
// BZip2 options
RsHintDefBZip2 = 'BZip2 specific options (bzip2.pas)';
RsHintDefBZip2StaticLink = 'Code from BZip2 is linked into JCL binaries';
RsHintDefBZip2LinkDLL = 'JCL binaries require bzip2.dll to be present';
RsHintDefBZip2LinkOnRequest = 'JCL binaries require bzip2.dll when calling PCRE functions';
// post compilation
RsHintPdbCreate = 'Create detailed debug information for libraries';
RsHintMapCreate = 'Create detailed MAP files for each libraries';
RsHintJdbgCreate = 'Create Jedi Debug Informations from the MAP files';
RsHintJdbgInsert = 'Insert Jedi Debug Informations into the libraries (only the BPL has to be redistributed)';
RsHintMapDelete = 'The original MAP file is not kept once Jedi Debug Informations are generated';
// environment
RsHintEnvironment = 'Set selected environment items';
RsHintEnvLibPath = 'Add JCL precompiled unit directories to library path';
RsHintEnvBrowsingPath = 'Add JCL source directories to browsing path';
RsHintEnvDebugDCUPath = 'This is a prerequisite for using the precompiled JCL debug units by means of the respective' + AnsiLineBreak +
'Project Options|Compiler switch. See "Make library units/Debug" option below.';
// make units
RsHintMake = 'Generate .dcu and .dpu (Kylix only) files.' + AnsiLineBreak + 'Recommended.';
RsHintMakeRelease = 'Make precompiled units for release, i.e. optimized, w/o debug information.';
RsHintMakeReleaseVcl = 'Make precompiled VCL units for release';
RsHintMakeReleaseVClx = 'Make precompiled Visual CLX units for release';
RsHintMakeDebug = 'Make precompiled units for debugging, i.e.optimization off, debug information included.' + AnsiLineBreak +
'When installed, available through Project Options|Compiler|Use Debug DCUs.';
RsHintMakeDebugVcl = 'Make precompiled VCL units for debugging';
RsHintMakeDebugVClx = 'Make precompiled Visual CLX units for debugging';
RsHintCopyHppFiles = 'Copy .hpp files into C++Builder''s include path.';
// packages
RsHintPackages = 'Build and eventually install JCL runtime packages (RTL, VCL and Visual ' +
'CLX) and optional IDE experts.';
RsHintDualPackages = 'The same package introduce component for Delphi Win32 and C++Builder Win32';
RsHintCopyPackagesHppFiles = 'Output .hpp files into C++Builder''s include path instead of ' +
'the source paths.';
// exception dialogs
RsHintExceptDlg = 'Add selected Exception dialogs to the Object Repository.';
RsHintExceptDlgVCL = 'Add VCL exception dialog to the Object Repository.';
RsHintExceptDlgVCLSnd = 'Add VCL exception dialog with "Send Button" to the Object Repository.';
RsHintExceptDlgCLX = 'Add CLX exception dialog (Windows only) to the Object Repository.';
// experts
RsHintExperts = 'Build and install selected IDE experts.';
RsHintExpertsDsgnPackages = 'Design packages containing JCL experts';
RsHintExpertsDLL = 'DLLs containing JCL experts';
RsHintExpertDebug = 'Install IDE expert which assists to insert JCL Debug information into executable files.';
RsHintExpertAnalyzer = 'Install IDE Project Analyzer.';
RsHintExpertFavorite = 'Install "Favorites" combobox in IDE Open/Save dialogs.';
RsHintExpertRepository = 'Repository expert to easily create exception dialogs';
RsHintExpertThreadNames = 'Display thread names in Thread Status window IDE extension.';
RsHintExpertUses = 'Install IDE Uses Wizard.';
RsHintExpertSimdView = 'Install a debug window of XMM registers (used by SSE instructions)';
RsHintExpertVersionControl = 'Integration of TortoiseCVS and TortoiseSVN in the IDE';
// help
RsHintHelp = 'Install JCL help files.';
RsHintHelpHlp = 'Customize Borland Open Help to include JCL help files.';
RsHintHelpChm = 'Compiled help files won''t be merged with the IDE help';
RsHintHelpHxS = 'Register Help 2.0 files';
RsHintHelpHxSPlugin = 'Register Help 2.0 files as a plugin for the Borland.BDS* namespace';
// demos
RsHintMakeDemos = 'Make JCL demo applications';
// warning messages
RsWarningPackageNodeNotSelected = 'The "Packages" node is not selected.' + sLineBreak +
'Various libraries (including the JVCL) require JCL packages to be compiled' + sLineBreak +
'Do you want to continue without compiling JCL packages?';
RsWarningCreatePath = 'The path where %s files will be created doesn''t exists.' + sLineBreak +
'Do you want the JCL installer to create it?';
RsErrorCantCreatePath = 'The path %s cannot be created';
RsWarningAddPathToEnvironment = 'The path where BPL are created must be present in the PATH' + sLineBreak +
'environment variable, otherwise JCL packages won''t be found by the IDE.' + sLineBreak +
'Do you want the JCL installer to add it?' + sLineBreak +
'You will have to reboot your computer and/or to close your session to validate this change';
RsHtmlHelp2Credentials = 'Registering HTML Help 2.0 files requires administrator privilege to be performed' + sLineBreak +
'The RegHelper.exe utility will make this operation';
type
TOptionRec = record
Id: Integer;
Caption: string;
Hint: string;
end;
var
OptionData: array[TJclOption] of TOptionRec =
(
(Id: -1; Caption: RsCaptionLibrary; Hint: RsHintLibrary), // joLibrary
(Id: -1; Caption: RsCaptionDef; Hint: RsHintDef), // joDef
(Id: -1; Caption: RsCaptionDefMath; Hint: RsHintDefMath), // joDefMath
(Id: -1; Caption: RsCaptionDefDebug; Hint: RsHintDefDebug), // joDefDebug
(Id: -1; Caption: RsCaptionDefEDI; Hint: RsHintDefEDI), // joDefEDI
(Id: -1; Caption: RsCaptionDefPCRE; Hint: RsHintDefPCRE), // joDefPCRE
(Id: -1; Caption: RsCaptionDefBZip2; Hint: RsHintDefBZip2), // joDefBZip2
(Id: -1; Caption: RsCaptionDefThreadSafe; Hint: RsHintDefThreadSafe), // joDefThreadSafe
(Id: -1; Caption: RsCaptionDefDropObsoleteCode; Hint: RsHintDefDropObsoleteCode), // joDefDropObsoleteCode
(Id: -1; Caption: RsCaptionDefUnitVersioning; Hint: RsHintDefUnitVersioning), // joDefUnitVersioning
(Id: -1; Caption: RsCaptionDefMathPrecSingle; Hint: RsHintDefMathPrecSingle), // ioDefMathPrecSingle
(Id: -1; Caption: RsCaptionDefMathPrecDouble; Hint: RsHintDefMathPrecDouble), // joDefMathPrecDouble
(Id: -1; Caption: RsCaptionDefMathPrecExtended; Hint: RsHintDefMathPrecExtended), // joDefMathPrecExtended
(Id: -1; Caption: RsCaptionDefMathExtremeValues; Hint: RsHintDefMathExtremeValues), // joDefMathExtremeValues
(Id: -1; Caption: RsCaptionDefHookDllExceptions; Hint: RsHintDefHookDllExceptions), // joDefHookDllExceptions
(Id: -1; Caption: RsCaptionDefDebugNoBinary; Hint: RsHintDefDebugNoBinary), // joDefDebugNoBinary
(Id: -1; Caption: RsCaptionDefDebugNoTD32; Hint: RsHintDefDebugNoTD32), // joDefDebugNoTD32
(Id: -1; Caption: RsCaptionDefDebugNoMap; Hint: RsHintDefDebugNoMap), // joDefDebugNoMap
(Id: -1; Caption: RsCaptionDefDebugNoExports; Hint: RsHintDefDebugNoExports), // joDefDebugNoExports
(Id: -1; Caption: RsCaptionDefDebugNoSymbols; Hint: RsHintDefDebugNoSymbols), // joDefDebugNoSymbols
(Id: -1; Caption: RsCaptionDefEDIWeakPackageUnits; Hint: RsHintDefEDIWeakPackageUnits), // joDefEDIWeakPackageUnits
(Id: -1; Caption: RsCaptionDefPCREStaticLink; Hint: RsHintDefPCREStaticLink), // joDefPCREStaticLink
(Id: -1; Caption: RsCaptionDefPCRELinkDLL; Hint: RsHintDefPCRELinkDLL), // joDefPCRELinkDLL
(Id: -1; Caption: RsCaptionDefPCRELinkOnRequest; Hint: RsHintDefPCRELinkOnRequest), // joDefPCRELinkOnRequest
(Id: -1; Caption: RsCaptionDefBZip2StaticLink; Hint: RsHintDefBZip2StaticLink), // joDefBZip2StaticLink
(Id: -1; Caption: RsCaptionDefBZip2LinkDLL; Hint: RsHintDefBZip2LinkDLL), // joDefBZip2LinkDLL
(Id: -1; Caption: RsCaptionDefBZip2LinkOnRequest; Hint: RsHintDefBZip2LinkOnRequest), // joDefBZip2LinkOnRequest
(Id: -1; Caption: RsCaptionEnvironment; Hint: RsHintEnvironment), // joEnvironment
(Id: -1; Caption: RsCaptionEnvLibPath; Hint: RsHintEnvLibPath), // joEnvLibPath
(Id: -1; Caption: RsCaptionEnvBrowsingPath; Hint: RsHintEnvBrowsingPath), // joEnvBrowsingPath
(Id: -1; Caption: RsCaptionEnvDebugDCUPath; Hint: RsHintEnvDebugDCUPath), // joEnvDebugDCUPath
(Id: -1; Caption: RsCaptionMake; Hint: RsHintMake), // joMake
(Id: -1; Caption: RsCaptionMakeRelease; Hint: RsHintMakeRelease), // joMakeRelease
(Id: -1; Caption: RsCaptionMakeVClx; Hint: RsHintMakeReleaseVClx), // joMakeReleaseVClx
(Id: -1; Caption: RsCaptionMakeVCL; Hint: RsHintMakeReleaseVCL), // joMakeReleaseVCL
(Id: -1; Caption: RsCaptionMakeDebug; Hint: RsHintMakeDebug), // joMakeDebug
(Id: -1; Caption: RsCaptionMakeVClx; Hint: RsHintMakeDebugVClx), // joMakeDebugVClx
(Id: -1; Caption: RsCaptionMakeVCL; Hint: RsHintMakeDebugVCL), // joMakeDebugVCL
(Id: -1; Caption: RsCaptionCopyHppFiles; Hint: RsHintCopyHppFiles), // joCopyHppFiles
(Id: -1; Caption: RsCaptionPackages; Hint: RsHintPackages), // joPackages
(Id: -1; Caption: RsCaptionDualPackages; Hint: RsHintDualPackages), // joDualPackages
(Id: -1; Caption: RsCaptionCopyPackagesHppFiles; Hint: RsHintCopyPackagesHppFiles), // joCopyPackagesHppFiles
(Id: -1; Caption: RsCaptionPdbCreate; Hint: RsHintPdbCreate), // joPdbCreate
(Id: -1; Caption: RsCaptionMapCreate; Hint: RsHintMapCreate), // joMapCreate
(Id: -1; Caption: RsCaptionJdbgCreate; Hint: RsHintJdbgCreate), // joJdbgCreate
(Id: -1; Caption: RsCaptionJdbgInsert; Hint: RsHintJdbgInsert), // joJdbgInsert
(Id: -1; Caption: RsCaptionMapDelete; Hint: RsHintMapDelete), // joMapDelete
(Id: -1; Caption: RsCaptionExperts; Hint: RsHintExperts), // joExperts
(Id: -1; Caption: RsCaptionExpertsDsgnPackages; Hint: RsHintExpertsDsgnPackages), // joExpertsDsgnPackages
(Id: -1; Caption: RsCaptionExpertsDLL; Hint: RsHintExpertsDLL), // joExpertsDLL
(Id: -1; Caption: RsCaptionExpertDebug; Hint: RsHintExpertDebug), // joExpertDebug
(Id: -1; Caption: RsCaptionExpertAnalyzer; Hint: RsHintExpertAnalyzer), // joExpertAnalyzer
(Id: -1; Caption: RsCaptionExpertFavorite; Hint: RsHintExpertFavorite), // joExpertFavorite
(Id: -1; Caption: RsCaptionExpertRepository; Hint: RsHintExpertRepository), // joExpertRepository
(Id: -1; Caption: RsCaptionExpertThreadNames; Hint: RsHintExpertThreadNames), // joExpertThreadNames
(Id: -1; Caption: RsCaptionExpertUses; Hint: RsHintExpertUses), // joExpertUses
(Id: -1; Caption: RsCaptionExpertSimdView; Hint: RsHintExpertSimdView), // joExpertSimdView
(Id: -1; Caption: RsCaptionExpertVersionControl; Hint: RsHintExpertVersionControl), // joExpertVersionControl
(Id: -1; Caption: RsCaptionExceptDlg; Hint: RsHintExceptDlg), // joExceptDlg
(Id: -1; Caption: RsCaptionExceptDlgVCL; Hint: RsHintExceptDlgVCL), // joExceptDlgVCL
(Id: -1; Caption: RsCaptionExceptDlgVCLSnd; Hint: RsHintExceptDlgVCLSnd), // joExceptDlgVCLSnd
(Id: -1; Caption: RsCaptionExceptDlgCLX; Hint: RsHintExceptDlgCLX), // joExceptDlgCLX
(Id: -1; Caption: RsCaptionHelp; Hint: RsHintHelp), // joHelp
(Id: -1; Caption: RsCaptionHelpHlp; Hint: RsHintHelpHlp), // joHelpHlp
(Id: -1; Caption: RsCaptionHelpChm; Hint: RsHintHelpChm), // joHelpChm
(Id: -1; Caption: RsCaptionHelpHxS; Hint: RsHintHelpHxS), // joHelpHxS
(Id: -1; Caption: RsCaptionHelpHxSPlugin; Hint: RsHintHelpHxSPlugin), // joHelpHxSPlugin
(Id: -1; Caption: RsCaptionMakeDemos; Hint: RsHintMakeDemos) // joMakeDemos
);
const
{$IFDEF KYLIX}
VersionDir = '/k%d';
VersionDirExp = '/k%%d';
{$ELSE}
VersionDir = '\%s';
VersionDirExp = '\%%s';
{$ENDIF}
JclDpk = 'Jcl';
JclVclDpk = 'JclVcl';
JclVClxDpk = 'JclVClx';
JediJclDpr = 'Jedi.Jcl';
JclExpertBase = 'JclBaseExpert';
JclExpertDebug = 'JclDebugExpert';
JclExpertAnalyzer = 'JclProjectAnalysisExpert';
JclExpertFavorite = 'JclFavoriteFoldersExpert';
JclExpertRepository = 'JclRepositoryExpert';
JclExpertThrNames = 'JclThreadNameExpert';
JclExpertUses = 'JclUsesExpert';
JclExpertSimdView = 'JclSIMDViewExpert';
JclExpertVersionControl = 'JclVersionControlExpert';
// JclExpertBdsExpertDpr = 'JclBdsExpert';
ExpertPaths: array[joExperts..joExpertVersionControl] of string =
(
JclExpertBase, '', '', JclExpertDebug, JclExpertAnalyzer,
JclExpertFavorite, JclExpertRepository, JclExpertThrNames,
JclExpertUses, JclExpertSimdView, JclExpertVersionControl
);
JclSrcDirWindows = 'windows';
JclSrcDirUnix = 'unix';
JclSrcDirVcl = 'vcl';
JclSrcDirCommon = 'common';
JclSrcDirVisClx = 'visclx';
BCBIncludePath = '%s' + DirSeparator + '%s' + DirSeparator + '$(BCB)' + DirDelimiter + 'include;$(BCB)' + DirDelimiter + 'include' + DirDelimiter + 'vcl';
{$IFDEF MSWINDOWS}
BCBObjectPath = '%s;%s;$(BCB)\Lib\Obj';
JclSourceDirs: array[0..3] of string = (JclSrcDirCommon, JclSrcDirWindows, JclSrcDirVcl, JclSrcDirVisClx);
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
BCBObjectPath = BCBIncludePath;
JclSourceDirs: array[0..2] of string = (JclSrcDirCommon, JclSrcDirUnix, JclSrcDirVisClx);
{$ENDIF UNIX}
ExceptDlgPath = 'experts' + DirDelimiter + 'debug' + DirDelimiter + 'dialog' + DirDelimiter;
ExceptDlgClxFileName = 'ClxExceptDlg.pas';
ExceptDlgVclFileName = 'ExceptDlg.pas';
ExceptDlgVclSndFileName = 'ExceptDlgMail.pas';
ExceptDlgClxName = 'CLX Exception Dialog';
ExceptDlgVclName = 'Exception Dialog';
ExceptDlgVclSndName = 'Exception Dialog with Send';
ExceptDlgDescription = 'JCL Application exception dialog';
ExceptDlgAuthor = 'Project JEDI';
ExceptDlgPage = 'Dialogs';
JclChmHelpFile = 'help' + DirDelimiter + 'JCLHelp.chm';
JclHlpHelpFile = 'help' + DirDelimiter + 'JCLHelp.hlp';
JclHxSHelpFile = 'help' + DirDelimiter + 'JCLHelp.HxS';
Help2NameSpace = 'Jedi.Jcl';
Help2Collection = 'JCLHelp_COL_MASTER.HxC';
Help2Description = 'JEDI Code Library';
Help2Identifier = 'JCLHelp';
Help2LangId = 1033; // en/english
Help2HxSFile = 'JCLHelp.HxS';
Help2HxIFile = 'JCLHelp.HxI';
JclHelpTitle = 'JCL %d.%d Help';
JclHelpIndexName = 'Jedi Code Library Reference';
HHFileName = 'HH.EXE';
{$IFDEF VisualCLX}
ReadmeFileName = 'Readme.html';
{$ELSE}
ReadmeFileName = 'Readme.txt';
{$ENDIF}
DailyRevisionFileName = 'daily_revision.log';
EntriesFileName1 = '.svn' + DirDelimiter + 'entries';
EntriesFileName2 = '_svn' + DirDelimiter + 'entries';
RsJclVersionMask = 'JCL %d.%d %s %s %d';
RsJclVersionBuild = 'Build';
RsJclVersionRevision = 'Revision';
RsJclVersionTesting = 'Testing';
RsJclVersionRelease = 'Release';
{$IFDEF MSWINDOWS}
Bcb2MakTemplate = 'packages\BCB.bmk';
{$ENDIF MSWINDOWS}
{$IFDEF KYLIX}
Bcb2MakTemplate = 'packages/bcb.gmk';
{$ENDIF KYLIX}
PathEnvironmentVar = 'PATH';
RegHKCUEnvironmentVar = 'Environment';
RegHKLMEnvironmentVar = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
resourcestring
RsInstallMessage = 'Installing %s...';
//RsStatusDetailMessage = 'Installing %s for %s...';
RsUninstallMessage = 'Removing %s...';
RsBuildingMessage = 'Building %s...';
//RsBuildingDemosMessage = 'Building demo projects...';
//RsBuildingDemosByTargetMessage = 'Building demo projects by %s...';
RsCompilingMessage = 'Compiling %s...';
//RsInstallFailed = 'Installation of %s failed, see %s for details.';
RsInvalidBplPath = 'Invalid BPL path "%s"';
RsInvalidDcpPath = 'Invalid DCP path "%s"';
RsLibDescriptor = '%s library %sunits for %s';
function FullPackageFileName(Target: TJclBorRADToolInstallation; const BaseName: string): string;
const
S = 'packages' + VersionDir + DirDelimiter + '%s';
begin
with Target do
begin
{$IFDEF KYLIX}
Result := Format(S + '%s', [VersionNumber, BaseName, PackageSourceFileExtension]);
{$ELSE KYLIX}
if SupportsLibSuffix then
Result := Format(S + '%s', [VersionNumberStr, BaseName, PackageSourceFileExtension])
else
Result := Format(S + '%s0%3:s', [VersionNumberStr, BaseName, VersionNumberStr, PackageSourceFileExtension]);
{$ENDIF KYLIX}
end;
end;
function FullLibraryFileName(Target: TJclBorRADToolInstallation; const BaseName: string): string;
const
S = 'packages' + VersionDir + DirDelimiter + '%s';
begin
with Target do
if SupportsLibSuffix then
Result := Format(S + 'DLL%s', [VersionNumberStr, BaseName, ProjectSourceFileExtension])
else
Result := Format(S + 'DLL%s0%3:s', [VersionNumberStr, BaseName, VersionNumberStr, ProjectSourceFileExtension]);
end;
//=== { TJclInstallation } ===================================================
constructor TJclInstallation.Create(JclDistribution: TJclDistribution;
InstallTarget: TJclBorRADToolInstallation; const ACLRVersion: string;
ATargetPlatform: TJclBorPlatform; AGUIPage: IJediInstallPage);
begin
inherited Create;
FTarget := InstallTarget;
if not Target.Valid then
Abort;
FDistribution := JclDistribution;
FCLRVersion := ACLRVersion;
FTargetPlatform := ATargetPlatform;
FTargetName := Target.Name;
if CLRVersion <> '' then
FTargetName := Format('%s CLR %s', [FTargetName, CLRVersion]);
case TargetPlatform of
//bp32bit:
// begin
// FTargetName := Format('%s %s', [FTargetName, Personality32Bit]);
// LibDirMask := LibDirMask + '.x86';
// end;
bp64bit:
begin
FTargetName := Format('%s %s', [FTargetName, Personality64Bit]);
end;
end;
FLibDir := MakePath(Distribution.LibDirMask);
FJclDcpPath := PathAddSeparator(MakePath(Distribution.LibDirMask));
FDebugDcuDir := MakePath(Distribution.FLibDebugDirMask);
if InstallTarget is TJclBCBInstallation then
FLibObjDir := MakePath(Distribution.FLibObjDirMask);
FDemoSectionName := Target.Name + ' demos';
FLogFileName := Format('%sbin%s%s.log', [Distribution.JclPath, DirDelimiter, TargetName]);
FLogLines := TJclSimpleLog.Create(FLogFileName);
end;
destructor TJclInstallation.Destroy;
begin
FDemoList.Free;
FLogLines.Free;
FGUI := nil;
FGUIPage := nil;
inherited Destroy;
end;
function TJclInstallation.GetEnabled: Boolean;
begin
Result := OptionCheckedById[OptionData[joLibrary].Id];
end;
function TJclInstallation.GetOptionChecked(Option: TJclOption): Boolean;
begin
Result := OptionCheckedById[OptionData[Option].Id];
end;
function TJclInstallation.GetOptionCheckedById(Id: Integer): Boolean;
var
AConfiguration: IJediConfiguration;
begin
if Assigned(GUIPage) then
Result := GUIPage.OptionChecked[Id]
else
begin
AConfiguration := InstallCore.Configuration;
if Assigned(AConfiguration) then
Result := AConfiguration.OptionAsBool[TargetName, Id]
else
Result := False;
end;
end;
procedure TJclInstallation.MarkOptionBegin(Id: Integer);
begin
if Assigned(GUIPage) then
GUIPage.MarkOptionBegin(Id);
if Assigned(GUI) then
GUI.Status := InstallCore.InstallOptionName[Id];
end;
procedure TJclInstallation.MarkOptionBegin(Option: TJclOption);
begin
if Assigned(GUIPage) then
GUIPage.MarkOptionBegin(OptionData[Option].Id);
if Assigned(GUI) then
GUI.Status := OptionData[Option].Hint;
end;
procedure TJclInstallation.MarkOptionEnd(Id: Integer; Success: Boolean);
begin
if Assigned(GUIPage) then
begin
GUIPage.MarkOptionEnd(Id, not Success);
if Assigned(GUI) then
GUI.Progress := Round(100 * (Distribution.NbInstalled + GUIPage.Progress / 100) / Distribution.NbEnabled);
end;
end;
procedure TJclInstallation.MarkOptionEnd(Option: TJclOption; Success: Boolean);
begin
if Assigned(GUIPage) then
begin
GUIPage.MarkOptionEnd(OptionData[Option].Id, not Success);
if Assigned(GUI) then
GUI.Progress := Round(100 * (Distribution.NbInstalled + GUIPage.Progress / 100) / Distribution.NbEnabled);
end;
end;
procedure TJclInstallation.Init;
procedure AddOption(Option: TJclOption; GUIOptions: TJediInstallGUIOptions;
Parent: Integer; const Caption, Hint: string); overload;
begin
GUIPage.AddInstallOption(OptionData[Option].Id, GUIOptions, Caption, Hint, Parent);
end;
procedure AddOption(Option: TJclOption; GUIOptions: TJediInstallGUIOptions;
Parent: Integer); overload;
begin
AddOption(Option, GUIOptions, Parent, OptionData[Option].Caption, OptionData[Option].Hint);
end;
procedure AddOption(Option: TJclOption; GUIOptions: TJediInstallGUIOptions;
Parent: TJclOption); overload;
begin
AddOption(Option, GUIOptions, OptionData[Parent].Id, OptionData[Option].Caption, OptionData[Option].Hint);
end;
procedure AddDefOptions(Parent: TJclOption);
begin
AddOption(joDefThreadSafe, [goChecked], Parent);
AddOption(joDefDropObsoleteCode, [goChecked], Parent);
if CLRVersion = '' then
AddOption(joDefUnitVersioning, [goChecked], Parent);
AddOption(joDefMath, [goChecked], Parent);
AddOption(joDefMathPrecSingle, [goRadioButton], joDefMath);
AddOption(joDefMathPrecDouble, [goRadioButton], joDefMath);
AddOption(joDefMathPrecExtended, [goRadioButton, goChecked], joDefMath);
AddOption(joDefMathExtremeValues, [goChecked], joDefMath);
if CLRVersion = '' then // these units are not CLR compliant
begin
{$IFDEF MSWINDOWS}
// debug options
AddOption(joDefDebug, [goNoAutoCheck], Parent);
AddOption(joDefHookDllExceptions, [goNoAutoCheck], joDefDebug);
AddOption(joDefDebugNoBinary, [goNoAutoCheck], joDefDebug);
AddOption(joDefDebugNoTD32, [goNoAutoCheck], joDefDebug);
AddOption(joDefDebugNoMap, [goNoAutoCheck], joDefDebug);
AddOption(joDefDebugNoExports, [goNoAutoCheck], joDefDebug);
AddOption(joDefDebugNoSymbols, [goNoAutoCheck], joDefDebug);
{$ENDIF MSWINDOWS}
// EDI options
AddOption(joDefEDI, [goNoAutoCheck], Parent);
AddOption(joDefEDIWeakPackageUnits, [goNoAutoCheck], joDefEDI);
// PCRE options
AddOption(joDefPCRE, [goChecked], Parent);
if Target.RadToolKind = brBorlandDevStudio then
begin
AddOption(joDefPCREStaticLink, [goRadioButton, goChecked], joDefPCRE);
AddOption(joDefPCRELinkOnRequest, [goRadioButton], joDefPCRE);
end
else
AddOption(joDefPCRELinkOnRequest, [goRadioButton, goChecked], joDefPCRE);
AddOption(joDefPCRELinkDLL, [goRadioButton], joDefPCRE);
// BZip2 options
AddOption(joDefBZip2, [goChecked], Parent);
{$IFDEF MSWINDOWS}
AddOption(joDefBZip2StaticLink, [goRadioButton], joDefBZip2);
{$ENDIF MSWINDOWS}
AddOption(joDefBZip2LinkOnRequest, [goRadioButton, goChecked], joDefBZip2);
AddOption(joDefBZip2LinkDLL, [goRadioButton], joDefBZip2);
end;
end;
procedure AddEnvOptions(Parent: TJclOption);
begin
AddOption(joEnvLibPath, [goChecked], Parent);
AddOption(joEnvBrowsingPath, [goChecked], Parent);
if not Target.IsTurboExplorer then
AddOption(joEnvDebugDCUPath, [goChecked], Parent);
end;
procedure AddMakeOptions(Parent: TJclOption);
begin
AddOption(joMakeRelease, [goStandAloneParent, goExpandable, goChecked], Parent);
AddOption(joMakeDebug, [goStandAloneParent, goExpandable, goChecked], Parent);
if CLRVersion = '' then
begin
if Target.SupportsVisualCLX then
begin
AddOption(joMakeReleaseVClx, [goChecked], joMakeRelease);
AddOption(joMakeDebugVClx, [goChecked], joMakeDebug);
end;
if Target.SupportsVCL then
begin
AddOption(joMakeReleaseVCL, [goChecked], joMakeRelease);
AddOption(joMakeDebugVCL, [goChecked], joMakeDebug);
end;
if bpBCBuilder32 in Target.Personalities then
AddOption(joCopyHppFiles, [goChecked], OptionData[joMake].Id,
Format(OptionData[joCopyHppFiles].Caption, [Target.VclIncludeDir]),
OptionData[joCopyHppFiles].Hint);
end;
end;
procedure AddHelpOptions(Parent: TJclOption);
begin
{$IFDEF MSWINDOWS}
if Target.RadToolKind = brBorlandDevStudio then
begin
// TODO: expert help
if (Target.VersionNumber >= 3) and (Distribution.JclHxSHelpFileName <> '') then
begin
AddOption(joHelp, [goChecked], Parent);
AddOption(johelpHxS, [goStandaloneParent,goChecked], joHelp);
AddOption(joHelpHxSPlugin, [goNoAutoCheck], joHelpHxS);
end;
end
else
begin
if (Distribution.JclHlpHelpFileName <> '') or (Distribution.JclChmHelpFileName <> '') then
begin
AddOption(joHelp, [goChecked], Parent);
if Distribution.JclHlpHelpFileName <> '' then
AddOption(joHelpHlp, [goChecked], joHelp);
if Distribution.JclChmHelpFileName <> '' then
AddOption(joHelpChm, [goChecked], joHelp);
end;
end;
{$ENDIF MSWINDOWS}
end;
procedure AddRepositoryOptions(Parent: TJclOption);
begin
// BDS has an expert for objects in the repository
if Target.RadToolKind <> brBorlandDevStudio then
begin
AddOption(joExceptDlg, [], Parent);
if Target.SupportsVCL then
begin
AddOption(joExceptDlgVCL, [], joExceptDlg);
{$IFDEF MSWINDOWS}
AddOption(joExceptDlgVCLSnd, [], joExceptDlg);
{$ENDIF MSWINDOWS}
end;
if Target.SupportsVisualCLX then
AddOption(joExceptDlgCLX, [], joExceptDlg);
end;
end;
procedure AddPackageOptions(Parent: TJclOption; RuntimeInstallation: Boolean);
begin
if (bpBCBuilder32 in Target.Personalities) and RunTimeInstallation and (CLRVersion = '') then
begin
if (Target.RadToolKind = brBorlandDevStudio) and (Target.VersionNumber >= 4) then
begin
AddOption(joDualPackages, [goStandAloneParent, goChecked], OptionData[Parent].Id,
Format(OptionData[joCopyPackagesHppFiles].Caption, [Target.VclIncludeDir]),
OptionData[joCopyPackagesHppFiles].Hint);
AddOption(joCopyPackagesHppFiles, [goChecked], joDualPackages);
end
else
AddOption(joCopyPackagesHppFiles, [goChecked], OptionData[Parent].Id,
Format(OptionData[joCopyPackagesHppFiles].Caption, [Target.VclIncludeDir]),
OptionData[joCopyPackagesHppFiles].Hint);
end;
if CLRVersion = '' then
begin
AddOption(joMapCreate, [goExpandable, goStandaloneParent, goNoAutoCheck], Parent);
{$IFDEF MSWINDOWS}
AddOption(joJdbgCreate, [goExpandable, goStandaloneParent], joMapCreate);
AddOption(joJdbgInsert, [goNoAutoCheck], joMapCreate);
AddOption(joMapDelete, [goNoAutoCheck], joMapCreate);
{if (Target.RadToolKind = brBorlandDevStudio) and (Target.VersionNumber = 3)
and (Target.Edition = deStd) then
CopyFakeXmlRtlPackage;
TODO: CopyFakeXmlRtlPackage
}
{$ENDIF MSWINDOWS}
end
else // CLRVersion <> ''
AddOption(joPdbCreate, [goNoAutoCheck], Parent);
end;
procedure AddExpertOptions(Parent: TJclOption; RuntimeInstallation: Boolean);
{$IFDEF MSWINDOWS}
var
ExpertOptions: TJediInstallGUIOptions;
{$ENDIF MSWINDOWS}
begin
// TODO :
// It has been reported that IDE experts don't work under Win98.
// Leave these options unchecked for Win9x/WinME until that has been examined.
{$IFDEF MSWINDOWS}
if IsWinNT then
ExpertOptions := [goChecked]
else
ExpertOptions := [];
AddOption(joExperts, [goExpandable, goChecked], Parent);
if (Target.RadToolKind = brBorlandDevStudio) and (Target.VersionNumber <= 2) then
// design packages are not loaded by C#Builder 1 and Delphi 8
AddOption(joExpertsDLL, [goRadioButton, goChecked], joExperts)
else if (Target.RadToolKind = brBorlandDevStudio) and (Target.VersionNumber >= 3) then
// expert DLLs are unstable on Delphi 2005 and BDS 2006
// (problems while adding menu items in menu not loaded yet)
AddOption(joExpertsDsgnPackages, [goRadioButton, goChecked], joExperts)
else
begin
AddOption(joExpertsDLL, [goRadioButton, goChecked], joExperts);
AddOption(joExpertsDsgnPackages, [goRadioButton], joExperts);
end;
if RunTimeInstallation then
begin
AddOption(joExpertDebug, ExpertOptions, joExperts);
AddOption(joExpertAnalyzer, ExpertOptions, joExperts);
if Target.RadToolKind <> brBorlandDevStudio then
AddOption(joExpertUses, ExpertOptions, joExperts);
AddOption(joExpertSimdView, ExpertOptions, joExperts);
AddOption(joExpertRepository, ExpertOptions, joExperts);
end;
AddOption(joExpertFavorite, ExpertOptions, joExperts);
AddOption(joExpertVersionControl, [goNoAutoCheck], joExperts);
if (Target.RadToolKind <> brBorlandDevStudio) and (Target.VersionNumber <= 6) then
AddOption(joExpertThreadNames, ExpertOptions, joExperts);
{$ENDIF MSWINDOWS}
end;
procedure AddDemoNodes;
var
I: Integer;
ADemoList: TStrings;
DemoOption: Integer;
FileName: string;
begin
AddOption(joMakeDemos, [goNoAutoCheck], joLibrary);
ADemoList := GetDemoList;
for I := 0 to ADemoList.Count - 1 do
begin
FileName := ExtractRelativePath(Distribution.JclExamplesDir, ADemoList.Strings[I]);
DemoOption := InstallCore.AddInstallOption(FileName);
ADemoList.Objects[I] := TObject(DemoOption);
GUIPage.AddInstallOption(DemoOption, [], ExtractFileName(FileName), FileName, OptionData[joMakeDemos].Id);
end;
end;
procedure LoadValues;
var
AConfiguration: IJediConfiguration;
Option: TJclOption;
Id, Index: Integer;
StoredValue: string;
ADemoList: TStrings;
begin
AConfiguration := InstallCore.Configuration;
if not Assigned(AConfiguration) then
Exit;
if AConfiguration.SectionExists(TargetName) then
for Option := Low(TJclOption) to High(TJclOption) do
begin
Id := OptionData[Option].Id;
GUIPage.OptionChecked[Id] := AConfiguration.OptionAsBool[TargetName, Id];
end;
if not Target.IsTurboExplorer then
begin
ADemoList := GetDemoList;
if AConfiguration.SectionExists(FDemoSectionName) then
for Index := 0 to ADemoList.Count - 1 do
begin
Id := Integer(ADemoList.Objects[Index]);
GUIPage.OptionChecked[Id] := AConfiguration.OptionAsBool[FDemoSectionName, Id];
end;
StoredValue := AConfiguration.OptionAsStringByName[TargetName, RsNameBPLPath];
if StoredValue = '' then
StoredValue := Target.BPLOutputPath;
GUIPage.Directories[FGUIBPLPathIndex] := StoredValue;
if Target.RadToolKind = brCppBuilder then
StoredValue := AConfiguration.OptionAsStringByName[TargetName, RsNameBPIPath]
else
StoredValue := AConfiguration.OptionAsStringByName[TargetName, RsNameDCPPath];
if StoredValue = '' then
StoredValue := FJclDcpPath;
GUIPage.Directories[FGUIDCPPathIndex] := StoredValue;
end;
end;
var
RunTimeInstallation: Boolean;
begin
FGUI := InstallCore.InstallGUI;
if not Assigned(GUI) then
Exit;
FGUIPage := GUI.CreateInstallPage;
GUIPage.Caption := TargetName;
GUIPage.SetIcon(Target.IdeExeFileName);
RunTimeInstallation := (Target.RadToolKind <> brBorlandDevStudio)
or ((Target.VersionNumber >= 3) and (bpDelphi32 in Target.Personalities));
AddOption(joLibrary, [goExpandable, goChecked], JediTargetOption);
if RunTimeInstallation then
begin
// conditional defines
AddOption(joDef, [goExpandable, goChecked], OptionData[joLibrary].Id);
AddDefOptions(joDef);
if CLRVersion = '' then
begin
AddOption(joEnvironment, [goExpandable, goChecked], OptionData[joLibrary].Id);
AddEnvOptions(joEnvironment);
end;
if not Target.IsTurboExplorer then
begin
AddOption(joMake, [goExpandable, goChecked], OptionData[joLibrary].Id);
AddMakeOptions(joMake);
end;
if CLRVersion = '' then
begin
AddHelpOptions(joLibrary);
AddRepositoryOptions(joLibrary);
end;
end;
if not Target.IsTurboExplorer then
begin
AddOption(joPackages, [goStandAloneParent, goExpandable, goChecked], joLibrary);
AddPackageOptions(joPackages, RuntimeInstallation);
if CLRVersion = '' then
begin
{$IFDEF MSWINDOWS}
AddExpertOptions(joPackages, RunTimeInstallation);
{$ENDIF MSWINDOWS}
if RunTimeInstallation then
AddDemoNodes;
end;
end;
GUIPage.InitDisplay;
if not Target.IsTurboExplorer then
begin
if (CLRVersion = '') then
begin
FGUIBPLPathIndex := GUIPage.AddDirectory(RsCaptionBPLPath);
if Target.RadToolKind = brCppBuilder then
FGUIDCPPathIndex := GUIPage.AddDirectory(RsCaptionBPIPath)
else
FGUIDCPPathIndex := GUIPage.AddDirectory(RsCaptionDCPPath);
end
else
FGUIBPLPathIndex := GUIPage.AddDirectory(RsCaptionOutputPath);
end;
LoadValues;
end;
function TJclInstallation.Install: Boolean;
procedure WriteIntroduction;
var
Personality: TJclBorPersonality;
begin
WriteLog(Distribution.Version);
WriteLog('');
WriteLog(StrPadRight(TargetName, 44, '='));
WriteLog('');
WriteLog('Installed personalities :');
for Personality := Low(TJclBorPersonality) to High(TJclBorPersonality) do
if Personality in Target.Personalities then
begin
WriteLog(JclBorPersonalityDescription[Personality]);
end;
WriteLog(StrRepeat('=', 44));
end;
function CheckDirectories: Boolean;
{$IFDEF MSWINDOWS}
var
PathEnvVar: string;
{$ENDIF MSWINDOWS}
begin
Result := not OptionChecked[joPackages];
if not Result then
begin
Result := True;
if not DirectoryExists(GetBplPath) then
begin
Result := False;
if not Assigned(GUI) then
WriteLog(Format(RsInvalidBplPath, [GetBplPath]))
else if GUI.Dialog(Format(RsWarningCreatePath, ['BPL']), dtWarning, [drYes, drNo]) = drYes then
begin
Result := ForceDirectories(GetBplPath);
if not Result then
GUI.Dialog(Format(RsErrorCantCreatePath, [GetBplPath]), dtError, [drCancel]);
end;
end;
if (CLRVersion = '') and not DirectoryExists(GetDcpPath) then
begin
Result := False;
if not Assigned(GUI) then
WriteLog(Format(RsInvalidDcpPath, [GetDcpPath]))
else if GUI.Dialog(Format(RsWarningCreatePath, ['DCP']), dtWarning, [drYes, drNo]) = drYes then
begin
Result := ForceDirectories(GetDcpPath);
if not Result then
GUI.Dialog(Format(RsErrorCantCreatePath, [GetDcpPath]), dtError, [drCancel]);
end;
end;
{$IFDEF MSWINDOWS}
if CLRVersion = '' then
begin
PathEnvVar := RegReadStringDef(HKCU, RegHKCUEnvironmentVar, PathEnvironmentVar, '');
PathListIncludeItems(PathEnvVar, RegReadStringDef(HKLM, RegHKLMEnvironmentVar, PathEnvironmentVar, ''));
ExpandEnvironmentVar(PathEnvVar);
if (PathListItemIndex(PathEnvVar, GetBplPath) = -1) and (PathListItemIndex(PathEnvVar, PathAddSeparator(GetBplPath)) = -1)
and Assigned(GUI) and (GUI.Dialog(RsWarningAddPathToEnvironment, dtWarning, [drYes, drNo]) = drYes) then
begin
PathEnvVar := RegReadStringDef(HKCU, RegHKCUEnvironmentVar, PathEnvironmentVar, '');
PathListIncludeItems(PathEnvVar, GetBplPath);
RegWriteString(HKCU, RegHKCUEnvironmentVar, PathEnvironmentVar, PathEnvVar);
end;
end;
{$ENDIF MSWINDOWS}
end
else if Assigned(GUI) and (CLRVersion = '') and not Target.IsTurboExplorer then
Result := GUI.Dialog(RsWarningPackageNodeNotSelected, dtConfirmation, [drYes, drNo]) = drYes;
end;
function SetStaticOptions: Boolean;
function SaveDefines(Defines: TStrings): Boolean;
var
TemplateFileName, IncludeFileName, IncludeLine, Symbol, CLRSuffix: string;
IncludeFile: TStrings;
IndexLine, DefinePos, SymbolEnd: Integer;
Defined, NotDefined: Boolean;
const
DefineText = '$DEFINE';
NotDefineText = '.' + DefineText;
begin
WriteLog('Saving conditional defines...');
Result := True;
if CLRVersion = '' then
CLRSuffix := ''
else
CLRSuffix := '.net';
TemplateFileName := PathAddSeparator(Distribution.JclSourceDir) + 'jcl.template.inc';
IncludeFileName := Format('%sjcl%s%s.inc', [PathAddSeparator(Distribution.JclSourceDir), Target.IDEVersionNumberStr, CLRSuffix]);
try
IncludeFile := TStringList.Create;
try
IncludeFile.LoadFromFile(TemplateFileName);
WriteLog(Format('Loaded template for include file %s', [TemplateFileName]));
for IndexLine := 0 to IncludeFile.Count - 1 do
begin
IncludeLine := IncludeFile.Strings[IndexLine];
DefinePos := AnsiPos(DefineText, UpperCase(IncludeLine));
if DefinePos > 1 then
begin
Defined := IncludeLine[DefinePos - 1] = '{';
NotDefined := IncludeLine[DefinePos - 1] = '.';
if Defined or NotDefined then
begin
Inc(DefinePos, Length(DefineText));
while IncludeLine[DefinePos] in AnsiWhiteSpace do
Inc(DefinePos);
SymbolEnd := DefinePos;
while IncludeLine[SymbolEnd] in AnsiValidIdentifierLetters do
Inc(SymbolEnd);
Symbol := Copy(IncludeLine, DefinePos, SymbolEnd - DefinePos);
DefinePos := Defines.IndexOf(Symbol);
if (DefinePos >= 0) and NotDefined then
IncludeLine := StringReplace(IncludeLine, NotDefineText, DefineText, [rfIgnoreCase]);
if (DefinePos < 0) and Defined then
IncludeLine := StringReplace(IncludeLine, DefineText, NotDefineText, [rfIgnoreCase]);
IncludeFile.Strings[IndexLine] := IncludeLine;
end;
end;
end;
IncludeFile.SaveToFile(IncludeFileName);
WriteLog(Format('Saved include file %s', [IncludeFileName]));
finally
IncludeFile.Free;
end;
except
Result := False;
end;
end;
const
DefineNames: array [joDefThreadSafe..joDefBZip2LinkOnRequest] of string =
( 'THREADSAFE', 'DROP_OBSOLETE_CODE', 'UNITVERSIONING',
'MATH_SINGLE_PRECISION', 'MATH_DOUBLE_PRECISION', 'MATH_EXTENDED_PRECISION',
'MATH_EXT_EXTREMEVALUES', 'HOOK_DLL_EXCEPTIONS',
'DEBUG_NO_BINARY', 'DEBUG_NO_TD32', 'DEBUG_NO_MAP', 'DEBUG_NO_EXPORTS',
'DEBUG_NO_SYMBOLS', 'EDI_WEAK_PACKAGE_UNITS', 'PCRE_STATICLINK',
'PCRE_LINKDLL', 'PCRE_LINKONREQUEST', 'BZIP2_STATICLINK',
'BZIP2_LINKDLL', 'BZIP2_LINKONREQUEST' );
var
Option: TJclOption;
Defines: TStrings;
begin
Defines := TStringList.Create;
try
if OptionChecked[joDef] then
begin
MarkOptionBegin(joDef);
for Option := Low(DefineNames) to High(DefineNames) do
if OptionChecked[Option] then
begin
MarkOptionBegin(Option);
Defines.Add(DefineNames[Option]);
MarkOptionEnd(Option, True);
end;
MarkOptionEnd(joDef, True);
end;
MarkOptionBegin(joMapCreate);
Target.MapCreate := OptionChecked[joMapCreate];
MarkOptionEnd(joMapCreate, True);
{$IFDEF MSWINDOWS}
MarkOptionBegin(joJdbgCreate);
Target.JdbgCreate := OptionChecked[joJdbgCreate];
MarkOptionEnd(joJdbgCreate, True);
MarkOptionBegin(joJdbgInsert);
Target.JdbgInsert := OptionChecked[joJdbgInsert];
MarkOptionEnd(joJdbgInsert, True);
MarkOptionBegin(joMapDelete);
Target.MapDelete := OptionChecked[joMapDelete];
MarkOptionEnd(joMapDelete, True);
if Target is TJclBDSInstallation then
begin
MarkOptionBegin(joDualPackages);
TJclBDSInstallation(Target).DualPackageInstallation := OptionChecked[joDualPackages];
MarkOptionEnd(joDualPackages, True);
MarkOptionBegin(joPdbCreate);
TJclBDSInstallation(Target).PdbCreate := OptionChecked[joPdbCreate];
MarkOptionEnd(joPdbCreate, True);
end;
{$ENDIF MSWINDOWS}
// no conditional defines for C#Builder 1 and Delphi 8
Result := ((Target.RadToolKind = brBorlandDevStudio) and (Target.VersionNumber <= 2)) or SaveDefines(Defines);
finally
Defines.Free;
end;
end;
function SetEnvironment: Boolean;
begin
Result := True;
if OptionChecked[joEnvironment] then
begin
MarkOptionBegin(joEnvironment);
if OptionChecked[joEnvLibPath] then
begin
MarkOptionBegin(joEnvLibPath);
Result := Target.AddToLibrarySearchPath(FLibDir) and Target.AddToLibrarySearchPath(Distribution.JclSourceDir);
if Result then
begin
WriteLog(Format('Added "%s;%s" to library search path.', [FLibDir, Distribution.JclSourceDir]));
{$IFDEF MSWINDOWS}
if (Target.RadToolKind = brBorlandDevStudio) and (bpBCBuilder32 in Target.Personalities)
and OptionChecked[joDualPackages] then
with TJclBDSInstallation(Target) do
begin
Result := AddToCppSearchPath(FLibDir) and AddToCppSearchPath(Distribution.JclSourceDir) and
((IDEVersionNumber < 5) or AddToCppLibraryPath(FLibDir));
if Result then
WriteLog(Format('Added "%s;%s" to cpp search path.', [FLibDir, Distribution.JclSourceDir]))
else
WriteLog('Failed to add cpp search paths.');
end;
{$ENDIF MSWINDOWS}
if Target.IsTurboExplorer then
begin
Result := Target.AddToLibrarySearchPath(Distribution.JclSourcePath);
if Result then
WriteLog(Format('Added "%s" to library search path.', [Distribution.JclSourcePath]))
else
WriteLog('Failed to add library search paths.');
end;
end
else
WriteLog('Failed to add library search paths.');
MarkOptionEnd(joEnvLibPath, Result);
end;
if Result and OptionChecked[joEnvBrowsingPath] then
begin
MarkOptionBegin(joEnvBrowsingPath);
if Result then
begin
Result := Target.AddToLibraryBrowsingPath(Distribution.JclSourcePath);
if Result then
begin
WriteLog(Format('Added "%s" to library browsing path.', [Distribution.JclSourcePath]));
{$IFDEF MSWINDOWS}
if (Target.RadToolKind = brBorlandDevStudio) and (bpBCBuilder32 in Target.Personalities)
and OptionChecked[joDualPackages] then
with TJclBDSInstallation(Target) do
begin
Result := AddToCppBrowsingPath(Distribution.JclSourcePath);
if Result then
WriteLog(Format('Added "%s" to cpp browsing path.', [Distribution.JclSourcePath]))
else
WriteLog('Failed to add cpp browsing paths.');
end;
{$ENDIF MSWINDOWS}
end
else
WriteLog('Failed to add library browsing path');
end
else
WriteLog('Failed to add library browsing path.');
MarkOptionEnd(joEnvBrowsingPath, Result);
end;
if Result and OptionChecked[joEnvDebugDCUPath] then
begin
MarkOptionBegin(joEnvDebugDCUPath);
Result := Target.AddToDebugDCUPath(FDebugDcuDir);
if Result then
WriteLog(Format('Added "%s" to Debug DCU Path.', [FDebugDcuDir]))
else
WriteLog('Failed to add debug DCU path');
MarkOptionEnd(joEnvDebugDCUPath, Result);
end;
MarkOptionEnd(joEnvironment, Result);
end;
end;
function MakeUnits: Boolean;
var
I: Integer;
begin
Result := True;
if OptionChecked[joMake] then
begin
MarkOptionBegin(joMake);
if OptionChecked[joMakeRelease] then
begin
MarkOptionBegin(joMakeRelease);
for I := Low(JclSourceDirs) to High(JclSourceDirs) do
begin
if (JclSourceDirs[I] = JclSrcDirVisClx) then
begin
if OptionChecked[joMakeReleaseVClx] then
MarkOptionBegin(joMakeReleaseVClx)
else
Continue;
end;
if (JclSourceDirs[I] = JclSrcDirVcl) then
begin
if OptionChecked[joMakeReleaseVCL] or
((Target.VersionNumber <= 5) and (Target.RadToolKind <> brBorlandDevStudio)) then
MarkOptionBegin(joMakeReleaseVCL)
else
Continue;
end;
Result := Result and CompileLibraryUnits(JclSourceDirs[I], False);
if (JclSourceDirs[I] = JclSrcDirVisClx) then
MarkOptionEnd(joMakeReleaseVClx, Result);
if (JclSourceDirs[I] = JclSrcDirVcl) then
MarkOptionEnd(joMakeReleaseVCL, Result);
end;
MarkOptionEnd(joMakeRelease, Result);
end;
if Result and OptionChecked[joMakeDebug] then
begin
MarkOptionBegin(joMakeDebug);
for I := Low(JclSourceDirs) to High(JclSourceDirs) do
begin
if (JclSourceDirs[I] = JclSrcDirVisClx) then
begin
if OptionChecked[joMakeDebugVClx] then
MarkOptionBegin(joMakeDebugVClx)
else
Continue;
end;
if (JclSourceDirs[I] = JclSrcDirVcl) then
begin
if OptionChecked[joMakeDebugVCL] or
((Target.VersionNumber <= 5) and (Target.RadToolKind <> brBorlandDevStudio)) then
MarkOptionBegin(joMakeDebugVCL)
else
Continue;
end;
Result := Result and CompileLibraryUnits(JclSourceDirs[I], True);
if (JclSourceDirs[I] = JclSrcDirVisClx) then
MarkOptionEnd(joMakeDebugVClx, Result);
if (JclSourceDirs[I] = JclSrcDirVcl) then
MarkOptionEnd(joMakeDebugVCL, Result);
end;
MarkOptionEnd(joMakeDebug, Result);
end;
MarkOptionEnd(joMake, Result);
end;
end;
function CompilePackages: Boolean;
begin
Result := True;
if OptionChecked[joPackages] then
begin
MarkOptionBegin(joPackages);
if CLRVersion = '' then
begin
{$IFDEF MSWINDOWS}
InstallJediRegInformation(Target.ConfigDataLocation, 'JCL',
Format('%d.%d.%d.%d', [JclVersionMajor, JclVersionMinor, JclVersionRelease, JclVersionBuild]),
GetDcpPath, GetBplPath, Distribution.FJclPath);
{$ENDIF MSWINDOWS}
Result := CompilePackage(FullPackageFileName(Target, JclDpk), False);
if Target.SupportsVisualCLX then
Result := Result and CompilePackage(FullPackageFileName(Target, JclVClxDpk), False);
if ((Target.VersionNumber >= 6) and (Target.RadToolKind <> brBorlandDevStudio))
or ((Target.RadToolKind = brBorlandDevStudio) and (Target.VersionNumber >= 3)) then
Result := Result and CompilePackage(FullPackageFileName(Target, JclVclDpk), False);
MarkOptionEnd(joPackages, Result);
end
{$IFDEF MSWINDOWS}
else
// CLR installation
Result := CompileCLRPackage(JediJclDpr);
{$ENDIF MSWINDOWS}
end;
end;
{$IFDEF MSWINDOWS}
function InstallExperts: Boolean;
var
Option: TJclOption;
DLLExperts: Boolean;
begin
Result := True;
if OptionChecked[joExperts] then
begin
MarkOptionBegin(joExperts);
DLLExperts := False;
// dual packages useless for experts
if Target.RadToolKind = brBorlandDevStudio then
TJclBDSInstallation(Target).DualPackageInstallation := False;
for Option := Low(ExpertPaths) to High(ExpertPaths) do
if OptionChecked[Option] then
begin
MarkOptionBegin(Option);
if Option = joExpertsDsgnPackages then
// nothing, default value
else if Option = joExpertsDLL then
DLLExperts := OptionChecked[Option]
else if DLLExperts then
Result := CompileExpert(FullLibraryFileName(Target, ExpertPaths[Option]), True)
else
Result := CompilePackage(FullPackageFileName(Target,ExpertPaths[Option]), True);
MarkOptionEnd(Option, Result);
if not Result then
Break;
end;
MarkOptionEnd(joExperts, Result);
end;
end;
{$ENDIF MSWINDOWS}
function InstallRepository: Boolean;
function AddDialogToRepository(const DialogName: string;
const DialogFileName: string; const DialogIconFileName: string;
const Designer: string): Boolean;
begin
Result := True;
try
WriteLog(Format('Installing %s...', [DialogName]));
Target.Repository.AddObject(DialogFileName, BorRADToolRepositoryFormTemplate,
Target.Repository.FindPage(ExceptDlgPage, 1), DialogName, DialogIconFileName,
ExceptDlgDescription, ExceptDlgAuthor, BorRADToolRepositoryDesignerDfm);
WriteLog('-> ' + DialogFileName);
WriteLog('-> ' + DialogIconFileName);
WriteLog('...done.');
except
Result := False;
end;
end;
begin
Result := True;
if OptionChecked[joExceptDlg] then
begin
MarkOptionBegin(joExceptDlg);
{$IFDEF MSWINDOWS}
if OptionChecked[joExceptDlgVCL] then
begin
MarkOptionBegin(joExceptDlgVCL);
Result := AddDialogToRepository(ExceptDlgVclName, Distribution.VclDialogFileName,
Distribution.VclDialogIconFileName, BorRADToolRepositoryDesignerDfm);
MarkOptionEnd(joExceptDlgVCL, Result);
end;
if Result and OptionChecked[joExceptDlgVCLSnd] then
begin
MarkOptionBegin(joExceptDlgVCLSnd);
Result := AddDialogToRepository(ExceptDlgVclSndName, Distribution.VclDialogSendFileName,
Distribution.VclDialogSendIconFileName, BorRADToolRepositoryDesignerDfm);
MarkOptionEnd(joExceptDlgVCLSnd, Result);
end;
{$ENDIF MSWINDOWS}
if Result and OptionChecked[joExceptDlgCLX] then
begin
MarkOptionBegin(joExceptDlgCLX);
Result := AddDialogToRepository(ExceptDlgClxName, Distribution.ClxDialogFileName,
Distribution.ClxDialogIconFileName, BorRADToolRepositoryDesignerXfm);
MarkOptionEnd(joExceptDlgCLX, Result);
end;
MarkOptionEnd(joExceptDlg, Result);
end;
end;
{$IFDEF MSWINDOWS}
function InstallHelpFiles: Boolean;
function AddHelpToIdeTools: Boolean;
var
ToolsIndex: Integer;
HelpTitle: string;
IdeTool: TJclBorRADToolIdeTool;
begin
Result := True;
try
IdeTool := Target.IdeTools;
HelpTitle := Format(JclHelpTitle, [JclVersionMajor, JclVersionMinor]);
if IdeTool.IndexOfTitle(HelpTitle) = -1 then
begin
ToolsIndex := IdeTool.Count;
IdeTool.Count := ToolsIndex + 1;
IdeTool.Title[ToolsIndex] := HelpTitle;
IdeTool.Path[ToolsIndex] := HHFileName;
IdeTool.Parameters[ToolsIndex] := StrDoubleQuote(FDistribution.FJclChmHelpFileName);
IdeTool.WorkingDir[ToolsIndex] := Distribution.JclPath;
end;
except
Result := False;
end;
end;
function AddHelpToOpenHelp: Boolean;
begin
Result := Target.OpenHelp.AddHelpFile(Distribution.FJclHlpHelpFileName, JclHelpIndexName);
if Result then
WriteLog(Format('Added %s to %s Online Help', [Distribution.FJclHlpHelpFileName, Target.RADToolName]))
else
WriteLog('failed to add help file to Online Help');
end;
function RegisterHelp2Files: Boolean;
var
//CurrentDir: string;
NameSpace, Collection, Description, Identifier, HxSFile, HxIFile: WideString;
LangId: Integer;
begin
Result := True;
if (Target.RadToolKind <> brBorlandDevStudio) or (Target.VersionNumber < 3) then
Exit;
WriteLog('Registering help 2.0 files...');
// to avoid Write AV, data have to be copied in data segment
NameSpace := Help2NameSpace;
Collection := Help2Collection;
Description := Help2Description;
Identifier := Help2Identifier;
LangId := Help2LangId;
HxSFile := Help2HxSFile;
HxIFile := Help2HxIFile;
Distribution.RegHelpCreateTransaction;
Distribution.RegHelpRegisterNameSpace(NameSpace, Collection, Description);
Distribution.RegHelpRegisterHelpFile(NameSpace, Identifier, LangId, HxSFile, HxIFile);
if OptionChecked[joHelpHxSPlugin] then
begin
MarkOptionBegin(joHelpHxSPlugin);
Distribution.RegHelpPlugNameSpaceIn(NameSpace, TJclBDSInstallation(Target).Help2Manager.IdeNamespace);
MarkOptionEnd(joHelpHxSPlugin, Result);
end;
Distribution.RegHelpCommitTransaction;
WriteLog('...defered');
end;
begin
Result := True;
if OptionChecked[joHelp] then
begin
MarkOptionBegin(joHelp);
if OptionChecked[joHelpHlp] then
begin
MarkOptionBegin(joHelpHlp);
Result := AddHelpToOpenHelp;
MarkOptionEnd(joHelpHlp, Result);
end;
if Result and OptionChecked[joHelpChm] then
begin
MarkOptionBegin(joHelpChm);
Result := AddHelpToIdeTools;
MarkOptionEnd(joHelpChm, Result);
end;
if Result and OptionChecked[joHelpHxS] then
begin
MarkOptionBegin(joHelpHxS);
Result := RegisterHelp2Files;
MarkOptionEnd(joHelpHxS, Result);
end;
MarkOptionEnd(joHelp, Result);
end;
end;
{$ENDIF MSWINDOWS}
function MakeDemos: Boolean;
var
SaveDir: string;
Index, ID: Integer;
ADemoList: TStrings;
DemoResult: Boolean;
begin
Result := True;
if OptionChecked[joMakeDemos] then
begin
MarkOptionBegin(joMakeDemos);
SaveDir := GetCurrentDir;
try
ADemoList := GetDemoList;
for Index := 0 to ADemoList.Count - 1 do
begin
ID := Integer(ADemoList.Objects[Index]);
if OptionCheckedById[ID] then
begin
MarkOptionBegin(ID);
DemoResult := CompileApplication(ADemoList.Strings[Index]);
MarkOptionEnd(ID, DemoResult);
Result := Result and DemoResult;
end;
end;
finally
SetCurrentDir(SaveDir);
end;
MarkOptionEnd(joMakeDemos, Result);
end;
end;
begin
try
Target.OutputCallback := WriteLog;
if Assigned(GUI) then
GUI.Status := Format(RsInstallMessage, [TargetName]);
if Assigned(GUIPage) then
begin
GUIPage.Show;
GUIPage.BeginInstall;
end;
FLogLines.ClearLog;
WriteIntroduction;
Result := CheckDirectories and SetStaticOptions and SetEnvironment
and MakeUnits and CompilePackages
{$IFDEF MSWINDOWS} and InstallExperts and InstallHelpFiles {$ENDIF MSWINDOWS}
and InstallRepository and MakeDemos;
if not Result then
begin
Silent := True;
Uninstall(False);
end;
FLogLines.CloseLog;
finally
Target.OutputCallback := nil;
WriteLog('');
if Assigned(GUIPage) then
GUIPage.EndInstall;
end;
end;
function TJclInstallation.MakePath(const FormatStr: string): string;
{$IFNDEF KYLIX}
var
VersionStr: string;
{$ENDIF KYLIX}
begin
{$IFDEF KYLIX}
Result := Format(FormatStr, [Target.VersionNumber]);
{$ELSE ~KYLIX}
VersionStr := Target.VersionNumberStr;
if CLRVersion <> '' then
VersionStr := Format('%s.net', [VersionStr]);
Result := PathGetShortName(Format(FormatStr, [VersionStr]));
{$ENDIF ~KYLIX}
end;
function TJclInstallation.RemoveSettings: Boolean;
{$IFDEF MSWINDOWS}
var
JclSettingsKey: string;
{$ENDIF MSWINDOWS}
begin
{$IFDEF MSWINDOWS}
JclSettingsKey := Target.ConfigDataLocation + '\Jedi\JCL';
if RegKeyExists(HKCU, JclSettingsKey) then
Result := RegDeleteKeyTree(HKCU, JclSettingsKey)
else
{$ENDIF MSWINDOWS}
Result := True;
end;
function TJclInstallation.Uninstall(AUninstallHelp: Boolean): Boolean;
procedure RemoveEnvironment;
begin
//ioJclEnvLibPath
if CLRVersion = '' then
begin
if Target.RemoveFromLibrarySearchPath(FLibDir) and Target.RemoveFromLibrarySearchPath(Distribution.JclSourceDir) then
WriteLog(Format('Removed "%s;%s" from library search path.', [FLibDir, Distribution.JclSourceDir]))
else
WriteLog('Failed to remove library search path.');
{$IFDEF MSWINDOWS}
if (Target.RadToolKind = brBorlandDevStudio) and (bpBCBuilder32 in Target.Personalities) then
with TJclBDSInstallation(Target) do
begin
if RemoveFromCppSearchPath(FLibDir) and RemoveFromCppSearchPath(Distribution.JclSourceDir) and
((IDEVersionNumber < 5) or RemoveFromCppLibraryPath(FLibDir)) then
WriteLog(Format('Removed "%s;%s" from cpp search path.', [FLibDir, Distribution.JclSourceDir]))
else
WriteLog('Failed to remove cpp search path.');
end;
{$ENDIF MSWINDOWS}
//ioJclEnvBrowsingPath
if Target.RemoveFromLibraryBrowsingPath(Distribution.JclSourcePath) then
WriteLog(Format('Removed "%s" from library browsing path.', [Distribution.JclSourcePath]))
else
WriteLog('Failed to remove library browsing path.');
{$IFDEF MSWINDOWS}
if (Target.RadToolKind = brBorlandDevStudio) and (bpBCBuilder32 in Target.Personalities) then
with TJclBDSInstallation(Target) do
begin
if RemoveFromCppBrowsingPath(Distribution.JclSourcePath) then
WriteLog(Format('Removed "%s" from cpp browsing path.', [Distribution.JclSourcePath]))
else
WriteLog('Failed to remove cpp browsing path.');
end;
{$ENDIF MSWINDOWS}
//ioJclEnvDebugDCUPath
if Target.RemoveFromDebugDCUPath(FDebugDcuDir) then
WriteLog(Format('Removed "%s" from Debug DCU Path.', [FDebugDcuDir]));
end;
end;
procedure RemoveMake;
procedure RemoveFileMask(const Directory, Extension: string);
var
FileList: TStrings;
Index: Integer;
begin
FileList := TStringList.Create;
try
BuildFileList(Format('%s*%s', [PathAddSeparator(Directory), Extension]), faAnyFile, FileList);
for Index := 0 to FileList.Count - 1 do
FileDelete(PathAddSeparator(Directory) + FileList.Strings[Index]);
finally
FileList.Free;
end;
end;
begin
if CLRVersion <> '' then
begin
RemoveFileMask(FLibDir, '.dcuil');
RemoveFileMask(FDebugDcuDir, '.dcuil');
end
else
begin
RemoveFileMask(FLibDir, '.dcu');
RemoveFileMask(FDebugDcuDir, '.dcuil');
if bpBCBuilder32 in Target.Personalities then
begin
RemoveFileMask(FLibDir, '.obj');
RemoveFileMask(FDebugDcuDir, '.obj');
end;
end;
//ioJclCopyHppFiles: ; // TODO : Delete copied files
end;
procedure UninstallPackages;
begin
if CLRVersion = '' then
begin
//ioJclPackages
UninstallPackage(FullPackageFileName(Target, JclDpk));
if (Target.RadToolKind = brBorlandDevStudio) and (Target.IDEVersionNumber = 5) then
if Target.SupportsVisualCLX then
UninstallPackage(FullPackageFileName(Target, JclVClxDpk));
if ((Target.VersionNumber >= 6) and (Target.RadToolKind <> brBorlandDevStudio))
or ((Target.VersionNumber >=3) and (Target.RadToolKind = brBorlandDevStudio)) then
UninstallPackage(FullPackageFileName(Target, JclVclDpk));
{$IFDEF MSWINDOWS}
RemoveJediRegInformation(Target.ConfigDataLocation, 'JCL');
{$ENDIF MSWINDOWS}
end;
end;
{$IFDEF MSWINDOWS}
procedure UninstallExperts;
var
Option: TJclOption;
begin
if CLRVersion = '' then
begin
for Option := Low(ExpertPaths) to High(ExpertPaths) do
if not (Option in [joExpertsDsgnPackages, joExpertsDLL]) then
UninstallExpert(Option);
end;
end;
procedure UninstallHelp;
procedure RemoveHelpFromIdeTools;
var
HelpIndex: Integer;
HelpTitle: string;
begin
HelpTitle := Format(JclHelpTitle, [JclVersionMajor, JclVersionMinor]);
with Target.IdeTools do
begin
HelpIndex := IndexOfTitle(HelpTitle);
if HelpIndex <> -1 then
RemoveIndex(HelpIndex);
end;
end;
procedure RemoveHelpFromOpenHelp;
begin
WriteLog(Format('Removing %s from %s Online Help', [Distribution.FJclHlpHelpFileName, Target.RADToolName]));
if Target.OpenHelp.RemoveHelpFile(Distribution.FJclHlpHelpFileName, JclHelpIndexName) then
WriteLog('...done.')
else
WriteLog('...failed.');
end;
procedure UnregisterHelp2Files;
var
NameSpace, Identifier, HxSFile, HxIFile: WideString;
LangId: Integer;
begin
if (Target.RadToolKind <> brBorlandDevStudio) or (Target.VersionNumber < 3) then
Exit;
WriteLog('Unregistering help 2.0 files...');
// to avoid Write AV, data has to be copied in data segment
NameSpace := Help2NameSpace;
Identifier := Help2Identifier;
LangId := Help2LangId;
HxSFile := Help2HxSFile;
HxIFile := Help2HxIFile;
Distribution.RegHelpCreateTransaction;
Distribution.RegHelpUnPlugNameSpace(NameSpace, TJclBDSInstallation(Target).Help2Manager.IdeNamespace);
Distribution.RegHelpUnregisterHelpFile(NameSpace, Identifier, LangId);
Distribution.RegHelpUnregisterNameSpace(NameSpace);
Distribution.RegHelpCommitTransaction;
WriteLog('...defered');
end;
begin
if CLRVersion = '' then
begin
if Target.RadToolKind <> brBorlandDevStudio then
begin
RemoveHelpFromOpenHelp;
RemoveHelpFromIdeTools;
end
else
UnregisterHelp2Files;
end;
end;
{$ENDIF MSWINDOWS}
procedure UninstallRepository;
procedure RemoveDialogFromRepository(const DialogName, DialogFileName: string);
begin
Target.Repository.RemoveObjects(ExceptDlgPath, DialogFileName, BorRADToolRepositoryFormTemplate);
WriteLog(Format('Removed %s.', [DialogName]));
end;
begin
if (CLRVersion = '') and (Target.RadToolKind <> brBorlandDevStudio) then
begin
{$IFDEF MSWINDOWS}
// ioJclExcDialog
// ioJclExcDialogVCL
RemoveDialogFromRepository(ExceptDlgVclName, Distribution.VclDialogFileName);
//ioJclExcDialogVCLSnd
RemoveDialogFromRepository(ExceptDlgVclSndName, Distribution.VclDialogSendFileName);
{$ENDIF MSWINDOWS}
//ioJclExcDialogCLX
RemoveDialogFromRepository(ExceptDlgClxName, Distribution.ClxDialogFileName);
end;
end;
begin
try
Target.OutputCallback := WriteLog;
if Assigned(GUI) then
GUI.Status := Format(RsUninstallMessage, [TargetName]);
if Assigned(GUIPage) then
GUIPage.Show;
WriteLog(StrPadRight('Starting Uninstall process', 44, '.'));
RemoveEnvironment;
RemoveMake;
if not Target.IsTurboExplorer then
UninstallPackages;
{$IFDEF MSWINDOWS}
if not Target.IsTurboExplorer then
UninstallExperts;
if AUninstallHelp then
UninstallHelp;
{$ENDIF MSWINDOWS}
// TODO: ioJclCopyPackagesHppFiles
UninstallRepository;
// TODO: ioJclMakeDemos:
finally
Target.OutputCallback := nil;
end;
Result := True;
end;
procedure TJclInstallation.WriteLog(const Msg: string);
var
Line: string;
LineType: TCompileLineType;
begin
if not Silent then
begin
Line := InstallCore.ProcessLogLine(Msg, LineType, GUIPage);
if Line <> '' then
FLogLines.Write(Line);
end;
end;
function TJclInstallation.GetBplPath: string;
var
AConfiguration: IJediConfiguration;
begin
if Assigned(GUIPage) then
Result := GUIPage.Directories[FGUIBPLPathIndex]
else
begin
AConfiguration := InstallCore.Configuration;
if Assigned(AConfiguration) then
Result := AConfiguration.OptionAsStringByName[TargetName, RsNameBPLPath]
else
Result := Target.BPLOutputPath;
end;
//{$IFDEF MSWINDOWS}
//Result := PathGetShortName(Result);
//{$ENDIF MSWINDOWS}
end;
function TJclInstallation.GetDcpPath: string;
var
AConfiguration: IJediConfiguration;
begin
if Assigned(GUIPage) then
Result := GUIPage.Directories[FGUIDCPPathIndex]
else
begin
AConfiguration := InstallCore.Configuration;
if Assigned(AConfiguration) then
Result := AConfiguration.OptionAsStringByName[TargetName, RsNameDCPPath]
else
Result := FJclDcpPath;
end;
//{$IFDEF MSWINDOWS}
//Result := PathGetShortName(Result);
//{$ENDIF MSWINDOWS}
end;
procedure TJclInstallation.Close;
procedure SaveOptions;
var
AConfiguration: IJediConfiguration;
Option: TJclOption;
Id, Index: Integer;
ADemoList: TStrings;
begin
AConfiguration := InstallCore.Configuration;
if not (Assigned(AConfiguration) and Assigned(GUIPage)) then
Exit;
for Option := Low(TJclOption) to High(TJclOption) do
begin
Id := OptionData[Option].Id;
AConfiguration.OptionAsBool[TargetName, Id] := GUIPage.OptionChecked[Id];
end;
if not Target.IsTurboExplorer then
begin
ADemoList := GetDemoList;
for Index := 0 to ADemoList.Count - 1 do
begin
Id := Integer(ADemoList.Objects[Index]);
AConfiguration.OptionAsBool[FDemoSectionName, Id] := GUIPage.OptionChecked[Id];
end;
AConfiguration.OptionAsStringByName[TargetName, RsNameBPLPath] := GUIPage.Directories[FGUIBPLPathIndex];
if Target.RadToolKind = brCppBuilder then
AConfiguration.OptionAsStringByName[TargetName, RsNameBPIPath] := GUIPage.Directories[FGUIDCPPathIndex]
else
AConfiguration.OptionAsStringByName[TargetName, RsNameDCPPath] := GUIPage.Directories[FGUIDCPPathIndex];
end;
end;
begin
SaveOptions;
FGUIPage := nil;
FGUI := nil;
end;
function TJclInstallation.CompileLibraryUnits(const SubDir: string; Debug: Boolean): Boolean;
var
UnitList: TStrings;
Compiler: TJclDCC32;
function CompilationOptions: string;
begin
if FTarget.RADToolKind = brCppBuilder then
begin
Result := StringsToStr(Compiler.Options, ' ') + ' ';
Result := StringReplace(Result, '$(BCB)', Target.RootDir, [rfReplaceAll]);
end
else
Result := '';
end;
function CompileUnits: Boolean;
begin
Result := Compiler.Execute({$IFNDEF KYLIX}CompilationOptions + {$ENDIF}StringsToStr(UnitList, ' '));
end;
function CopyFiles(Files: TStrings; const TargetDir: string; Overwrite: Boolean = True): Boolean;
var
I: Integer;
FileName: string;
begin
Result := True;
for I := 0 to Files.Count - 1 do
begin
FileName := Files[I];
Result := Result and FileCopy(FileName, PathAddSeparator(TargetDir) + ExtractFileName(FileName), Overwrite);
end;
end;
procedure CopyResFiles(TargetDir: string);
var
FileList: TStringList;
begin
FileList := TStringList.Create;
try
if BuildFileList('*.res', faAnyFile, FileList) then
CopyFiles(FileList, TargetDir);
finally
FileList.Free;
end;
end;
function CopyHppFiles(const TargetDir: string): Boolean;
var
I: Integer;
FileName: string;
begin
Result := True;
for I := 0 to UnitList.Count - 1 do
begin
FileName := UnitList[I] + '.hpp';
if FileExists(FileName) then
Result := Result and FileCopy(FileName, TargetDir + FileName, True);
end;
end;
var
UnitType, LibDescriptor, SaveDir, UnitOutputDir, Path, ExclusionFileName: string;
Index, ExcIndex: Integer;
Exclusions: TStrings;
begin
Result := True;
if Debug then
UnitType := 'debug ';
LibDescriptor := Format(RsLibDescriptor, [SubDir, UnitType, TargetName]);
WriteLog(Format('Making %s', [LibDescriptor]));
Path := Format('%s' + DirDelimiter + '%s', [Distribution.JclSourceDir, SubDir]);
UnitList := TStringList.Create;
try
BuildFileList(PathAddSeparator(Path) + '*.pas', faAnyFile, UnitList);
ExclusionFileName := PathAddSeparator(FLibDir) + SubDir + '.exc';
if FileExists(ExclusionFileName) then
begin
Exclusions := TStringList.Create;
try
Exclusions.LoadFromFile(ExclusionFileName);
for Index := 0 to Exclusions.Count - 1 do
begin
ExcIndex := UnitList.IndexOf(Exclusions.Strings[Index]);
if ExcIndex >= 0 then
UnitList.Delete(ExcIndex);
end;
finally
Exclusions.Free;
end;
end;
if UnitList.Count = 0 then
Exit;
for Index := 0 to UnitList.Count - 1 do
UnitList.Strings[Index] := ChangeFileExt(UnitList.Strings[Index], '');
{$IFDEF MSWINDOWS}
if CLRVersion <> '' then
Compiler := (Target as TJclBDSInstallation).DCCIL
else
{$ENDIF MSWINDOWS}
Compiler := Target.DCC32;
Compiler.SetDefaultOptions;
//Options.Add('-D' + StringsToStr(Defines, ';'));
Compiler.Options.Add('-M');
if Target.RADToolKind = brCppBuilder then
begin
Compiler.Options.Add('-D_RTLDLL;NO_STRICT;USEPACKAGES'); // $(SYSDEFINES)
if Debug then
begin
Compiler.Options.Add('-$Y+');
Compiler.Options.Add('-$W');
Compiler.Options.Add('-$O-');
Compiler.Options.Add('-v');
UnitOutputDir := FLibDir;
Compiler.AddPathOption('N2', FLibObjDir); // .obj files
end
else
begin
Compiler.Options.Add('-$YD');
Compiler.Options.Add('-$W+');
Compiler.Options.Add('-$O+');
UnitOutputDir := FLibDir;
Compiler.AddPathOption('N2', FLibObjDir); // .obj files
end;
Compiler.Options.Add('-v');
Compiler.Options.Add('-JPHNE');
Compiler.Options.Add('--BCB');
Compiler.AddPathOption('N0', UnitOutputDir); // .dcu files
Compiler.AddPathOption('O', Format(BCBIncludePath, [Distribution.JclSourceDir, Distribution.JclSourcePath]));
Compiler.AddPathOption('U', Format(BCBObjectPath, [Distribution.JclSourceDir, Distribution.JclSourcePath]));
end
else // Delphi
begin
if Debug then
begin
Compiler.Options.Add('-$O-');
if CLRVersion = '' then
Compiler.Options.Add('-$W+');
Compiler.Options.Add('-$R+');
Compiler.Options.Add('-$Q+');
Compiler.Options.Add('-$D+');
Compiler.Options.Add('-$L+');
Compiler.Options.Add('-$Y+');
UnitOutputDir := FDebugDcuDir;
end
else
begin
Compiler.Options.Add('-$O+');
Compiler.Options.Add('-$R-');
Compiler.Options.Add('-$Q-');
Compiler.Options.Add('-$C-');
Compiler.Options.Add('-$D-');
UnitOutputDir := FLibDir;
end;
Compiler.AddPathOption('N', UnitOutputDir);
if CLRVersion <> '' then
Compiler.Options.Add('--default-namespace:Jedi.Jcl');
Compiler.AddPathOption('U', Distribution.JclSourcePath);
Compiler.AddPathOption('R', Distribution.JclSourcePath);
end;
Compiler.AddPathOption('I', Distribution.JclSourceDir);
SaveDir := GetCurrentDir;
Result := SetCurrentDir(Path);
{$IFDEF WIN32}
Win32Check(Result);
{$ELSE}
if Result then
{$ENDIF}
try
WriteLog('');
WriteLog('Compiling .dcu files...');
Result := Result and CompileUnits;
if CLRVersion = '' then
begin
CopyResFiles(UnitOutputDir);
if OptionChecked[joCopyHppFiles] then
begin
MarkOptionBegin(joCopyHppFiles);
WriteLog('Copying .hpp files...');
Result := Result and CopyHppFiles(Target.VclIncludeDir);
MarkOptionEnd(joCopyHppFiles, Result);
end;
{$IFDEF KYLIX}
Compiler.Options.Add('-P'); // generate position independent code (PIC)
WriteLog('');
WriteLog('Compiling dpu files...');
Result := Result and CompileUnits;
{$ENDIF KYLIX}
end;
finally
SetCurrentDir(SaveDir);
end;
finally
UnitList.Free;
end;
if not Result then
WriteLog('Failed ' + LibDescriptor);
end;
{$IFDEF MSWINDOWS}
function TJclInstallation.CompileCLRPackage(const Name: string): Boolean;
var
ProjectFileName: string;
begin
ProjectFileName := Format('%spackages%s%s.net%s%s%s', [PathAddSeparator(Distribution.JclPath),
DirDelimiter, Target.VersionNumberStr, DirDelimiter, Name, SourceExtensionDelphiProject]);
WriteLog(Format('Compiling CLR package %s...', [ProjectFileName]));
if Assigned(GUIPage) then
GUIPage.CompilationStart(ExtractFileName(Name));
Result := TJclBDSInstallation(Target).CompileDelphiDotNetProject(ProjectFileName,
GetBplPath, TargetPlatform, CLRVersion);
end;
{$ENDIF MSWINDOWS}
function TJclInstallation.CompilePackage(const Name: string; InstallPackage: Boolean): Boolean;
var
PackageFileName: string;
{$IFNDEF KYLIX}
DpkPackageFileName: string;
{$ENDIF}
begin
PackageFileName := PathAddSeparator(Distribution.JclPath) + Name;
if InstallPackage then
WriteLog(Format('Installing package %s...', [PackageFileName]))
else
WriteLog(Format('Compiling package %s...', [PackageFileName]));
if Assigned(GUIPage) then
GUIPage.CompilationStart(ExtractFileName(Name));
if IsDelphiPackage(PackageFileName) and (bpDelphi32 in Target.Personalities) then
begin
if InstallPackage then
Result := Target.InstallPackage(PackageFileName, GetBplPath, GetDcpPath)
else
begin
{$IFNDEF KYLIX}
if Target.RadToolKind = brBorlandDevStudio then
(Target as TJclBDSInstallation).CleanPackageCache(BinaryFileName(GetBplPath, PackageFileName));
{$ENDIF ~KYLIX}
Result := Target.CompilePackage(PackageFileName, GetBplPath, GetDcpPath);
end;
end
else if IsBCBPackage(PackageFileName) and (bpBCBuilder32 in Target.Personalities) then
begin
ConfigureBpr2Mak(PackageFileName);
{$IFDEF KYLIX}
if InstallPackage then
Result := Target.InstallPackage(PackageFileName, GetBplPath, GetDcpPath)
else
Result := Target.CompilePackage(PackageFileName, GetBplPath, GetDcpPath);
{$ELSE ~KYLIX}
if Target.RadToolKind = brBorlandDevStudio then
(Target as TJclBDSInstallation).CleanPackageCache(BinaryFileName(GetBplPath, PackageFileName));
// to satisfy JVCL (and eventually other libraries), create a .dcp file;
// Note: it is put out to .bpl path to make life easier for JVCL
DpkPackageFileName := ChangeFileExt(PackageFileName, SourceExtensionDelphiPackage);
if InstallPackage then
Result := ((not FileExists(DpkPackageFileName))
or Target.InstallPackage(DpkPackageFileName, GetBplPath, GetDcpPath))
and Target.InstallPackage(PackageFileName, GetBplPath, GetDcpPath)
else
Result := ((not FileExists(DpkPackageFileName))
or Target.CompilePackage(DpkPackageFileName, GetBplPath, GetDcpPath))
and Target.CompilePackage(PackageFileName, GetBplPath, GetDcpPath);
{$ENDIF ~KYLIX}
end
else
begin
Result := False;
WriteLog(Format('No personality supports the extension %s', [ExtractFileExt(PackageFileName)]));
end;
if Result then
WriteLog('...done.')
else
WriteLog('...failed');
end;
function TJclInstallation.CompileApplication(FileName: string): Boolean;
var
CfgFileName, Directory: string;
begin
Directory := ExtractFileDir(FileName);
FileName := ExtractFileName(FileName);
WriteLog(Format(RsBuildingMessage, [FileName]));
SetCurrentDir(Directory);
CfgFileName := ChangeFileExt(FileName, '.cfg');
StringToFile(CfgFileName, Format(
'-e%s' + AnsiLineBreak + // Exe output dir
'-n.' + AnsiLineBreak + // Unit output dir
'-u%s;%s' + AnsiLineBreak + // Unit directories
'-i%s', // Include path
[Distribution.JclBinDir, FLibDir, Distribution.JclSourcePath, Distribution.JclSourceDir]));
Result := Target.DCC32.Execute(FileName);
FileDelete(CfgFileName);
end;
function TJclInstallation.UninstallPackage(const Name: string): Boolean;
var
PackageFileName: string;
begin
WriteLog(Format('Removing package %s.', [Name]));
PackageFileName := Distribution.JclPath + Format(Name, [Target.VersionNumberStr]);
{$IFNDEF KYLIX}
if Target.RadToolKind = brBorlandDevStudio then
(Target as TJclBDSInstallation).CleanPackageCache(BinaryFileName(GetBPLPath, PackageFileName));
{$ENDIF KYLIX}
Result := Target.UninstallPackage(PackageFileName, GetBPLPath, GetDCPPath);
// delete DCP files that were created to bpl path (old behavior)
FileDelete(PathAddSeparator(GetBPLPath) + PathExtractFileNameNoExt(Name) + CompilerExtensionDCP);
// delete DCP files that were created to target dcp path (old behavior)
FileDelete(PathAddSeparator(Target.DCPOutputPath) + PathExtractFileNameNoExt(Name) + CompilerExtensionDCP);
// delete BPI files that were created to target dcp path (old behavior)
FileDelete(PathAddSeparator(Target.DCPOutputPath) + PathExtractFileNameNoExt(Name) + CompilerExtensionBPI);
// delete LIB files that were created to target dcp path (old behaviour)
FileDelete(PathAddSeparator(Target.DCPOutputPath) + PathExtractFileNameNoExt(Name) + CompilerExtensionLIB);
// TODO : evtl. remove .HPP Files
if Result then
WriteLog('...done.')
else
WriteLog('...failed.');
end;
procedure TJclInstallation.ConfigureBpr2Mak(const PackageFileName: string);
var
PackageDirectory: string;
begin
PackageDirectory := PathAddSeparator(ExtractFileDir(PackageFileName));
if clProj2Mak in Target.CommandLineTools then
begin
Target.Bpr2Mak.Options.Clear;
Target.Bpr2Mak.Options.Add('-t' + ExtractRelativePath(PackageDirectory,Distribution.JclPath + Bcb2MakTemplate));
end;
{$IFDEF KYLIX}
SetEnvironmentVar('OBJDIR', FLibObjDir);
SetEnvironmentVar('BPILIBDIR', GetDcpPath);
SetEnvironmentVar('BPLDIR', GetBplPath);
{$ELSE ~KYLIX}
if clMake in Target.CommandLineTools then
begin
Target.Make.Options.Clear;
Target.Make.AddPathOption('DBPILIBDIR=', GetDcpPath);
Target.Make.AddPathOption('DBPLDIR=', GetBplPath);
if OptionChecked[joCopyPackagesHppFiles] then
//begin
// MarkOptionBegin(joCopyPackagesHppFiles);
Target.Make.AddPathOption('DHPPDIR=', Target.VclIncludeDir);
// MarkOptionEnd(joCopyPackagesHppFiles, True);
//end;
end;
{$ENDIF ~KYLIX}
end;
{$IFDEF MSWINDOWS}
function TJclInstallation.CompileExpert(const Name: string; InstallExpert: Boolean): Boolean;
var
ProjectFileName, ProjectBinaryFileName, ProjectDEFFileName,
ProjectDescription: string;
LibraryPeImage: TJclPeImage;
ExportFuncList: TJclPeExportFuncList;
Index: Integer;
DEFFile: TStrings;
FirstCompilationOk: Boolean;
const
WizardEntryPoint = 'INITWIZARD0001';
// @*@JCLWizardInit$qqsx56System@%DelphiInterface$t28Toolsapi@IBorlandIDEServices%pqqrx47System@%DelphiInterface$t19Toolsapi@IOTAWizard%$orpqqrv$v
InternalEntryPoint = '@JCLWizardInit$';
begin
ProjectFileName := PathAddSeparator(Distribution.JclPath) + Name;
if InstallExpert then
WriteLog(Format('Installing expert %s...', [ProjectFileName]))
else
WriteLog(Format('Compiling expert %s...', [ProjectFileName]));
if Assigned(GUIPage) then
GUIPage.CompilationStart(ExtractFileName(Name));
if IsDelphiProject(ProjectFileName) and (bpDelphi32 in Target.Personalities) then
begin
if InstallExpert then
Result := Target.InstallExpert(ProjectFileName, GetBplPath, GetDcpPath)
else
Result := Target.CompileProject(ProjectFileName, GetBplPath, GetDcpPath);
end
else if IsBCBProject(ProjectFileName) and (bpBCBuilder32 in Target.Personalities) then
begin
ConfigureBpr2Mak(ProjectFileName);
// the compilation is done in 2 steps:
// - first compilation without changes, we try to find the internal export name
// for the wizard entry point function
// - second compilation with creation of an alias between the internal export name
// and the excepted export name
ProjectDEFFileName := ChangeFileExt(ProjectFileName, CompilerExtensionDEF);
// first compilation
DEFFile := TStringList.Create;
try
// the linker doesn't like empty def files
DEFFile.Add('EXPORTS');
DEFFile.SaveToFile(ProjectDEFFileName);
finally
DEFFile.Free;
end;
Result := Target.CompileProject(ProjectFileName, GetBplPath, GetDcpPath);
if Result then
begin
WriteLog('First compilation ok');
LibraryPeImage := TJclPeImage.Create;
try
GetBPRFileInfo(ProjectFileName, ProjectBinaryFileName, @ProjectDescription);
ProjectBinaryFileName := PathAddSeparator(GetBplPath) + ProjectBinaryFileName;
WriteLog(Format('Analysing expert %s for entry point %s...', [ProjectBinaryFileName, WizardEntryPoint]));
LibraryPeImage.FileName := ProjectBinaryFileName;
ExportFuncList := LibraryPeImage.ExportList;
FirstCompilationOk := Assigned(ExportFuncList.ItemFromName[WizardEntryPoint]);
// the expected export name doesn't exist
if not FirstCompilationOk then
begin
Result := False;
WriteLog('Entry point not found');
// try to find the decorated entry point
// export names for pascal functions are:
// @UnitName@FunctionName$ParameterSignature
for Index := 0 to ExportFuncList.Count - 1 do
if Pos(StrUpper(InternalEntryPoint), StrUpper(ExportFuncList.Items[Index].Name)) > 0 then
begin
WriteLog(Format('Internal entry point found %s', [ExportFuncList.Items[Index].Name]));
DEFFile := TStringList.Create;
try
DEFFile.Add('EXPORTS');
DEFFile.Add(Format('%s=%s', [WizardEntryPoint, ExportFuncList.Items[Index].Name]));
DEFFile.SaveToFile(ProjectDEFFileName);
finally
DEFFile.Free;
end;
Result := True;
Break;
end;
end
else
begin
WriteLog('Entry point found, registering expert...');
Target.RegisterExpert(ProjectBinaryFileName, ProjectDescription);
end;
finally
LibraryPeImage.Free;
end;
if Result and (not FirstCompilationOk) then
begin
// second compilation
if InstallExpert then
Result := Target.InstallExpert(ProjectFileName, GetBplPath, GetDcpPath)
else
Result := Target.CompileProject(ProjectFileName, GetBplPath, GetDcpPath);
end
else if not Result then
WriteLog('Internal entry point not found');
end
else
WriteLog('First compilation failed');
end
else
Result := False;
if Result then
WriteLog('...done.')
else
WriteLog('... failed ' + ProjectFileName);
end;
function TJclInstallation.UninstallExpert(const Option: TJclOption): Boolean;
function OldExpertBPLFileName(const BaseName: string): string;
const
OldExperts: array[joExpertDebug..joExpertVersionControl] of string =
(
'JclDebugIde%s0.bpl', 'ProjectAnalyzer%s0.bpl',
'IdeOpenDlgFavorite%s0.bpl', 'JclRepositoryExpert',
'ThreadNameExpert%s0.bpl', 'JediUses%s0.bpl', 'JclSIMDView%s.bpl',
'JclVersionControl'
);
var
I: TJclOption;
begin
with Target do
for I := Low(OldExperts) to High(OldExperts) do
if BaseName = ExpertPaths[I] then
begin
Result := PathAddSeparator(GetBPLPath) + Format(OldExperts[I], [VersionNumberStr]);
Break;
end;
end;
var
BaseName: string;
BPLFileName: string;
PackageFileName: string;
LibraryFileName: string;
begin
Result := False;
BaseName := ExpertPaths[Option];
// uninstall package if it exists
PackageFileName := FullPackageFileName(Target, BaseName);
LibraryFileName := FullLibraryFileName(Target, BaseName);
if FileExists(Distribution.JclPath + PackageFileName) then
begin
Result := UninstallPackage(PackageFileName);
if (Target.RadToolKind = brBorlandDevStudio) and (Target.IDEVersionNumber = 5) then
Target.IdePackages.RemovePackage(PathAddSeparator(GetBplPath) + PathExtractFileNameNoExt(PackageFileName) + '100.bpl');
// eventually remove old expert packages to avoid annoying package conflicts during IDE startup;
// for simplicity, .dcp files are not handled
BaseName := ExtractFileName(BaseName);
BPLFileName := OldExpertBPLFileName(BaseName);
Target.IdePackages.RemovePackage(BPLFileName);
FileDelete(BPLFileName);
end;
if FileExists(Distribution.JclPath + LibraryFileName) then
begin
WriteLog(Format('Removing expert %s', [LibraryFileName]));
// delete DLL experts
Result := Target.UninstallExpert(Distribution.JclPath + LibraryFileName, GetBPLPath);
if Result then
WriteLog('...done.')
else
WriteLog('...failed');
end;
end;
{$ENDIF MSWINDOWS}
function DemoNameCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
Name1, Name2: string;
begin
Name1 := ExtractFileName(List[Index1]);
Name2 := ExtractFileName(List[Index2]);
Result := CompareText(Name1, Name2);
end;
procedure TJclInstallation.AddDemo(const Directory: string; const FileInfo: TSearchRec);
begin
FDemoList.Append(Directory + FileInfo.Name);
end;
procedure TJclInstallation.AddDemos(const Directory: string);
begin
EnumFiles(Directory + '*.dpr', AddDemo);
end;
function TJclInstallation.GetDemoList: TStringList;
procedure ProcessExcludeFile(const ExcFileName: string);
var
DemoExclusionList: TStrings;
ExclusionFileName, FileName, Edition: string;
IndexExc, IndexDemo, EditionPos: Integer;
begin
DemoExclusionList := TStringList.Create;
try
ExclusionFileName := MakePath(PathAddSeparator(Distribution.JclExamplesDir) + ExcFileName);
if FileExists(ExclusionFileName) then
begin
DemoExclusionList.LoadFromFile(ExclusionFileName);
for IndexExc := 0 to DemoExclusionList.Count - 1 do
begin
FileName := DemoExclusionList.Strings[IndexExc];
EditionPos := Pos('=', FileName);
if EditionPos > 0 then
begin
Edition := Copy(FileName, EditionPos + 1, Length(FileName) - EditionPos);
SetLength(FileName, EditionPos - 1);
end
else
Edition := '';
if (Edition = '') or (StrIPos(BorRADToolEditionIDs[Target.Edition], Edition) = 0) then
begin
if ExtractFileExt(FileName) = '.exc' then
ProcessExcludeFile(FileName)
else
begin
for IndexDemo := FDemoList.Count - 1 downto 0 do
if StrMatches(PathAddSeparator(Distribution.JclExamplesDir) + FileName, FDemoList.Strings[IndexDemo]) then
FDemoList.Delete(IndexDemo);
end;
end;
end;
end;
finally
DemoExclusionList.Free;
end;
end;
begin
if not Assigned(FDemoList) then
begin
FDemoList := TStringList.Create;
EnumDirectories(Distribution.JclExamplesDir, AddDemos);
FDemoList.CustomSort(DemoNameCompare);
{$IFDEF KYLIX}
ProcessExcludeFile('k%d.exc');
{$ELSE ~KYLIX}
ProcessExcludeFile('%s.exc');
{$ENDIF ~KYLIX}
end;
Result := FDemoList;
end;
{
function TJclInstallation.Run: Boolean;
procedure EnsureDirectoryExists(const DirectoryName, DisplayName: string);
begin
if not DirectoryExists(DirectoryName) then
begin
if (MessageDlg(Format(RsCreatePath, [DisplayName]), mtConfirmation, [mbYes, mbNo], 0) <> mrYes) then
Abort;
if not ForceDirectories(DirectoryName) then
begin
MessageDlg(Format(RsCantCreatePath, [DirectoryName]), mtError, [mbAbort], 0);
Abort;
end;
end;
end;
var
PathEnvVar: string;
begin
Result := True;
if OptionSelected(ioJCL) then
begin
if not OptionSelected(ioJclPackages)
and (MessageDlg(RsPackageNodeNotSelected, mtWarning, [mbYes, mbNo], 0) <> mrYes) then
Abort;
EnsureDirectoryExists(BplPath, 'BPL');
EnsureDirectoryExists(DcpPath, 'DCP');
{$IFDEF MSWINDOWS
PathEnvVar := RegReadStringDef(HKCU, RegHKCUEnvironmentVar, PathEnvironmentVar, '');
PathListIncludeItems(PathEnvVar, RegReadStringDef(HKLM, RegHKLMEnvironmentVar, PathEnvironmentVar, ''));
if (PathListItemIndex(PathEnvVar, BplPath) = -1) and (PathListItemIndex(PathEnvVar, PathAddSeparator(BplPath)) = -1)
and (MessageDlg(RsAddPathToEnvironment, mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
begin
PathEnvVar := RegReadStringDef(HKCU, RegHKCUEnvironmentVar, PathEnvironmentVar, '');
PathListIncludeItems(PathEnvVar, BplPath);
RegWriteString(HKCU, RegHKCUEnvironmentVar, PathEnvironmentVar, PathEnvVar);
end;
{$ENDIF MSWINDOWS
InstallationStarted;
try
Result := InstallSelectedOptions;
finally
InstallationFinished;
end;
end;
SaveOptions;
end;
}
//=== { TJclDistribution } ===================================================
procedure TJclDistribution.Close;
var
I: Integer;
begin
for I := 0 to TargetInstallCount - 1 do
TargetInstalls[I].Close;
FGUI := nil;
end;
constructor TJclDistribution.Create;
procedure RegisterJclOptions;
var
Option: TJclOption;
AInstallCore: TJediInstallCore;
OptionName: string;
begin
AInstallCore := InstallCore;
for Option := Low(TJclOption) to High(TJclOption) do
begin
OptionName := GetEnumName(TypeInfo(TJclOption), Integer(Option));
OptionName := 'Jcl' + Copy(OptionName, 3, Length(OptionName) - 2);
OptionData[Option].Id := AInstallCore.AddInstallOption(OptionName);
end;
end;
begin
inherited Create;
RegisterJclOptions;
{$IFDEF MSWINDOWS}
FCLRVersions := TStringList.Create;
FRegHelpCommands := TStringList.Create;
{$ENDIF MSWINDOWS}
FRadToolInstallations := TJclBorRADToolInstallations.Create;
FTargetInstalls := TObjectList.Create;
FTargetInstalls.OwnsObjects := True;
end;
function TJclDistribution.CreateInstall(Target: TJclBorRADToolInstallation): Boolean;
function Supported: Boolean;
begin
{$IFDEF KYLIX}
Result := Target.VersionNumber = 3;
{$ELSE ~KYLIX}
case Target.RadToolKind of
brDelphi :
Result := Target.VersionNumber in [5, 6, 7];
brCppBuilder :
Result := Target.VersionNumber in [5, 6];
brBorlandDevStudio :
Result := Target.VersionNumber in [1, 2, 3, 4, 5];
else
Result := False;
end;
{$ENDIF ~KYLIX}
end;
var
Inst: TJclInstallation;
{$IFDEF MSWINDOWS}
Index: Integer;
CLRVersion: string;
{$ENDIF MSWINDOWS}
begin
if Supported then
try
Inst := TJclInstallation.Create(Self, Target);
FTargetInstalls.Add(Inst);
{$IFDEF MSWINDOWS}
// .net "virtual" targets
if (Target is TJclBDSInstallation) and (Target.IDEVersionNumber >= 3) and (not Target.IsTurboExplorer)
and (bpDelphiNet32 in Target.Personalities) then
begin
for Index := 0 to FCLRVersions.Count - 1 do
begin
CLRVersion := FCLRVersions.Names[Index];
if (CompareCLRVersions(CLRVersion, TJclBDSInstallation(Target).MaxDelphiCLRVersion) = 0)
and (CompareCLRVersions(CLRVersion, 'v1.1.2344') >= 0) then // CLR 1.0 not supported by the JCL
begin
Inst := TJclInstallation.Create(Self, Target, CLRVersion);
FTargetInstalls.Add(Inst);
{if Target.VersionNumber >= 4 then
begin
Inst := TJclInstallation.Create(Self, Target, CLRVersion, bp64bit);
FTargetInstalls.Add(Inst);
end;}
end;
end;
end;
{$ENDIF MSWINDOWS}
except
end;
Result := True;
end;
destructor TJclDistribution.Destroy;
begin
{$IFDEF MSWINDOWS}
FCLRVersions.Free;
FRegHelpCommands.Free;
{$ENDIF MSWINDOWS}
FRadToolInstallations.Free;
FTargetInstalls.Free;
inherited Destroy;
end;
function TJclDistribution.GetTargetInstall(Index: Integer): TJclInstallation;
begin
Result := TJclInstallation(FTargetInstalls.Items[Index]);
end;
function TJclDistribution.GetTargetInstallCount: Integer;
begin
Result := FTargetInstalls.Count;
end;
function TJclDistribution.GetVersion: string;
var
DailyFileName, SvnEntriesFileName, RevisionText, StableText, Source: string;
TextFile: TJclMappedTextReader;
Revision, Index: Integer;
begin
Revision := 0;
if JclVersionRelease = 0 then
begin
DailyFileName := FJclPath + DailyRevisionFileName;
if FileExists(DailyFileName) then
begin
// directory from a daily zip
TextFile := TJclMappedTextReader.Create(DailyFileName);
try
RevisionText := TextFile.ReadLn;
if RevisionText <> '' then
begin
Index := Length(RevisionText) - 1; // skip the '.'
while (Index > 1) and (RevisionText[Index] in AnsiDecDigits) do
Dec(Index);
Revision := StrToIntDef(Copy(RevisionText, Index + 1, Length(RevisionText) - Index - 1), 0);
end;
finally
TextFile.Free;
end;
end;
if Revision = 0 then
begin
SvnEntriesFileName := FJclPath + EntriesFileName1;
if not FileExists(SvnEntriesFileName) then
SvnEntriesFileName := FJclPath + EntriesFileName2;
if FileExists(SvnEntriesFileName) then
begin
// directory from subversion
TextFile := TJclMappedTextReader.Create(SvnEntriesFileName);
try
TextFile.ReadLn;
TextFile.ReadLn;
TextFile.ReadLn;
RevisionText := TextFile.ReadLn;
Revision := StrToIntDef(RevisionText, 0);
finally
TextFile.Free;
end;
end;
end;
StableText := RsJclVersionTesting;
end
else
StableText := RsJclVersionRelease;
if Revision = 0 then
begin
Source := RsJclVersionBuild;
Revision := JclVersionBuild;
end
else
Source := RsJclVersionRevision;
Result := Format(RsJclVersionMask, [JclVersionMajor, JclVersionMinor, StableText, Source, Revision])
end;
procedure TJclDistribution.Init;
procedure InitDistribution;
var
ExceptDialogsPath, InstallerFileName: string;
ReadMePage: IJediReadMePage;
Index: Integer;
begin
InstallerFileName := ParamStr(0);
FJclPath := PathAddSeparator(ExpandFileName(PathExtractFileDirFixed(InstallerFileName) + '..'));
{$IFDEF MSWINDOWS}
FJclPath := PathGetShortName(FJclPath);
{$ENDIF MSWINDOWS}
FLibDirMask := Format('%slib' + VersionDirExp, [FJclPath]);
FLibDebugDirMask := FLibDirMask + DirDelimiter + 'debug';
FLibObjDirMask := FLibDirMask + DirDelimiter + 'obj';
FJclBinDir := FJclPath + 'bin';
FJclSourceDir := FJclPath + 'source';
FJclExamplesDir := FJclPath + 'examples';
FJclSourcePath := '';
for Index := Low(JclSourceDirs) to High(JclSourceDirs) do
ListAddItems(FJclSourcePath, DirSeparator, PathAddSeparator(FJclSourceDir) + JclSourceDirs[Index]);
ExceptDialogsPath := FJclPath + ExceptDlgPath;
FClxDialogFileName := ExceptDialogsPath + ExceptDlgClxFileName;
FClxDialogIconFileName := ChangeFileExt(FClxDialogFileName, '.ico');
FVclDialogFileName := ExceptDialogsPath + ExceptDlgVclFileName;
FVclDialogIconFileName := ChangeFileExt(FVclDialogFileName, '.ico');
FVclDialogSendFileName := ExceptDialogsPath + ExceptDlgVclSndFileName;
FVclDialogSendIconFileName := ChangeFileExt(FVclDialogSendFileName, '.ico');
FJclChmHelpFileName := FJclPath + JclChmHelpFile;
FJclHlpHelpFileName := FJclPath + JclHlpHelpFile;
FJclHxSHelpFileName := FJclPath + JclHxSHelpFile;
if not FileExists(FJclChmHelpFileName) then
FJclChmHelpFileName := '';
if not FileExists(FJclHlpHelpFileName) then
FJclHlpHelpFileName := '';
if not FileExists(FJclHxSHelpFileName) then
FJclHxSHelpFileName := '';
{$IFDEF MSWINDOWS}
// Reset ReadOnly flag for dialog forms
FileSetAttr(FClxDialogFileName, faArchive);
FileSetAttr(ChangeFileExt(FClxDialogFileName, '.xfm'), faArchive);
FileSetAttr(FVclDialogFileName, faArchive);
FileSetAttr(ChangeFileExt(FVclDialogFileName, '.dfm'), faArchive);
FileSetAttr(FVclDialogSendFileName, faArchive);
FileSetAttr(ChangeFileExt(FVclDialogSendFileName, '.dfm'), faArchive);
{$ENDIF MSWINDOWS}
FJclReadmeFileName := FJclPath + 'docs' + DirDelimiter + ReadmeFileName;
if Assigned(GUI) then
begin
ReadMePage := GUI.CreateReadmePage;
ReadMePage.Caption := Version;
ReadMePage.ReadmeFileName := FJclReadmeFileName;
end;
{$IFDEF MSWINDOWS}
FCLRVersions.Clear;
try
JclDotNet.TJclClrHost.GetClrVersions(FCLRVersions);
except
// trap exceptions when no .net runtimes are installed
end;
{$ENDIF MSWINDOWS}
end;
procedure CreateInstallations;
begin
if not RADToolInstallations.Iterate(CreateInstall) then
raise EJediInstallInitFailure.CreateRes(@RsNoInstall);
end;
procedure InitInstallations;
var
I: Integer;
begin
for I := 0 to TargetInstallCount - 1 do
TargetInstalls[I].Init;
end;
begin
FGUI := InstallCore.InstallGUI;
InitDistribution;
CreateInstallations;
InitInstallations;
end;
procedure TJclDistribution.Install;
var
I: Integer;
KeepSettings, Success: Boolean;
AInstallation: TJclInstallation;
begin
KeepSettings := True;
try
if RadToolInstallations.AnyInstanceRunning {$IFDEF MSWINDOWS} and not IsDebuggerAttached {$ENDIF} then
begin
if Assigned(GUI) then
GUI.Dialog(RsCloseRADTool, dtError, [drCancel]);
Exit;
end;
{$IFDEF MSWINDOWS}
if Assigned(GUI) then
begin
GUI.Status := 'Initializing JCL installation process';
for I := 0 to TargetInstallCount - 1 do
begin
AInstallation := TargetInstalls[I];
if AInstallation.Enabled and (AInstallation.CLRVersion = '') then
begin
KeepSettings := GUI.Dialog('Do you want to keep JCL expert settings?',
dtConfirmation, [drYes, drNo]) = drYes;
Break;
end;
end;
end;
RegHelpClearCommands;
{$ENDIF MSWINDOWS}
FNbEnabled := 0;
FNbInstalled := 0;
for I := 0 to TargetInstallCount - 1 do
if TargetInstalls[I].Enabled then
Inc(FNbEnabled);
Success := True;
for I := 0 to TargetInstallCount - 1 do
begin
AInstallation := TargetInstalls[I];
if AInstallation.Enabled then
begin
AInstallation.Silent := False;
if (AInstallation.CLRVersion = '') and not KeepSettings then
AInstallation.RemoveSettings;
AInstallation.Uninstall(False);
Success := AInstallation.Install;
if not Success then
Break;
Inc(FNbInstalled);
end;
end;
{$IFDEF MSWINDOWS}
Success := Success and RegHelpExecuteCommands(True);
{$ENDIF MSWINDOWS}
if Assigned(GUI) then
begin
if Success then
GUI.Dialog('Installation success', dtInformation, [drOK])
else
GUI.Dialog('Installation failed, see logs for details', dtError, [drOK]);
end;
finally
if Assigned(GUI) then
GUI.Status := 'Installation finished';
end;
end;
{$IFDEF MSWINDOWS}
const
// Reg Helper constant (chronological order)
RHCreateTransaction = 1;
RHRegisterNameSpace = 2;
RHRegisterFile = 3;
RHPlugNameSpace = 4;
RHUnplugNameSpace = 5;
RHUnregisterFile = 6;
RHUnregisterNameSpace = 7;
RHCommitTransaction = 8;
procedure TJclDistribution.RegHelpClearCommands;
begin
FRegHelpCommands.Clear;
end;
procedure TJclDistribution.RegHelpCommitTransaction;
begin
RegHelpInternalAdd(RHCommitTransaction, 'commit', True);
end;
procedure TJclDistribution.RegHelpCreateTransaction;
begin
RegHelpInternalAdd(RHCreateTransaction, 'create', True);
end;
function TJclDistribution.RegHelpExecuteCommands(DisplayErrors: Boolean): Boolean;
var
Index: Integer;
Parameters, LogFileName, ProgramResult, Verb: string;
ResultLines: TJclMappedTextReader;
TargetInstall: TJclInstallation;
begin
Result := True;
if FRegHelpCommands.Count = 0 then
Exit;
// step 1: compile the RegHelper utility
for Index := TargetInstallCount - 1 downto 0 do // from the end (newer releases ready for vista)
begin
TargetInstall := TargetInstalls[Index];
if TargetInstall.Enabled then
begin
Result := TargetInstall.CompileApplication(JclPath + 'install\RegHelper.dpr');
if not Result then
begin
if Assigned(GUI) then
GUI.Dialog('Failed to compile RegHelper utility', dtError, [drOK]);
Exit;
end;
Break;
end;
end;
// step 2: create parameters for the RegHelper utility
LogFileName := JclBinDir + '\RegHelper.log';
if FileExists(LogFileName) then
FileDelete(LogFileName);
Parameters := '-c -o' + LogFileName;
for Index := 0 to FRegHelpCommands.Count - 1 do
begin
case Integer(FRegHelpCommands.Objects[Index]) of
RHCreateTransaction:
Parameters := Format('%s Create', [Parameters]);
RHRegisterNameSpace:
Parameters := Format('%s "RegNameSpace;%s"', [Parameters, FRegHelpCommands.Strings[Index]]);
RHRegisterFile:
Parameters := Format('%s "RegHelpFile;%s"', [Parameters, FRegHelpCommands.Strings[Index]]);
RHPlugNameSpace:
Parameters := Format('%s "PlugNameSpace;%s"', [Parameters, FRegHelpCommands.Strings[Index]]);
RHUnplugNameSpace:
Parameters := Format('%s "UnplugNameSpace;%s"', [Parameters, FRegHelpCommands.Strings[Index]]);
RHUnregisterFile:
Parameters := Format('%s "UnregHelpFile;%s"', [Parameters, FRegHelpCommands.Strings[Index]]);
RHUnregisterNameSpace:
Parameters := Format('%s "UnregNameSpace;%s"', [Parameters, FRegHelpCommands.Strings[Index]]);
RHCommitTransaction:
Parameters := Format('%s Commit', [Parameters]);
else
if Assigned(GUI) then
GUI.Dialog('Fatal error: unknown reghelp command', dtError, [drOK]);
Exit;
end;
end;
// step 3: inform the user and execute RegHelper
// simple dialog explaining user why we need credentials
if Assigned(GUI) and ((not IsAdministrator) or (IsWinVista or IsWinServer2008)) then
GUI.Dialog(RsHTMLHelp2Credentials, dtInformation, [drOK]);
// RegHelper.exe manifest requires elevation on Vista
if IsAdministrator or IsWinVista or IsWinServer2008 then
Verb := 'open'
else
Verb := 'runas';
Result := JclShell.ShellExecAndWait(JclBinDir + '\RegHelper.exe', Parameters, Verb, SW_HIDE, JclPath + 'help\');
// step 4: examine output
if Result then
begin
if not DisplayErrors then
Exit;
Sleep(500); // wait possible antivirus lock
ResultLines := TJclMappedTextReader.Create(LogFileName);
try
while not ResultLines.Eof do
begin
ProgramResult := ResultLines.ReadLn;
if AnsiPos('ERROR', AnsiUpperCase(ProgramResult)) > 0 then
begin
Result := False;
if Assigned(GUI) then
GUI.Dialog('RegHelper raised an error while executing RegHelp command: ' + AnsiLineBreak + ProgramResult, dtError, [drCancel]);
end;
end;
finally
ResultLines.Free;
end;
end
else
GUI.Dialog('Fatal error: failed to execute RegHelp utility', dtError, [drOK]);
end;
procedure TJclDistribution.RegHelpInternalAdd(Command: Integer;
Arguments: string; DoNotRepeatCommand: Boolean);
var
Index: Integer;
AObject: TObject;
begin
Index := 0;
while Index <= FRegHelpCommands.Count do
begin
if Index = FRegHelpCommands.Count then
begin
FRegHelpCommands.AddObject(Arguments, TObject(Command));
Break;
end;
AObject := FRegHelpCommands.Objects[Index];
if (Integer(AObject) = Command) and
(DoNotRepeatCommand or (FRegHelpCommands.Strings[Index] = Arguments)) then
Break;
if Integer(AObject) > Command then
begin
FRegHelpCommands.InsertObject(Index, Arguments, TObject(Command));
Break;
end;
Inc(Index);
end;
end;
procedure TJclDistribution.RegHelpPlugNameSpaceIn(const SourceNameSpace,
TargetNameSpace: WideString);
begin
RegHelpInternalAdd(RHPlugNameSpace, Format('%s;%s', [SourceNameSpace, TargetNameSpace]), False);
end;
procedure TJclDistribution.RegHelpRegisterHelpFile(const NameSpace,
Identifier: WideString; const LangId: Integer; const HxSFile,
HxIFile: WideString);
begin
RegHelpInternalAdd(RHRegisterFile, Format('%s;%s;%d;%s;%s', [NameSpace, Identifier, LangId, HxSFile, HxIFile]), False);
end;
procedure TJclDistribution.RegHelpRegisterNameSpace(const Name, Collection,
Description: WideString);
begin
RegHelpInternalAdd(RHRegisterNameSpace, Format('%s;%s;%s', [Name, Collection, Description]), False);
end;
procedure TJclDistribution.RegHelpUnPlugNameSpace(const SourceNameSpace,
TargetNameSpace: WideString);
begin
RegHelpInternalAdd(RHUnplugNameSpace, Format('%s;%s', [SourceNameSpace, TargetNameSpace]), False);
end;
procedure TJclDistribution.RegHelpUnregisterHelpFile(const NameSpace,
Identifier: WideString; const LangId: Integer);
begin
RegHelpInternalAdd(RHUnregisterFile, Format('%s;%s;%d', [NameSpace, Identifier, LangId]), False);
end;
procedure TJclDistribution.RegHelpUnregisterNameSpace(const Name: WideString);
begin
RegHelpInternalAdd(RHUnregisterNameSpace, Name, False);
end;
{$ENDIF MSWINDOWS}
procedure TJclDistribution.Uninstall;
var
I: Integer;
Success: Boolean;
AInstallation: TJclInstallation;
begin
try
if RadToolInstallations.AnyInstanceRunning {$IFDEF MSWINDOWS} and not IsDebuggerAttached {$ENDIF} then
begin
if Assigned(GUI) then
GUI.Dialog(RsCloseRADTool, dtError, [drCancel]);
Exit;
end;
if Assigned(GUI) then
GUI.Status := 'Initializing JCL uninstallation process';
{$IFDEF MSWINDOWS}
RegHelpClearCommands;
{$ENDIF MSWINDOWS}
Success := True;
for I := 0 to TargetInstallCount - 1 do
begin
AInstallation := TargetInstalls[I];
AInstallation.Silent := False;
if AInstallation.Enabled and (not AInstallation.RemoveSettings) or not AInstallation.Uninstall(True) then
Success := False;
end;
{$IFDEF MSWINDOWS}
RegHelpExecuteCommands(False);
{$ENDIF MSWINDOWS}
if Assigned(GUI) then
begin
if Success then
GUI.Dialog('Uninstallation success', dtInformation, [drOK])
else
GUI.Dialog('Uninstallation failed, see logs for details', dtError, [drOK]);
end;
finally
if Assigned(GUI) then
GUI.Status := 'Uninstallation finished';
end;
end;
initialization
JediInstall.InstallCore.AddProduct(TJclDistribution.Create);
end.