CMake와 함께 CCache를 사용하는 방법은 무엇입니까?
문제
나는 다음을 수행하고 싶습니다 :CCache가 PATH에 있으면 컴파일에 "ccache g++"를 사용하고, 그렇지 않으면 g++를 사용하세요.나는 다음을 포함하는 작은 my-cmake 스크립트를 작성해 보았습니다.
CC="ccache gcc" CXX="ccache g++" cmake $*
하지만 작동하지 않는 것 같습니다(make를 실행해도 여전히 ccache를 사용하지 않습니다.CMAKE_VERBOSE_MAKEFILE을 사용하여 이를 확인했습니다.)
업데이트:
에 따라 이 링크 스크립트를 다음으로 변경해 보았습니다.
cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*
그러나 cmake는 컴파일러 ccache를 사용하여 테스트가 실패했다고 불평합니다(예상할 수 있음).
해결책
나는 개인적으로 /usr/lib/ccache
내 $PATH
.이 디렉토리에는 컴파일러가 호출될 수 있는 모든 가능한 이름에 대한 수많은 심볼릭 링크가 포함되어 있습니다(예: gcc
그리고 gcc-4.3
), 모두 ccache를 가리키고 있습니다.
그리고 저는 심볼릭 링크도 만들지 않았습니다.Debian에 ccache를 설치할 때 해당 디렉토리는 미리 채워져 있습니다.
다른 팁
이제 ccache를 컴파일 명령 및 링크 명령의 실행 프로그램으로 지정할 수 있습니다(cmake 2.8.0부터).이는 Makefile 및 Ninja 생성기에서 작동합니다.이렇게 하려면 다음 속성을 설정하면 됩니다.
find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)
특정 디렉터리나 대상에 대해서만 이러한 속성을 설정할 수도 있습니다.
Ninja의 경우 버전 3.4부터 가능합니다.XCode의 경우 Craig Scott은 답변에서 해결 방법을 제공합니다.
편집하다 :uprego와 Lekensteyn의 의견 덕분에 ccache를 런처로 사용하기 전에 사용할 수 있는지, 어떤 생성기에 대해 컴파일 런처를 사용할 수 있는지 확인하기 위해 답변을 편집했습니다.
CMAKE 3.4부터 다음을 수행할 수 있습니다.
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
나는 심볼릭 링크를 설정하고 싶지 않았습니다. g++
에게 ccache
.그리고 CXX="ccache g++"
일부 cmake 테스트 케이스에서는 속성 없이 컴파일러 프로그램만 갖고 싶어했기 때문에 작동하지 않았습니다.
그래서 대신 작은 bash 스크립트를 사용했습니다.
#!/bin/bash
ccache g++ "$@"
실행 파일로 저장했습니다. /usr/bin/ccache-g++
.
그런 다음 C는 cmake를 사용하도록 구성했습니다. /usr/bin/ccache-g++
C++ 컴파일러로.이렇게 하면 cmake 테스트 케이스를 통과하고 2~3주 후에 잊어버리고 뭔가 작동하지 않는지 궁금해할 수 있는 심볼릭 링크를 갖는 것보다 더 편안함을 느낍니다.
CMake 3.1부터 Xcode 생성기와 함께 ccache를 사용할 수 있으며 Ninja는 CMake 3.4부터 지원됩니다.닌자는 존경할 것이다 RULE_LAUNCH_COMPILE
Unix Makefiles 생성기와 비슷하지만(@Babcool의 답변은 Ninja에도 적용됩니다) Xcode 생성기에서 ccache를 작동시키려면 조금 더 많은 작업이 필요합니다.다음 문서에서는 세 가지 CMake 생성기 모두에서 작동하는 일반적인 구현에 초점을 맞추고 ccache 심볼릭 링크 또는 사용되는 기본 컴파일러 설정에 대해 가정하지 않고 방법을 자세히 설명합니다(여전히 CMake가 컴파일러를 결정하도록 함).
https://crascit.com/2016/04/09/using-ccache-with-cmake/
글의 전반적인 내용은 다음과 같습니다.당신의 시작 CMakeLists.txt
파일은 다음과 같이 설정되어야 합니다:
cmake_minimum_required(VERSION 2.8)
find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
# Support Unix Makefiles and Ninja
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
endif()
project(SomeProject)
get_property(RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
if(RULE_LAUNCH_COMPILE AND CMAKE_GENERATOR STREQUAL "Xcode")
# Set up wrapper scripts
configure_file(launch-c.in launch-c)
configure_file(launch-cxx.in launch-cxx)
execute_process(COMMAND chmod a+rx
"${CMAKE_BINARY_DIR}/launch-c"
"${CMAKE_BINARY_DIR}/launch-cxx")
# Set Xcode project attributes to route compilation through our scripts
set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_BINARY_DIR}/launch-c")
set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_BINARY_DIR}/launch-cxx")
set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_BINARY_DIR}/launch-c")
set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/launch-cxx")
endif()
두 개의 스크립트 템플릿 파일 launch-c.in
그리고 launch-cxx.in
다음과 같습니다(파일과 동일한 디렉토리에 있어야 합니다). CMakeLists.txt
파일):
발사-c.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@"
발사-cxx.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"
위의 용도는 RULE_LAUNCH_COMPILE
Unix Makefiles 및 Ninja의 경우 단독이지만 Xcode 생성기의 경우 CMake의 도움에 의존합니다. CMAKE_XCODE_ATTRIBUTE_...
변수 지원.설정 CC
그리고 CXX
컴파일러 명령을 제어하기 위한 사용자 정의 Xcode 속성 LD
그리고 LDPLUSPLUS
링커 명령은 내가 아는 한 Xcode 프로젝트의 문서화된 기능은 아니지만 작동하는 것 같습니다.Apple에서 공식적으로 지원하는지 확인할 수 있는 사람이 있으면 그에 따라 링크된 기사와 이 답변을 업데이트하겠습니다.
다음 작품을 확인했습니다(출처: 이 링크):
CC="gcc" CXX="g++" cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*
업데이트:나는 나중에 이것조차도 효과가 없다는 것을 깨달았습니다.이상하게도 매 번 작동합니다(다른 경우에는 cmake가 불평합니다).
내 생각에 가장 좋은 방법은 gcc,g++를 ccache에 심볼릭 링크하는 것이지만, cmake 내에서 사용하려면 다음을 시도해 보십시오.
export CC="ccache gcc" CXX="ccache g++" cmake ...
여기에 이전에 언급되지 않은 중요한 항목을 하나 추가하겠습니다.
ubunutu:18.04 docker 이미지에서 최소한의 빌드 시스템을 부트스트래핑하는 동안 설치 순서에 차이가 있다는 것을 발견했습니다.
내 경우에는 전화할 때 ccache가 제대로 작동했습니다. gcc
, 그러나 다른 이름으로 동일한 컴파일러의 호출을 포착하지 못했습니다. cc
그리고 c++
.ccache를 완전히 설치하려면 먼저 모든 컴파일러가 설치되어 있는지 확인해야 합니다. 또는 안전을 위해 update-ccache 심볼릭 링크에 대한 호출을 추가하세요.
sudo apt-get install ccache build-essential # and everyhting ...
sudo /usr/sbin/update-ccache-symlinks
export PATH="/usr/lib/ccache/:$PATH"
...그런 다음 (업데이트된 심볼릭 링크로 인해) cc 및 C++에 대한 호출도 잡힙니다!