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

  • Post author:
  • Post category:
  • Post comments:0 Comments
  • Post last modified:February 8, 2020

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

외부 자료

글쓴이
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
트위터
  • Oct 28, 2021
    RT @SeongPeter: 오 세상에,, 대대로 복받으시길,,, 82만원 ‘먹는 코로나약’ 로열티 없이 특허 풀려..화이자·모더나와 달라 https://t.co/7ePHhumf4K
  • Oct 28, 2021
    버튼 한번 눌렀을 뿐인데… 데일리호텔 때 문자발송시스템 개편하고 수백개의 문자를 받고 고객센터로 연락주신 고객님 생각나네. 너무 미안해서 바로 조치하고 비슷한 일이 벌어지지 않게 뿌리를 뽑았지. 그때… https://t.co/x8W1B3Vfkn
  • Oct 27, 2021
    “결론은 한국의 성별 소득 격차의 상당 부분이 통계적 차별이 아니라 여성 혐오에 기인한 선호기반 차별이다. 그러니 통계적 차별 논리로 선호기반차별을 정당화하는 주장은 이제 그만 두기를.” 실로 그러하다 https://t.co/7xbhnvIM68

Leave a Reply