CMake에서 CCache를 사용하는 방법?


90

다음을 수행하고 싶습니다. 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를 사용하여 테스트가 실패했다고 불평합니다.


4
gcc를 ccache에 심볼릭 링크하지 않는 이유는 무엇입니까? 그리고 이것을 배포한다면, 나는 그가 ccache를 설치하고 그것을 사용하기를 원했다면 사용자 자신이 심볼릭 링크를했을 것이라고 생각합니다.
int3

1
@ int3 예, 아마도 작동 할 것입니다 (ccache가 컴파일러를 선택적 인수로 가지고 있다는 것을 몰랐습니다). 그러나 더 명시적인 것이 더 깨끗할 것입니다.
amit

답변:


67

나는 개인적 /usr/lib/ccache으로 내 $PATH. 이 디렉토리에는 컴파일러가 호출 될 수있는 모든 이름 (예 : gccgcc-4.3)에 대한 심볼릭 링크로드가 포함되어 있으며 모두 ccache를 가리 킵니다.

그리고 심볼릭 링크도 만들지 않았습니다. 이 디렉토리는 Debian에 ccache를 설치할 때 미리 채워져 있습니다.


11
이 ccache 경로는 실제 컴파일러가 작동 하는 경로 앞에 배치 되어야 합니다 $PATH. 같은 것export PATH = /usr/lib/ccache:$PATH
Gui13

6
@ Gui13 : PATH를 업데이트하는 것보다 cmake에 gcc를 사용해야하는 위치를 명시 적으로 알려주는 것이 좋습니다. 예 : cmake -DCMAKE_CXX_COMPILER = / usr / lib / ccache / bin / g ++
cib

3
brew install ccache, 내가 가진 /usr/local/Cellar/ccache/3.2.1/libexec/.
cdunn2001

96

이제 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) # Less useful to do it for linking, see edit2
endif(CCACHE_FOUND)

특정 디렉터리 또는 대상에 대해서만 이러한 속성을 설정할 수도 있습니다.

Ninja의 경우 버전 3.4부터 가능합니다. XCode의 경우 Craig Scott은 답변에서 해결 방법을 제공합니다.

편집 : uprego와 Lekensteyn의 의견 덕분에 ccache를 실행기로 사용하기 전에 사용할 수 있는지 확인하고 어떤 생성기가 컴파일 실행기를 사용할 수 있는지 확인하기 위해 답변을 편집했습니다.

Edit2 : @Emilio Cobos는 ccache가 연결 속도를 향상시키지 않고 sccache와 같은 다른 유형의 캐시를 엉망으로 만들 수 있으므로 연결 부분에 대해 그렇게하지 않도록 권장했습니다.


많은 사이트에서에서와 같은 큰 따옴표를 사용하여 암시 적으로 조언 find_program(CCACHE_FOUND "ccache")을합니다. 어느 것이 더 이식성이 좋은지 모르겠습니다. 큰 따옴표 없이도 마일리지가 완벽하게 잘 작동했습니다.
1737973

5
이것은 현재 Makefile 생성기에서만 작동한다는 점에 주목할 가치가 있습니다 (cmake 3.3.2 기준). 의 매뉴얼 페이지를 참조하십시오 cmake-properties.
Lekensteyn

1
이것이 CTEST_USE_LAUNCHERS 설정과 충돌한다는 점은 주목할 가치가 있습니다. 이러한 속성도 여기에 설정됩니다. github.com/Kitware/CMake/blob/master/Modules/…
purpleKarrot

코드를 코드로 변경하고 싶을 수 있습니다 (제외, 내부에서 텍스트 제거endif() ) . 개선 사항은 다음과 같습니다. 1. 비활성화하는 구성 옵션이 있습니다. 2.이 방법을 사용하면 Make 백엔드의 GCC / Clang에서 색상이 사라집니다. ninja백엔드 추가하여 주위에 작동 -fdiagnostics-color이를 위해 이렇게하는 것이 좋습니다 그래서, 옵션을 make너무 백엔드.
Hi-Angel

94

CMAKE 3.4부터 다음을 수행 할 수 있습니다.

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache

1
그리고 -DCMAKE_CXX_COMPILER_LAUNCHER=ccache. 이것들은 아름답게 작동합니다! 왜 cmake가clang from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc이 아닌 from 에서 찾기 를 주장 하는지 모르겠지만 ( 심볼 링크 트릭이 작동하지 않음) $PATH어쨌든 귀하의 대답은 작동합니다.
cdunn2001

2
이것이 최선의 답이 될 것입니다. 더 이상 경로 변수와 컴파일러 심볼릭 링크를 망칠 필요가 없습니다!
일리아 b.

1
나는 이것을 시도했지만 "ccache : error : Recursive invocation (ccache 바이너리의 이름은"ccache "여야 함)"라는 오류를 표시합니다. 자세한 추적을 보면 "/ usr / local / bin / ccache ccache / usr / bin / c ++"를 실행하려고합니다 ...
Chris Dodd

3
RULE_LAUNCH_COMPILE과 어떻게 상호 작용합니까?
Trass3r

10

CMake 3.1에서는 Xcode 생성기와 함께 ccache를 사용할 수 있으며 Ninja는 CMake 3.4부터 지원됩니다. Ninja는 RULE_LAUNCH_COMPILEUnix 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.inlaunch-cxx.in동일한 디렉토리에 있어야 함 CMakeLists.txt).

launch-c.in :

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@"

launch-cxx.in :

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"

위는 RULE_LAUNCH_COMPILEUnix Makefiles 및 Ninja에만 사용 되지만 Xcode 생성기의 경우 CMake의 CMAKE_XCODE_ATTRIBUTE_...변수 지원 의 도움에 의존합니다 . 의 설정 CCCXX사용자 정의는 엑스 코드는 컴파일러 명령 및 제어하는 속성 LDLDPLUSPLUS, 지금까지 내가 말할 수있는, 엑스 코드 프로젝트의 문서화 기능이 있지만,이 작업에 보인다되지 링커 명령을. 누구든지 Apple에서 공식적으로 지원한다는 것을 확인할 수 있다면 링크 된 기사 와이 답변을 그에 따라 업데이트 할 것입니다.


나는 또한 set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")언급 된 기사에서 필요했습니다 .
요른 Reimerdes

알림을 보내 주셔서 감사합니다. LD 및 LDPLUSPLUS 설정을 포함하도록 답변을 업데이트했습니다.
Craig Scott

ccache는 VS 컴파일러를 지원하지 않으므로이를 위해 사용할 수 없습니다. VS에 동일한 기능을 제공하는 것을 목표로하는 clcache 라는 프로젝트가 있지만 그것이 얼마나 잘 작동하는지에 대해서는 언급 할 수 없습니다.
Craig Scott 19 년

9

심볼릭 링크를에서 g++로 설정하고 싶지 않았습니다 ccache. 그리고 CXX="ccache g++"일부 cmake 테스트 케이스가 속성없이 단지 컴파일러 프로그램을 가지고 원하는대로 나를 위해 작동하지 않았다.

그래서 대신 작은 bash 스크립트를 사용했습니다.

#!/bin/bash
ccache g++ "$@"

실행 파일로 /usr/bin/ccache-g++.

그런 다음 C /usr/bin/ccache-g++는 C ++ 컴파일러 로 사용하도록 cmake를 구성했습니다 . 이렇게하면 cmake 테스트 케이스를 통과하고 2 ~ 3 주 후에 잊어 버릴 수있는 심볼릭 링크를 갖는 것보다 더 편안하게 느끼고 무언가가 작동하지 않는지 궁금합니다.


5

제 생각에 가장 좋은 방법은 gcc, g ++를 ccache에 심볼릭 링크하는 것이지만 cmake 내에서 사용하려면 다음을 시도하십시오.

export CC="ccache gcc" CXX="ccache g++" cmake ...

5

다음 작업을 확인했습니다 (출처 : 이 링크 ).

        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가 불평합니다).


4

이전에 언급되지 않은 중요한 항목을 하나 추가하겠습니다.

ubunutu : 18.04 도커 이미지에서 최소한의 빌드 시스템을 부트 스트랩하는 동안 설치 순서가 차이가 있음을 발견했습니다.

제 경우에는 ccache가를 호출 할 때 잘 작동 gcc했지만 다른 이름으로 같은 컴파일러의 호출을 잡는 데 실패했습니다 : ccc++. 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 ++ 호출도 잡 힙니다!


감사합니다.에 대해 몰랐 습니다. 프로젝트 용 스크립트로 링크를 update-ccache-symlinks만들고 c++있었는데 다른 프로젝트에서는 작동하지 않았지만 (여전히 왜 링크가 괜찮 았는지 모르겠습니다) update-ccache-symlinks해결되었습니다.
Alex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.