Lazarus IDE에 사용자 정의 매크로 추가하기

Lazarus 통합 개발 환경(IDE)은 빌드 프로세스 및 기타 자동화된 작업에서 유용한 매크로 기능을 제공합니다. 이 글에서는 기존 매크로 시스템을 확장하여 사용자 정의 매크로를 추가하는 방법을 설명합니다. 특히, 프로젝트의 현재 버전 정보를 얻어오는 AppVersion 매크로를 구현하는 과정을 통해 자세히 알아보겠습니다. Lazarus IDE의 매크로 관리는 주로 BuildManager.pas 유닛에서 이루어집니다.

새로운 매크로를 추가하려면 다음 단계를 따릅니다.

1. TBuildManager 클래스에 매크로 처리 함수 선언 추가

먼저, TBuildManager 클래스의 private 섹션에 새로 추가할 매크로를 처리할 함수의 선언을 추가합니다. 이 함수는 매크로 파라미터를 받아들여 최종 문자열 결과를 반환합니다.

type
  TBuildManager = class(TInterfacedPersistent)
  private
    // ... 기존 멤버 변수 및 함수 ...
    function HandleProjectVersionMacro(const MacroParam: string; const MacroData: PtrInt;
                                     var ShouldAbort: boolean): string;
    function FormatFullVersionString(Major, Minor, Revision, Build: Integer): string;
    // ...
  end;

2. 매크로 정의를 전역 목록에 등록

TBuildManager.SetupTransferMacros 프로시저 내에서 새로 정의한 매크로를 전역 매크로 목록에 추가해야 합니다. 이 작업은 매크로 이름, 설명, 그리고 처리 함수를 연결합니다.

procedure TBuildManager.SetupTransferMacros;
begin
  // ... 기존 매크로 등록 ...
  GlobalMacroList.Add(TTransferMacro.Create('AppVersion', '',
                      AppVersionDescription, @HandleProjectVersionMacro, []));
  // ...
end;

3. 매크로 번역 문자열 추가

IDE가 매크로 이름을 사용자에게 표시할 때 사용될 번역 가능한 문자열을 TBuildManager.TranslateMacros 프로시저에 추가합니다. 이는 IDE의 국제화에 기여합니다.

procedure TBuildManager.TranslateMacros(var MacroName, MacroDescription: string);
begin
  // ... 기존 번역 항목 ...
  tr('AppVersion', AppVersionDescription);
  // ...
end;

4. 매크로 처리 함수 구현

TBuildManager 클래스에 추가한 HandleProjectVersionMacro 함수와 버전 문자열 포맷팅을 위한 헬퍼 함수 FormatFullVersionString을 구현합니다. 이 함수는 매크로에 전달된 파라미터에 따라 프로젝트의 버전 정보를 추출하고 적절한 형식으로 반환합니다.

function TBuildManager.FormatFullVersionString(Major, Minor, Revision, Build: Integer): string;
begin
  if Build <> 0 then
    Result := Format('%d.%d.%d.%d', [Major, Minor, Revision, Build])
  else if Revision <> 0 then
    Result := Format('%d.%d.%d', [Major, Minor, Revision])
  else
    Result := Format('%d.%d', [Major, Minor]);
end;

function TBuildManager.HandleProjectVersionMacro(const MacroParam: string;
  const MacroData: PtrInt; var ShouldAbort: boolean): string;
const
  VersionPartIdentifiers: array of string = ('', 'main', 'sub', 'patch', 'buildnum');
  DefaultVersionStrings: array of string = ('0.0', '0', '0', '0', '0');
var
  partIndex: integer;
  ProjectVersionInfo: TProjectVersionInfo;
begin
  // 매크로 파라미터에 따라 적절한 버전 정보를 찾습니다.
  for partIndex := 0 to high(VersionPartIdentifiers) do
    if CompareText(MacroParam, VersionPartIdentifiers[partIndex]) = 0 then
    begin
      Result := DefaultVersionStrings[partIndex]; // 기본값 설정

      // 현재 프로젝트 및 버전 정보 사용 여부 확인
      if (Project1 = nil) or
         (Project1.ProjResources = nil) or
         (Project1.ProjResources.VersionInfo = nil) or
         (not Project1.ProjResources.VersionInfo.UseVersionInfo) then
        Exit; // 버전 정보를 사용할 수 없으면 기본값 반환

      ProjectVersionInfo := Project1.ProjResources.VersionInfo;

      // 파라미터에 따른 특정 버전 부분 반환
      case partIndex of
        1: Result := IntToStr(ProjectVersionInfo.MajorVersionNr);
        2: Result := IntToStr(ProjectVersionInfo.MinorVersionNr);
        3: Result := IntToStr(ProjectVersionInfo.RevisionNr);
        4: Result := IntToStr(ProjectVersionInfo.BuildNr);
      else // 전체 버전 문자열 반환
        Result := FormatFullVersionString(ProjectVersionInfo.MajorVersionNr,
                                         ProjectVersionInfo.MinorVersionNr,
                                         ProjectVersionInfo.RevisionNr,
                                         ProjectVersionInfo.BuildNr);
      end;
      Exit; // 매크로 처리 완료
    end;
  Result := ''; // 유효하지 않은 파라미터
end;

5. 매크로 설명 문자열 추가

LazarusIDEStrConsts.pas 유닛에 매크로의 설명을 위한 문자열 상수를 추가합니다.

resourcestring
  // ... 기타 리소스 문자열 ...
  AppVersionDescription = 'Application Version Information';

위의 모든 변경 사항을 적용한 후 Lazarus IDE를 다시 빌드해야 합니다. 재빌드가 완료되면 새로운 AppVersion 매크로를 사용할 수 있습니다. 예를 들어, 빌드 타겟 파일명에 이 매크로를 포함하면 컴파일된 프로그램에 자동으로 버전 번호가 붙게 됩니다.

태그: Lazarus Free Pascal IDE Extension Macros Pascal Programming

7월 12일 22:43에 게시됨