mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 14:49:34 +01: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.
 | 
						|
 |