From 7805a0222a0f8d4d5a5cd8a14bd1a729c1b3de3e Mon Sep 17 00:00:00 2001 From: Craig Moksnes Date: Tue, 1 Oct 2024 11:33:47 -0500 Subject: [PATCH] Improve support for relative paths --- Classes/Chet.HeaderTranslator.pas | 31 +++++++++-- Forms/Form.Main.pas | 85 ++++++++++++++++--------------- 2 files changed, 70 insertions(+), 46 deletions(-) diff --git a/Classes/Chet.HeaderTranslator.pas b/Classes/Chet.HeaderTranslator.pas index 7db5602..ef651e1 100644 --- a/Classes/Chet.HeaderTranslator.pas +++ b/Classes/Chet.HeaderTranslator.pas @@ -152,6 +152,9 @@ TVarDeclInfo = record constructor Create(const AProject: TProject); destructor Destroy; override; + function GetExpandedHeaderFileDirectory: String; + function GetExpandedTargetPasFile: String; + { Runs the header translator. } procedure Run; @@ -352,6 +355,26 @@ constructor THeaderTranslator.Create(const AProject: TProject); SetupSymbolsToIgnore; end; +function THeaderTranslator.GetExpandedHeaderFileDirectory: String; +begin + if TPath.IsRelativePath(FProject.HeaderFileDirectory) then + Result := TPath.Combine(TPath.GetDirectoryName(FProject.ProjectFilename), FProject.HeaderFileDirectory) + else + Result := FProject.HeaderFileDirectory; + + Result := ExpandUNCFileName(IncludeTrailingPathDelimiter(Result)); +end; + +function THeaderTranslator.GetExpandedTargetPasFile: String; +begin + if TPath.IsRelativePath(FProject.TargetPasFile) then + Result := TPath.Combine(TPath.GetDirectoryName(FProject.ProjectFilename), FProject.TargetPasFile) + else + Result := FProject.TargetPasFile; + + Result := ExpandUNCFileName(Result); +end; + procedure THeaderTranslator.CreateCombinedHeaderFile; var Option: TSearchOption; @@ -365,7 +388,7 @@ procedure THeaderTranslator.CreateCombinedHeaderFile; else Option := TSearchOption.soTopDirectoryOnly; - HeaderPath := IncludeTrailingPathDelimiter(FProject.HeaderFileDirectory); + HeaderPath := GetExpandedHeaderFileDirectory; IgnoredFiles := FProject.IgnoredFiles.Split([','], '"', '"', TStringSplitOptions.ExcludeEmpty); if (Length(IgnoredFiles) = 0) then @@ -386,7 +409,7 @@ procedure THeaderTranslator.CreateCombinedHeaderFile; end); if (Length(HeaderFiles) = 0) then - raise EHeaderTranslatorError.CreateFmt('No C header files found in directory "%s".', [FProject.HeaderFileDirectory]); + raise EHeaderTranslatorError.CreateFmt('No C header files found in directory "%s".', [GetExpandedHeaderFileDirectory]); Writer := TStreamWriter.Create(FCombinedHeaderFilename); try @@ -738,7 +761,7 @@ function THeaderTranslator.ParseCombinedHeaderFile: Boolean; Args := Args + ['-fparse-all-comments']; end; - Args := Args + ['-I' + FProject.HeaderFileDirectory]; + Args := Args + ['-I' + GetExpandedHeaderFileDirectory]; FTranslationUnit := FIndex.ParseTranslationUnit(FCombinedHeaderFilename, Args, [], Options); @@ -846,7 +869,7 @@ procedure THeaderTranslator.Run; AnalyzeTypes; FCommentWriter := nil; - FWriter := TSourceWriter.Create(FProject.TargetPasFile); + FWriter := TSourceWriter.Create(GetExpandedTargetPasFile); try CreateCommentWriter; FWriter.WriteLn('unit %s;', [TPath.GetFileNameWithoutExtension(FProject.TargetPasFile)]); diff --git a/Forms/Form.Main.pas b/Forms/Form.Main.pas index db3d61a..0daf3a1 100644 --- a/Forms/Form.Main.pas +++ b/Forms/Form.Main.pas @@ -304,58 +304,59 @@ procedure TFormMain.ActionRunTranslatorExecute(Sender: TObject); P: TPlatform; PlatformCount: Integer; begin - if (FProject.HeaderFileDirectory <> '') and (not TDirectory.Exists(FProject.HeaderFileDirectory)) then - begin - ConfigError('Header file directory does not exist', EditHeaderFileDirectory); - Exit; - end; + Translator := THeaderTranslator.Create(FProject); + try + if not TDirectory.Exists(Translator.GetExpandedHeaderFileDirectory) then + begin + ConfigError('Header file directory does not exist', EditHeaderFileDirectory); + Exit; + end; - if (FProject.TargetPasFile = '') then - begin - ConfigError('Target Pascal file not provided', EditPasFile); - Exit; - end; + if (FProject.TargetPasFile = '') then + begin + ConfigError('Target Pascal file not provided', EditPasFile); + Exit; + end; - Directory := TPath.GetDirectoryName(FProject.TargetPasFile); - if (Directory <> '') and (not TDirectory.Exists(Directory)) then - begin - ConfigError('Directory for target Pascal file does not exist', EditPasFile); - Exit; - end; + Directory := TPath.GetDirectoryName(Translator.GetExpandedTargetPasFile); + if not TDirectory.Exists(Directory) then + begin + ConfigError('Directory for target Pascal file does not exist', EditPasFile); + Exit; + end; - if (FProject.LibraryConstant = '') then - begin - ConfigError('Library constant not specified', EditLibConstant); - Exit; - end; + if (FProject.LibraryConstant = '') then + begin + ConfigError('Library constant not specified', EditLibConstant); + Exit; + end; - PlatformCount := 0; - for PT := Low(TPlatformType) to High(TPlatformType) do - begin - P := FProject.Platforms[PT]; - if (P.Enabled) then + PlatformCount := 0; + for PT := Low(TPlatformType) to High(TPlatformType) do begin - if (P.LibraryName = '') then + P := FProject.Platforms[PT]; + if (P.Enabled) then begin - ConfigError('Library name for platform not specified', FPlatformLibraryName[PT]); - Exit; + if (P.LibraryName = '') then + begin + ConfigError('Library name for platform not specified', FPlatformLibraryName[PT]); + Exit; + end; + Inc(PlatformCount); end; - Inc(PlatformCount); end; - end; - if (PlatformCount = 0) then - begin - ConfigError('At least 1 platform must be enabled', CheckBoxWin32); - Exit; - end; + if (PlatformCount = 0) then + begin + ConfigError('At least 1 platform must be enabled', CheckBoxWin32); + Exit; + end; + + CardPanel.ActiveCard := CardTranslate; + ButtonGroupCategories.ItemIndex := CardTranslate.CardIndex; + MemoMessages.Clear; + Application.ProcessMessages; // Ugh - CardPanel.ActiveCard := CardTranslate; - ButtonGroupCategories.ItemIndex := CardTranslate.CardIndex; - MemoMessages.Clear; - Application.ProcessMessages; // Ugh - Translator := THeaderTranslator.Create(FProject); - try Translator.OnMessage := HandleTranslatorMessage; Translator.Run; TFilePostProcessor.Execute(FProject, ScriptMemo.Lines);