Our software platform is very large and takes 3 hours to compile with i5 machine. so it is a crucial for productivity to reduce compile time.
그래서 어떻게 빌드 타임을 줄일 수 있을까 구글링을 하던 중에 재미난 것을 발견했다. 이름하여 Unity Build.
So i googled about it and found interesting article about Unity Build.
컨셉은 unity build를 위한 대표 cpp파일을 하나 만들고 그 파일에서 모든 소스 파일을 #include 하는 것. 즉 컴파일 해야하는 #cpp 파일을 줄이는 것이다. 이로서 매 cpp 마다 수행하던 preprocessing 을 줄고, 결과적으로 파일 IO가 줄어들게 되고, 이 때문에 빌드시간을 줄일 수 있다는 것.
The logic is very simple. Unity build is all about making unity.cpp including all source files with '#include' macro. Less #cpp means less file IO. that's the point.
장점:
- 빌드시간 많이 2-3배 단축 가능
- CMake를 사용한다면 function 하나로 바로 unity build로 바꿀 수 있다.
Pros:
- overall build speed is 2-3 times faster
- If you use cmake, applying Unity build is very ease. a function will automate all process.
단점:
- incremental build에 취약.. cpp 파일이 하나만 바뀌어도 전체 필드를 해야 하니까.
- 기존 소스를 그대로 사용할 수 없음. MM이 더 들어감.
- 같은 로컬 변수를 사용할 때 심볼 충돌로 컴파일 에러.
- include hierarchy가 꼬여서 빌드 에러
- ...
Cons:
- bad for incremental build. if a cpp file changes all cpp files in unity.cpp will be rebuilt.
- usually you can't use as-is cpp. need more work!
- compile error for same local variable in different cpp
- compile error due to include hierarchy conflict
- ...
우리 프로젝에 당장 적용할 수는 없지만, 흥미로운 시도임에는 틀림없다. 이 idea 기반으로 preprocessing과정 cache를 잘하면 빌드를 엄청 빨리 할 수 있다는 것이된다. next-gen 컴파일러는 아마 이런것을 지원 하겠지?
I can't use this in current project but this approach is very interesting and deserves mention. it means If we can cache the preprcessing process, we can do much better ? will next gen compiler implement this ?