2009-11-29 40 views
68

Tôi muốn làm như sau: Nếu CCache có trong PATH, hãy sử dụng "ccache g ++" để biên dịch, nếu không hãy sử dụng g ++. Tôi đã cố gắng viết một nhỏ my-cmake script chứaLàm thế nào để sử dụng CCache với CMake?

CC="ccache gcc" CXX="ccache g++" cmake $* 

nhưng nó dường như không làm việc (chạy chắc vẫn không sử dụng ccache; Tôi đã kiểm tra này bằng CMAKE_VERBOSE_MAKEFILE trên).

Cập nhật:

Theo this link Tôi đã cố gắng thay đổi kịch bản của tôi để

 cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $* 

nhưng cmake bails ra phàn nàn rằng một thử nghiệm thất bại về cách sử dụng ccache trình biên dịch (có thể được dự kiến).

+4

Tại sao bạn không gcc chỉ liên kết tượng trưng đến ccache? Và nếu bạn đang phân phối điều này, tôi nghĩ rằng chính người dùng sẽ thực hiện liên kết tượng trưng nếu anh ta đã cài đặt ccache và muốn nó được sử dụng .. – int3

+1

@ int3 Có lẽ điều đó sẽ hoạt động (tôi không biết rằng ccache có trình biên dịch như một đối số tùy chọn). Tuy nhiên nó sẽ sạch hơn để rõ ràng hơn. –

Trả lời

51

Cá nhân tôi có /usr/lib/ccache trong $PATH tôi. Thư mục này chứa nhiều liên kết tượng trưng cho mỗi tên có thể trình biên dịch có thể được gọi từ (như gccgcc-4.3), tất cả trỏ đến ccache.

Và tôi thậm chí không tạo liên kết tượng trưng. Thư mục đó được điền sẵn khi tôi cài đặt ccache trên Debian.

+0

wow, điều đó gần như hoàn hảo. –

+8

Lưu ý rằng đường dẫn ccache này phải được đặt * trước * đường dẫn nơi trình biên dịch thực của bạn nằm trong '$ PATH' để nó hoạt động. Một cái gì đó như 'xuất PATH =/usr/lib/ccache: $ PATH' – Gui13

+2

@ Gui13: Tốt hơn việc cập nhật PATH sẽ nói cho cmake rõ ràng nơi gcc nên sử dụng là, ví dụ: cmake -DCMAKE_CXX_COMPILER =/usr/lib/ccache/bin/g ++ – cib

6

tôi xác nhận các công việc sau (nguồn: this link):

 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" $* 

Cập nhật: Sau này tôi nhận ra rằng ngay cả điều này không hoạt động. Kỳ lạ nó hoạt động mỗi lần thay thế (những lần khác cmake than phiền).

3

Theo tôi cách tốt nhất là liên kết mềm gcc, g ++ để ccache, nhưng nếu bạn muốn sử dụng trong cmake, hãy thử này:

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

Tôi không muốn đặt liên kết tượng trưng từ g++ thành ccache. Và CXX="ccache g++" không hoạt động đối với tôi vì một số trường hợp thử nghiệm cmake chỉ muốn có chương trình trình biên dịch mà không có thuộc tính.

Vì vậy, tôi đã sử dụng một kịch bản bash nhỏ thay vì:

#!/bin/bash 
ccache g++ "[email protected]" 

và lưu nó như là một thực thi trong /usr/bin/ccache-g++.

Sau đó, C cấu hình cmake để sử dụng /usr/bin/ccache-g++ làm trình biên dịch C++. Bằng cách này nó vượt qua các trường hợp thử nghiệm cmake và tôi cảm thấy thoải mái hơn khi có các liên kết mà tôi có thể quên trong 2 hoặc 3 tuần và sau đó có thể tự hỏi nếu một cái gì đó không hoạt động ...

70

Bây giờ có thể chỉ định ccache như một trình khởi chạy cho các lệnh biên dịch và các lệnh liên kết (kể từ cmake 2.8.0). Điều đó làm việc cho Makefile và Ninja generator. Để thực hiện việc này, chỉ cần đặt các thuộc tính sau:

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) 

Cũng có thể đặt các thuộc tính này chỉ cho các thư mục hoặc mục tiêu cụ thể.

Đối với Ninja, điều này là có thể kể từ phiên bản 3.4. Đối với XCode, Craig Scott đưa ra giải pháp cho câu trả lời của anh.

Chỉnh sửa: Nhờ nhận xét của uprego và Lekensteyn, tôi đã chỉnh sửa câu trả lời để kiểm tra xem ccache có sẵn trước khi sử dụng nó làm trình khởi chạy và máy phát nào có thể sử dụng trình khởi chạy biên dịch hay không.

+0

Nhiều trang web ngầm khuyên bạn nên sử dụng các dấu ngoặc kép như 'find_program (CCACHE_FOUND 'ccache')', tôi không biết cái nào là xách tay hơn, số dặm của tôi đã hoàn toàn ổn mà không cần các dấu ngoặc kép. – uprego

+4

Cần lưu ý rằng điều này hiện chỉ hoạt động đối với các máy tạo Makefile (như của cmake 3.3.2). Xem trang hướng dẫn sử dụng của 'cmake-properties'. – Lekensteyn

7

Từ CMake 3.1, có thể sử dụng ccache với trình tạo Xcode và Ninja được hỗ trợ từ CMake 3.4 trở đi. Ninja sẽ tôn vinh RULE_LAUNCH_COMPILE giống như trình tạo Makefiles của Unix (vì vậy câu trả lời của Babcool cũng giúp bạn ở đó cho Ninja), nhưng việc nhận ccache làm việc cho trình tạo Xcode mất nhiều công việc hơn một chút. Bài viết sau đây giải thích chi tiết về phương pháp này, tập trung vào việc thực hiện chung cho cả ba máy tạo CMake và không đưa ra giả định về việc thiết lập các liên kết ccache hoặc trình biên dịch cơ bản (nó vẫn cho phép CMake quyết định trình biên dịch):

https://crascit.com/2016/04/09/using-ccache-with-cmake/

Ý chính chung của bài viết như sau. Sự bắt đầu của tập tin CMakeLists.txt của bạn nên được thiết lập một cái gì đó như thế này:

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() 

Các tập tin mẫu hai kịch bản launch-c.inlaunch-cxx.in cái nhìn như thế này (họ phải ở trong cùng thư mục với file CMakeLists.txt):

launch-c.in:

#!/bin/sh 
export CCACHE_CPP2=true 
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "[email protected]" 

launch-cxx.in:

#!/bin/sh 
export CCACHE_CPP2=true 
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "[email protected]" 

Trên đây sử dụng RULE_LAUNCH_COMPILE mình cho Unix Makefiles và Ninja, nhưng đối với các máy phát điện Xcode nó dựa trên sự giúp đỡ từ hỗ trợ CMAKE_XCODE_ATTRIBUTE_... biến CMake của. Thiết lập của các thuộc tính Xcode do người dùng định nghĩa CCCXX Xcode do người dùng định nghĩa để điều khiển lệnh biên dịch và LDLDPLUSPLUS cho lệnh trình liên kết không, như tôi có thể nói, tính năng tài liệu của các dự án Xcode, nhưng dường như nó hoạt động. Nếu bất cứ ai có thể xác nhận nó được Apple hỗ trợ chính thức, tôi sẽ cập nhật bài viết được liên kết và câu trả lời này cho phù hợp.

+0

Tôi cũng cần tập hợp «set (CMAKE_XCODE_ATTRIBUTE_LD" $ {CMAKE_C_COMPILER} ") (CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS" $ {CMAKE_CXX_COMPILER} ")' từ bài viết được đề cập. –

+0

Cảm ơn lời nhắc, tôi đã cập nhật câu trả lời để bao gồm cài đặt LD và LDPLUSPLUS. –

28

Tính đến cmake 3.4 bạn có thể làm:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache 
+0

Và '-DCMAKE_CXX_COMPILER_LAUNCHER = ccache'. Những công việc này thật đẹp! Tôi không biết tại sao ** cmake ** khăng khăng tìm kiếm 'clang' từ'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc' (vì vậy mẹo liên kết tượng trưng không hoạt động) , thay vì từ '$ PATH', nhưng câu trả lời của bạn vẫn hoạt động. – cdunn2001

Các vấn đề liên quan