https://en.wikipedia.org/wiki/Unity_build

 

Unity build - Wikipedia

In software engineering, a unity build (also known as unified build or jumbo build) is a method used in C and C++ software development to speed up the compilation of projects by combining multiple translation units into a single one, usually achieved by us

en.wikipedia.org

Unity 빌드(Jumbo 빌드) 는 컴파일 시간 최적화 방법 중 하나다. 개별 cpp 파일을 묶어서 컴파일해서 중복해서 처리되는 비용을 줄이는 방법이다.

예전에는 컴파일 전에 수동으로 Unity 빌드 파일을 만들어 주는 스크립트를 돌렸는데 Visual Studio 는 옵션으로 제공하고 있다. 프로젝트 속성 > 구성 속성 > 고급 > Unity(JUMBO) 빌드 사용을 설정해주면 된다.

https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html

 

UNITY_BUILD — CMake 3.23.1 Documentation

UNITY_BUILD When this property is set to true, the target source files will be combined into batches for faster compilation. This is done by creating a (set of) unity sources which #include the original sources, then compiling these unity sources instead o

cmake.org

사용해본 적은 없지만 cmake 에서도 UNITY_BUILD 옵션이 있다.

fatal error C1128: 섹션 수가 개체 파일 형식 한도를 초과했습니다. /bigobj를 사용하여 컴파일하십시오.

여러 파일을 묶어서 빌드하다 보면 C1128 오류가 발생할 수 있다. 구성 속성 > C/C++ > 명령줄에 /bigobj 를 추가하자.

메모리 관련 문제가 발생할 수도 있는데 구성 속성 > 고급 > 기본 설정 빌드 도구 아키텍처를 64비트(x64) 로 바꿔보자.

Unity 빌드를 설정하고 빌드할 경우 예상치 못한 컴파일 오류를 발견할 수 있다. pragma once 누락된 경우는 추가하면 되고 struct 를 class 로 전방 선언을 잘못한 경우는 맞춰주면 된다.

수정하기 힘들 경우 개별 파일을 Unity Build 에서 제외하자. 개별 파일 속성에서 C/C++ > Unity 빌드 > Unity 파일에 포함을 통해 제외 설정을 할 수 있다.

예를 들어 다음과 같은 경우 컴파일 오류가 있을 수 있다.
- 미리 컴파일된 헤더를 사용하는 파일과 사용하지 않는 파일이 같이 묶인 경우
- include 된 파일에 namespace 나 struct/class 이름, OPTION, DEBUG, CONFIG 와 같은 define 과 enum 들이 재정의 된 경우
- file scope static 변수가 겹치는 경우

Unity 빌드를 적용하면 파일이 많은 프로젝트 같은 경우 25% ~ 50% 정도 빌드 시간이 줄어드는 것 같다.

Unity 빌드를 적용하면 Include 누락을 조심해야 한다. 다른 파일에 include 되어 자신의 개발 환경이나 커밋한 시점에는 빌드에 문제가 없을 수 있지만 다른 사람이 커밋할 경우 Unity 빌드 파일 구성이 변경되어 include 오류가 발생할 수 있다. Unity 빌드를 사용하지 않는 다른 빌드 환경에서는 바로 문제가 발생한다. ReSharper 와 같은 툴의 도움을 받을 수도 있지만 작업 파일을 수시로 개별 컴파일(Ctrl+F7) 해서 실수를 줄일 수 있다.

참고로 Unreal Build Tool 의 경우 Adaptive Unity Build 라고 자체적으로 만든 기능이 있다. git 이나 perforce 으로 수정 중인 파일(checkout) 은 Unity Build 에서 빼서 컴파일 해준다. 수정 중인 파일을 unity 에서 분리해서 컴파일 시간을 줄여주는 효과만 생각했었는데 이런 include 오류를 잡아주는 효과도 큰 것 같다.

P.S. (2022-04-30) #pragma warning(disable:nnnn) 같은 선언이 다른 파일에 영향을 줄 수 있으니 #pragma warning(push) - #pragma warning(pop) 으로 잘 묶어서 사용하자.

728x90

+ Recent posts