mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-08 02:58:10 +02:00
342 lines
8.8 KiB
ObjectPascal
342 lines
8.8 KiB
ObjectPascal
{
|
|
***************************************************************************
|
|
* *
|
|
* This source is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This code is distributed in the hope that it will be useful, but *
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
* General Public License for more details. *
|
|
* *
|
|
* A copy of the GNU General Public License is available on the World *
|
|
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
|
|
* obtain it by writing to the Free Software Foundation, *
|
|
* Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. *
|
|
* *
|
|
***************************************************************************
|
|
|
|
Author: Mattias Gaertner
|
|
|
|
Abstract:
|
|
Function to load compiler options from Lazarus projects and packages.
|
|
}
|
|
unit ctloadlaz;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileProcs, LazFileUtils, Laz2_XMLCfg;
|
|
|
|
type
|
|
TCTLParseString = record
|
|
UnparsedValue: string;
|
|
ParsedValue: string;
|
|
ParseStamp: int64;
|
|
Parsing: boolean;
|
|
end;
|
|
|
|
TCTLModuleValue = (
|
|
clmBaseDir,
|
|
clmFilename,
|
|
clmIncPath,
|
|
clmUnitPath,
|
|
clmSrcPath,
|
|
clmOutputDir
|
|
);
|
|
|
|
{ TCTLazarusModule }
|
|
|
|
TCTLazarusModule = class
|
|
private
|
|
FFilename: string;
|
|
FFiles: TStrings;
|
|
FName: string;
|
|
function GetBaseDir: string;
|
|
function GetIncludePath: string;
|
|
function GetOutputDir: string;
|
|
function GetSrcPath: string;
|
|
function GetUnitPath: string;
|
|
protected
|
|
FParseValues: array[TCTLModuleValue] of TCTLParseString;
|
|
procedure SetUnparsedValue(Prop: TCTLModuleValue; NewValue: string);
|
|
procedure SetBaseDir(AValue: string); virtual;
|
|
procedure SetFilename(AValue: string); virtual;
|
|
procedure SetFiles(AValue: TStrings); virtual;
|
|
procedure SetIncludePath(AValue: string); virtual;
|
|
procedure SetName(AValue: string); virtual;
|
|
procedure SetOutputDir(AValue: string); virtual;
|
|
procedure SetSrcPath(AValue: string); virtual;
|
|
procedure SetUnitPath(AValue: string); virtual;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
procedure Clear; virtual;
|
|
procedure LoadFromFile(aFilename: string); virtual;
|
|
procedure LoadFromConfig(Cfg: TXMLConfig); virtual;
|
|
property Filename: string read FFilename write SetFilename;
|
|
property Name: string read FName write SetName;
|
|
property BaseDir: string read GetBaseDir write SetBaseDir;
|
|
property UnitPath: string read GetUnitPath write SetUnitPath;
|
|
property IncludePath: string read GetIncludePath write SetIncludePath;
|
|
property SrcPath: string read GetSrcPath write SetSrcPath;
|
|
property OutputDir: string read GetOutputDir write SetOutputDir;
|
|
property Files: TStrings read FFiles write SetFiles;
|
|
end;
|
|
|
|
TCTLazarusPackage = class(TCTLazarusModule)
|
|
public
|
|
end;
|
|
|
|
TCTLazarusProject = class(TCTLazarusModule)
|
|
public
|
|
end;
|
|
|
|
{ TCTLazarusManager }
|
|
|
|
TCTLazarusManager = class
|
|
private
|
|
FActiveProject: TCTLazarusProject;
|
|
FPrimaryConfigPath: string;
|
|
procedure SetActiveProject(AValue: TCTLazarusProject);
|
|
procedure SetPrimaryConfigPath(AValue: string);
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
procedure ParseParams;
|
|
property PrimaryConfigPath: string read FPrimaryConfigPath write SetPrimaryConfigPath;
|
|
property ActiveProject: TCTLazarusProject read FActiveProject write SetActiveProject;
|
|
procedure OpenProject(var aProject: TCTLazarusProject; aFilename: string);
|
|
end;
|
|
|
|
var
|
|
CTLazarusBoss: TCTLazarusManager = nil;
|
|
CTLazParseStamp: int64 = CTInvalidChangeStamp64;
|
|
|
|
procedure CreateCTLazarusBoss;
|
|
procedure IncreaseCTLazParseStamp;
|
|
|
|
implementation
|
|
|
|
procedure CreateCTLazarusBoss;
|
|
begin
|
|
CTLazarusBoss:=TCTLazarusManager.Create;
|
|
end;
|
|
|
|
procedure IncreaseCTLazParseStamp;
|
|
begin
|
|
CTIncreaseChangeStamp64(CTLazParseStamp);
|
|
end;
|
|
|
|
{ TCTLazarusModule }
|
|
|
|
function TCTLazarusModule.GetBaseDir: string;
|
|
begin
|
|
Result:=FParseValues[clmBaseDir].UnparsedValue;
|
|
end;
|
|
|
|
function TCTLazarusModule.GetIncludePath: string;
|
|
begin
|
|
Result:=FParseValues[clmIncPath].UnparsedValue;
|
|
end;
|
|
|
|
function TCTLazarusModule.GetOutputDir: string;
|
|
begin
|
|
Result:=FParseValues[clmOutputDir].UnparsedValue;
|
|
end;
|
|
|
|
function TCTLazarusModule.GetSrcPath: string;
|
|
begin
|
|
Result:=FParseValues[clmSrcPath].UnparsedValue;
|
|
end;
|
|
|
|
function TCTLazarusModule.GetUnitPath: string;
|
|
begin
|
|
Result:=FParseValues[clmUnitPath].UnparsedValue;
|
|
end;
|
|
|
|
procedure TCTLazarusModule.SetUnparsedValue(Prop: TCTLModuleValue;
|
|
NewValue: string);
|
|
begin
|
|
if FParseValues[Prop].UnparsedValue=NewValue then exit;
|
|
if FParseValues[Prop].Parsing then
|
|
raise Exception.Create('TCTLazarusModule.SetParsedValue can not set while parsing');
|
|
FParseValues[Prop].UnparsedValue:=NewValue;
|
|
FParseValues[Prop].ParseStamp:=CTLazParseStamp;
|
|
IncreaseCTLazParseStamp;
|
|
end;
|
|
|
|
procedure TCTLazarusModule.SetBaseDir(AValue: string);
|
|
var
|
|
NewValue: String;
|
|
begin
|
|
NewValue:=TrimFilename(AValue);
|
|
if BaseDir=NewValue then Exit;
|
|
SetUnparsedValue(clmBaseDir,NewValue);
|
|
end;
|
|
|
|
procedure TCTLazarusModule.SetFilename(AValue: string);
|
|
begin
|
|
if FFilename=AValue then Exit;
|
|
FFilename:=AValue;
|
|
BaseDir:=ExtractFilePath(FFilename);
|
|
IncreaseCTLazParseStamp;
|
|
end;
|
|
|
|
procedure TCTLazarusModule.SetFiles(AValue: TStrings);
|
|
begin
|
|
if FFiles.Equals(AValue) then Exit;
|
|
FFiles.Assign(AValue);
|
|
end;
|
|
|
|
procedure TCTLazarusModule.SetIncludePath(AValue: string);
|
|
var
|
|
NewValue: String;
|
|
begin
|
|
NewValue:=Trim(AValue);
|
|
if IncludePath=NewValue then Exit;
|
|
SetUnparsedValue(clmIncPath,NewValue);
|
|
end;
|
|
|
|
procedure TCTLazarusModule.SetName(AValue: string);
|
|
begin
|
|
if FName=AValue then Exit;
|
|
FName:=AValue;
|
|
IncreaseCTLazParseStamp;
|
|
end;
|
|
|
|
procedure TCTLazarusModule.SetOutputDir(AValue: string);
|
|
var
|
|
NewValue: String;
|
|
begin
|
|
NewValue:=TrimFilename(AValue);
|
|
if OutputDir=NewValue then Exit;
|
|
SetUnparsedValue(clmOutputDir,NewValue);
|
|
end;
|
|
|
|
procedure TCTLazarusModule.SetSrcPath(AValue: string);
|
|
var
|
|
NewValue: String;
|
|
begin
|
|
NewValue:=Trim(AValue);
|
|
if SrcPath=NewValue then Exit;
|
|
SetUnparsedValue(clmSrcPath,NewValue);
|
|
end;
|
|
|
|
procedure TCTLazarusModule.SetUnitPath(AValue: string);
|
|
var
|
|
NewValue: String;
|
|
begin
|
|
NewValue:=Trim(AValue);
|
|
if UnitPath=NewValue then Exit;
|
|
SetUnparsedValue(clmUnitPath,NewValue);
|
|
end;
|
|
|
|
constructor TCTLazarusModule.Create;
|
|
begin
|
|
FFiles:=TStringList.Create;
|
|
end;
|
|
|
|
destructor TCTLazarusModule.Destroy;
|
|
begin
|
|
Clear;
|
|
FreeAndNil(FFiles);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TCTLazarusModule.Clear;
|
|
begin
|
|
FFiles.Clear;
|
|
UnitPath:='';
|
|
IncludePath:='';
|
|
SrcPath:='';
|
|
OutputDir:='';
|
|
end;
|
|
|
|
procedure TCTLazarusModule.LoadFromFile(aFilename: string);
|
|
var
|
|
Cfg: TXMLConfig;
|
|
begin
|
|
Clear;
|
|
Filename:=TrimAndExpandFilename(aFilename);
|
|
Cfg:=TXMLConfig.Create(Filename);
|
|
try
|
|
LoadFromConfig(Cfg);
|
|
finally
|
|
Cfg.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TCTLazarusModule.LoadFromConfig(Cfg: TXMLConfig);
|
|
begin
|
|
if Cfg=nil then ;
|
|
// ToDo
|
|
RaiseCatchableException('not implemented yet');
|
|
end;
|
|
|
|
{ TCTLazarusManager }
|
|
|
|
procedure TCTLazarusManager.SetPrimaryConfigPath(AValue: string);
|
|
begin
|
|
if FPrimaryConfigPath=AValue then Exit;
|
|
FPrimaryConfigPath:=AValue;
|
|
end;
|
|
|
|
procedure TCTLazarusManager.SetActiveProject(AValue: TCTLazarusProject);
|
|
begin
|
|
if FActiveProject=AValue then Exit;
|
|
FActiveProject:=AValue;
|
|
end;
|
|
|
|
constructor TCTLazarusManager.Create;
|
|
begin
|
|
|
|
end;
|
|
|
|
destructor TCTLazarusManager.Destroy;
|
|
begin
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TCTLazarusManager.ParseParams;
|
|
|
|
function ParamIs(Param, Option: string; out Value: string): boolean;
|
|
begin
|
|
Value:='';
|
|
if LeftStr(Param,length(Option))<>Option then exit(false);
|
|
Value:=copy(Param,length(Option)+1,length(Param));
|
|
Result:=true;
|
|
end;
|
|
|
|
var
|
|
i: Integer;
|
|
p: String;
|
|
s: string;
|
|
begin
|
|
for i:=1 to Paramcount do begin
|
|
p:=ParamStr(i);;
|
|
if ParamIs(p,'--pcp=',s) or ParamIs(p,'--primary-config-path=',s) then
|
|
PrimaryConfigPath:=s;
|
|
end;
|
|
end;
|
|
|
|
procedure TCTLazarusManager.OpenProject(var aProject: TCTLazarusProject;
|
|
aFilename: string);
|
|
begin
|
|
aFilename:=TrimAndExpandFilename(aFilename);
|
|
if aProject=nil then
|
|
aProject:=TCTLazarusProject.Create;
|
|
aProject.LoadFromFile(aFilename);
|
|
end;
|
|
|
|
initialization
|
|
CTLazarusBoss:=TCTLazarusManager.Create;
|
|
finalization;
|
|
FreeAndNil(CTLazarusBoss);
|
|
end.
|
|
|