C++ 프로젝트의 빌드 속도 개선하기 – UnityBuild편

UnityBuild는 C++ 에 적용 가능한 컴파일 기법이다. 일부 상황에서, 특히 대규모 프로젝트에서 컴파일 시간을 놀랄 만큼 줄여준다고 한다. 이 기법을 Xoreax Incredibuild와 같은 분산 빌드 도구와 함께 사용하면 극적으로 성능 향상이 될 가능성이 있다.

Earlgrey.UnityBuild 는 일반적인 Visual C++ 프로젝트를 UnityBuild 용으로 변환하는 편리한 도구이다. 단순하며 사용하기 쉽다.

환경

  • .NET Framework SDK 4.0 이상
  • Visual Studio 2008

Visual Studio 2010/2011 는 가까운 미래에 지원할 예정이다.

설치하기

  1. Earlgrey 프로젝트에서 Earlgrey.BuildTools 의 최신 버전을 다운로드 받는다.
  2. 압축을 해제하면 다음과 같은 폴더 구조가 보인다.
    • MSBuildExtension
    • UnityBuild
    • UserGuide
  3. UnityBuild 폴더 안에 있는 바이너리만 있으면 된다.
  4. 영문 설명서는 UserGuideHelp 폴더 안에 있다.

사용법

UnityBuild.ConsoleUi.exe를 실행하면 다음과 같이 사용법을 보여준다.

C:WorkspacetrunksrcBuildToolsAny CPU-Debugbin>UnityBuild.ConsoleUi.exe

How to use!
 -i, --input (Required)
   Solution file path.
 -e, --exclude (Not Required)
   Visual C++ project names you want to exclude. Separated by a ';'. For instance, -e"Earlgrey";"Earlgrey.Test"
 -c, --copy (Not Required)
   Copy the solution/projects and use them.
 -o, --optimization (Not Required)
   Possible values are 'Normal' and 'Best'.
 -v, --verbose (Not Required)
   Print details during execution.

C:>

 

명령 줄 스위치

스위치필수 여부예제설명
-i필수

-i"C:Earlgrey.sln"

변환할 원본 솔루션 파일의 경로.
-c필수 아님

-c

원본 솔루션과 프로젝트 파일의 복사본을 만든 후, 복사본을 변환한다.
-e필수 아님

-e"gtest;Earlgrey.Tests"

변환하지 않을 프로젝트의 목록을 지정한다. 프로젝트 이름은 ‘;’로 구분 짓는다.
-o필수 아님

-o"Normal"

최적화 수준

  • Normal
  • Best

 

솔루션을 빌드하는 법

솔루션과 솔루션에 포함된 프로젝트 파일을 백업하기

명령 줄 스위치 –c 를 선택하지 않으면 UnityBuild.ConsoleUi.exe 가 솔루션 파일(.sln)을 수정하므로 일이 잘못됐을 때를 대비해 백업 계획을 수립하기를 권한다.

UnityBuild.ConsolUi.exe 에 –c 스위치 넣는 편이 좋다. 이 스위치를 지정하면 솔루션과 솔루션에 포함된 프로젝트 파일의 복사본을 만들고, 원본은 그대로 둔 채 그 복사본을 UnityBuild 용으로 변환한다.

솔루션과 그 프로젝트 파일을 변환하기

-i 스위치는 가장 중요한 옵션이다. 이 스위치는 변환할 대상 솔루션 파일의 경로를 지정하는데 사용한다.

C:WorkspacetrunksrcBuildToolsAny CPU-Debugbin>UnityBuild.ConsoleUi.exe -i "......Earlgrey.sln"

working ...
done!

C:>

 

-i 스위치를 지정하고 UnityBuild.ConsoleUi.exe 를 실행하면 일부 파일이 바뀌었다는 사실을 알게 된다. 예를 들어, TortoiseSVN 이 설치된 윈도우에서 Trunk 폴더의 로컬 복사본이 다음 그림처럼 된다.

image

붉은색 오버레이 아이콘은 UnityBuild.ConsoleUi.exe 가 일부 파일을, 실제로는 일부 .vcproj 파일을 바꾸었음을 나타낸다. 이 그림에 등장하는 Earlgrey.sln (–i 스위치에 지정한 대상 솔루션) 에는 .vcproj 와 더불어 .csproj 도 포함된다. 하지만 걱정할 필요 없다. UnityBuild.ConsoleUi.exe 는 이와 같은 복합 솔루션도 제대로 처리한다. .vcproj 만이 변환 과정에 영향을 받는다.

-e 스위치를 사용하면 일부 .vcproj 를 변환대상에서 뺄 수 있다. Earlgrey.sln 에는 외부 오픈 소스 프로젝트가 포함된다. 예를 들어, gtest (Google Test) 와 StackWalker_VC9 (StackWalker ) 가 그러한 프로젝트이다. 보통 외부 라이브러리는 손대지 않는 편이 좋은데 이런 상황에서 –e 스위치가 유용하다.

C:WorkspacetrunksrcBuildToolsAny CPU-Debugbin>UnityBuild.ConsoleUi.exe -i "......Earlgrey.sln" -e "gtest;StackWalker_VC9"

working ...
done!

C:>

 

위와 같이 명령을 실행하면 gtest 와 StackWalker_VC 를 변환 대상에서 제외한다. UnityBuild.ConsoleUi.exe 를 실행한 후 로컬 복사본 폴더 ‘vendor’와 ‘src’를 보면, ‘vendor’ 프로젝트 안에 있는 두 프로젝트가 변하지 않은 채 그대로 있음을 볼 수 있다 (다음 스크린샷을 보자).

image

-c 스위치가 하는 일은 간단하다. 이 스위치를 지정하면 UnityBuild.ConsoleUi.exe 가 Earlgrey.sln 과 그 안에 포함된 프로젝트 파일 복사하여 새로운 솔루션 파일을 만든다. 원본 파일을 그대로 두고 싶을 때 매우 유용하다.

-o 스위치는 최적화 수준을 결정한다. 알고리즘은 언제 어떻게 변경될지 모르므로 세부사항을 알려주지 않는다.

 

따라하기

예제를 다운로드 받기

SMTP Client with SSL/TLS을 이 튜토리얼에서 사용한다. 소스 파일을 다운로드 받고 압축을 푼다. 그러고 나서 Visual Studio 2008 용으로 솔루션 파일을 변환한다.

이렇게 변환한 예제 다운로드 받기

이 예제 소스코드에는 Debug 와 Release 구성이 있다.

CSmpt-Configurations

UnityBuild.ConsoleUi.exe 를 실행하기

UnityBuild.ConsoleUi.exe 를 실행하여 원본 솔루션을 UnityBuild 용으로 변환한다.

f:DownloadsSample>UnityBuildUnityBuild.ConsoleUi.exe -i CSmtp_v2_0_sslCSmtp.
sln -c -v
[Switches]
 * Input file path is "CSmtp_v2_0_sslCSmtp.sln", its copied version will be con
verted and used
.
 * Verbose mode is turned on.
 * Current optimization level is 'Normal'.

working ...
converted!

f:DownloadsSample

 

-c 스위치를 지정하였기에 새 솔루션 파일 “f:DownloadsSampleCSmtp_v2_0_sslCSmtp-UnityBuild.sln”이 생성된다.

NewSolutionFileForUnityBuild

새 솔루션 파일을 살펴보기

UnityBuild 라 이름 붙은 필터(들)가 보인다. UnityBuild 를 할 때 쓰는 새 소스 파일은 모두 필터에 들어간다. DEBUG/RELEASE 구성일 때는 이 필터에 포함된 소스 파일은 빌드에서 제외된다 (붉은색 오버레이 아이콘).

NewSolutionWithDebug

UnityBuild 용으로 새로운 구성 값이 생성됐다.

  • Debug-UnityBuild
  • Release-UnityBuild

위의 구성 중 하나를 고르면 UnityBulid 필터에 든 소스 파일이 활성화되고 UnityBuild를 할 수 있다.

NewSolutionWithDebugUnityBuild

빌드하기!

변환된 솔루션을 빌드하자! 그러면 원하던 바를 얻게 될 것이다!

UnityBuild

 

외부 자료

최 재훈

블로그, 페이스북, 트위터 고성능 서버 엔진, 데이터베이스, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu