Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

델파이 프로젝트의 커맨드-라인 컴파일: 실제 예시


Recommended Posts

Softacom Information"Command-line Compilation Of Delphi Projects: Real-life Examples 을 번역했습니다. (원문 작성: 2023년 11월, 최종 번역: 2023년 12월)

델파이 앱 커맨드-라인 컴파일을 사용하면, 개발자는 IDE(통합 개발 환경) 소프트웨어를 실행할 필요 없이 백그라운드 체제에서 프로젝트를 컴파일할 수 있다. 이 접근 방식은 컴파일 절차를 자동화 하는데 매우 유용하다. 특히 많은 프로젝트 및/또는 라이브러리를 컴파일 해야 하는 경우라면 더욱 그렇다.  커맨드-라인 컴파일을 수행하려면 MSBuild 명령을 사용하게 된다. 이 명령의 파라미터들에 대해서는 다음 문서에서 자세히 볼 수 있다: https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Building_a_Project_Using_an_MSBuild_Command

이 블로그 글은 VCL 앱 컴파일하는 BAT 파일을 만드는 예시를 분석한다.

기초부터 시작해 보자. 개발자가 개발 환경(IDE)에서 컴파일을 시작하면, 개발 환경은 자동으로 환경 변수를 등록한다. 하지만, 커맨드-라인에서 프로젝트를 컴파일하기 위해 MSBuild를 사용하게 되면 , 환경 변수를 등록할 필요가 있다. 그렇게 하기 위해 필요한 모든 설정은 이미 rsvars.bat 파일(bin 폴더에 있음) 안에 이미 들어 있다. 델파이 11의 경우, rsvars.bat 파일 경로는 대체로 다음과 같다. C:Program Files (x86)\Embarcadero\Studio\22.0\bin 이다. 따라서 BAT파일 안에서는 MSBuild를 호출하기에 앞서 다음 명령이 실행되도록 해야 한다. 

call "C:Program Files (x86)\Embarcadero\Studio\22.0\bin\rsvars.bat"

rsvars.bat 파일에는 시스템 변수가 들어 있다. 만약 델파이에 자신만의 변수를 추가했다면(Tools > Options > IDE > Environment Variables > User System Overrides), 그리고 그 변수들이 프로젝트 설정에서 사용되고 있는 경우에는, 그 변수 값들을 수동으로 BAT 파일에 적어주어야 한다. 예를 들면 다음과 같다:

@SET MyMainProjectBin=C:\Work\MainProject\Bin

EnvVar_User_Sytem_Override-9842117.png?s

이 단계가 되면 우리는 이미 커맨드-라인에서 프로젝트를 컴파일할 수 있는 상태가 된다. 컴파일을 하려면 .dproj 파일 경로를 적어서 MSBuild를 호출해야 한다. 프로젝트 이름이 “MainProject"라면, 해당 명령은 다음과 같다.

MSBuild ".MainProject.dproj"

프로젝트 그룹을 컴파일하려면, .dproj 파일 대신 groupproj 파일을 지정하면 된다. 예를 들면 다음과 같다:

MSBuild ".GroupOfProjects.groupproj"

위 명령을 실햏하면, MSBuild가 그 프로젝트 그룹 안에 있는 프로젝트를 하나씩 컴파일할 것이다.

이 접근 방식에는 단점이 있다. 컴파일 시 일부는 기본 매개변수를 사용하고 또 다른 일부는  .dproj 파일의 매개변수를 사용한다는 점이다. 프로젝트를 Win64 플랫폼과 Release(릴리스)로 구성하여 컴파일해야 하는 상황이 있을 수 있을 텐데, 그런 경우에,기본 설정에 따르면, 프로젝트 파일은 Win32 플랫폼과 Debug(디버그) 구성을 선택하게 된다. 이런 상황이라면, 추가 파라미터를 명시해 주어야 한다. 이제 그 점에 대해 얘기해보자.

/t:<타겟 이름>은 정확히 무엇을 수행해야 하는지를 컴파일러에게 알려 주는 파라미터이다. 표준 값으로는 clean, make, build 세 가지가 있다. Clean – 프로젝트를 정리하라는 지시로써, 오브젝트 코드 등 생성된 파일을 제거한다. Make – 프로젝트를 컴파일 하라는 지시이다. Build –프로젝트를 빌드하라는 지시이다.

/p:config= 는 구성(configuaration)을 명시하는 파라미터이다. 이는 Debug, Release 와 같은 기본 구성일 수도 있고  또는 개발자가 해당 프로젝트에 추가해 놓은 구성일 수 있다. 구성 이름 안에 공백이 있는 경우에는 다음과 같이 이름을 큰 따옴표로 묶어서 입력한다.

/p:config ="My config"

/p:platform=을 사용하면 대상 플랫폼을 지정할 수 있다. 가능한 변형으로는 Win32, Win64, Android, iOSDevice64, Linux64이 있으며, 그 중 하나를 명명해야 한다.

즉, 릴리스 구성을 사용하여 Win64용 앱을 컴파일해야 하는 경우 커맨드 라인은 다음과 같다.

MSBuild ".MainProject.dproj" /t:Build /p:Config=Release /p:platform=Win64

그런데 언제나 똑같이 위 구성만 사용하는 것이 아니라면 어떻게 해야 할까? BAT 파일은 변수를 사용하여 실행하는 것이 가능하다. 그 결과, 스크립트 실행 중에 사용자에게 수행해야 할 작업에 대해 질문할 수 있다. 또한, 입력 파라미터를 전달하는 것도 BAT파일에서 가능하다. 예를 들어 플랫폼(Win32,Win64), 구성(Release, Debug) 및 수행해야 하는 작업(Clean, Make, Build) 등을 입력 매개변수로 전달하는 것이 가능하다. 아래에서 범용 스크립트의 예를 볼 수 있다.

@echo off
:: 파라미터 3 개를 해석(parse)한다. 파라미터는 다음과 같아야 한다:
::   BuildMode - Build, Clean, Make
::   ConfigMode - Debug, Release
::   PlatformMode - Win32, Win64
 
:: 확인하기. 사용자가 도움을 구하려고   수도 있다
if [%1%]==[?] goto info
if [%1%]==[/?] goto info
 
 
:: 모든 외부 파라미터들을 해석하고,  값을 변수들 안에 지정한다
FOR %%A IN (%*) DO (
   FOR /f "tokens=1,2 delims=:" %%G IN ("%%A") DO set %%G=%%H
)
 
 
 
 
:CheckParams
:: 플랫폼이 유효한지 확인
IF NOT [%PlatformMode%]==[Win64] (
  IF not [%PlatformMode%]==[Win32] (
goto inputPlatform 
  )
)
 
 
:: 구성(Config)이 유효한지 확인
IF NOT [%ConfigMode%]==[Debug] ( 
  IF not [%ConfigMode%]==[Release] (
    goto inputConfigMode 
  )     
 
) 
 
IF NOT [%BuildMode%]==[Build] (
  IF not [%BuildMode%]==[Clean] (
IF not [%BuildMode%]==[Make] (
        goto inputBuildMode
)
  )
)
 
 
:: 여기까지 왔다면 - 모든 파라미터가 유효하다. 모두 건너뛰고 바로 컴파일을 시작한다.
goto DoCompile
 
 
:info
echo Params:
echo   BuildMode - Build, Clean, Make
echo   ConfigMode - Debug, Release
echo   PlatformMode - Win32, Win64
echo Example: 
echo   RunCompiler.bat PlatformMode:Win32 ConfigMode:Debug BuildMode:Build
goto end
 
 
:inputPlatform
echo Select Platform mode:
echo 1: Win32
echo 2: Win64
SET /P PlatformMode="PlatformMode [1|2|Win32|Win64]>"
if /i [%PlatformMode%]==[Win32] goto CheckParams
if /i [%PlatformMode%]==[Win64] goto CheckParams
if /i [%PlatformMode%]==[1] (
SET PlatformMode=Win32
goto CheckParams
)
if /i [%PlatformMode%]==[2] (
SET PlatformMode=Win64
goto CheckParams
)
GOTO inputPlatform
 
 
:inputConfigMode
echo Select ConfigMode mode:
echo 1: Debug
echo 2: Release
SET /P ConfigMode="ConfigMode [1|2|D|R]>"
if /i [%ConfigMode%]==[Debug] goto CheckParams
if /i [%ConfigMode%]==[Release] goto CheckParams
if /i [%ConfigMode%]==[1] (
SET ConfigMode=Debug
goto CheckParams
)
if /i [%ConfigMode%]==[2] (
SET ConfigMode=Release
goto CheckParams
)
if /i [%ConfigMode%]==[D] (
SET ConfigMode=Debug
goto CheckParams
)
if /i [%ConfigMode%]==[R] (
SET ConfigMode=Release
goto CheckParams
)
GOTO inputConfigMode
 
 
:inputBuildMode
echo Select BuildMode mode:
echo 1: Build
echo 2: Clean
echo 3: Make

if /i [%BuildMode%]==[Build] goto CheckParams
if /i [%BuildMode%]==[Clean] goto CheckParams
if /i [%BuildMode%]==[Make] goto CheckParams
if /i [%BuildMode%]==[1] (
SET BuildMode=Build
goto CheckParams
)
if /i [%BuildMode%]==[2] (
SET BuildMode=Clean
goto CheckParams
)
if /i [%BuildMode%]==[3] (
SET BuildMode=Make
goto CheckParams
)
if /i [%BuildMode%]==[B] (
SET BuildMode=Build
goto CheckParams
)
if /i [%BuildMode%]==[C] (
SET BuildMode=Clean
goto CheckParams
)
if /i [%BuildMode%]==[M] (
SET BuildMode=Make
goto CheckParams
)
 
 
:DoCompile
REM NOTE THAT DUE TO THE WAY THE BLOG WORKS YOU NEED TO
REM CHANGE THE SLASHES (AND REMOVE THESE TWO COMMENT LINES)
 
call "c:/Program Files (x86)/Embarcadero/Studio/22.0/bin/rsvars.bat"
 
 
echo Start %BuildMode% %PlatformMode% %ConfigMode% for "MainProject"
MSBuild ".MainProject.dproj" /t:%BuildMode% /p:Config=%ConfigMode% /p:platform=%PlatformMode%
 
if not [%ERRORLEVEL%]==[0] (
  goto fail    
) else (
  goto end
)
 
 
:fail
  echo Build Failed!!! Params: %BuildMode% %PlatformMode% %ConfigMode%
  pause
  exit /b
 
:end


입력 파라미터를 제공하지 않고 이 스크립트를 실행하는 경우에는, 스크립트 실행 중에 해당 파라미터의 값을 입력해야 한다. 스크립트가 저장된 파일 이름이 RunCompiler.bat이라고 가정했을 때, 해 보자. 입력 파라미터를 사용하여 스크립트를 실행하는 명령은 다음과 같은 방식이다.

RunCompiler.bat PlatformMode:Win64 ConfigMode:Debug BuildMode:Build

스크립트의 맨 마지막에서는  특수 변수 %ERRORLEVEL%가 분석된다. MSBuild를 실행하면, 이 변수에 컴파일 결과가 담기게 되어 있다. %ERRORLEVEL% 변수의 값이 0이 아니라면, 컴파일 중에 오류가 발생한 것이다. 컴파일이 성공하지 못하면 스크립트 실행이 일시 중지된다. 빠져 나오려면 아무 키나 눌러야 한다.

컴파일 절차에 대한 정보를 파일로 출력하려면, /l 파라미터를 사용하면 된다. 명령 예문은 다음과 같다.

MSBuild ".MainProject.dproj" /nologo /t:%BuildMode% /l:FileLogger,Microsoft.Build.Engine;logfile=MainProject_%PlatformMode%_%ConfigMode%.log;verbosity=quiet /p:Config=%ConfigMode% /p:platform=%PlatformMode%

이제, 우리는 범용 스크립트를 가지게 되었고, 이 스크립트는 쉽게 확장할 수 있다. 이 스크립트를 기반으로 해서, 여러분에게 필요한 다른 스크립트를 작성할 수 있다. 예를 들면, Git 저장소에 있는 모든 최신 업데이트를 사용할 수 있고, 사용되지 않는 바이너리 파일을 삭제할 수 있고, 새 파일들을 컴파일할 수 있다.
 

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.