Không ghi đè CMAKE_C_COMPILER
, nhưng xuất CC
(và CXX
) trước khi gọi cmake:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
Việc xuất chỉ cần được thực hiện một lần, lần đầu tiên bạn định cấu hình dự án, sau đó các giá trị đó sẽ được đọc từ bộ đệm CMake.
CẬP NHẬT : giải thích dài hơn về lý do tại sao không ghi đè CMAKE_C(XX)_COMPILER
sau bình luận của Jake
Tôi khuyên bạn không nên ghi đè CMAKE_C(XX)_COMPILER
giá trị vì hai lý do chính: vì nó sẽ không hoạt động tốt với bộ nhớ cache của CMake và vì nó phá vỡ kiểm tra trình biên dịch và phát hiện công cụ.
Khi sử dụng set
lệnh, bạn có ba tùy chọn:
- không có bộ nhớ cache, để tạo một biến bình thường
- với bộ nhớ cache, để tạo một biến được lưu trong bộ nhớ cache
- buộc bộ nhớ cache, để luôn buộc giá trị bộ nhớ cache khi định cấu hình
Hãy xem điều gì xảy ra cho ba cuộc gọi có thể có set
:
Không có bộ nhớ cache
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
Khi thực hiện việc này, bạn tạo một biến "bình thường" CMAKE_C(XX)_COMPILER
để ẩn biến bộ nhớ cache cùng tên. Điều đó có nghĩa là trình biên dịch của bạn hiện đã được mã hóa cứng trong tập lệnh xây dựng của bạn và bạn không thể cung cấp cho nó một giá trị tùy chỉnh. Đây sẽ là một vấn đề nếu bạn có nhiều môi trường xây dựng với các trình biên dịch khác nhau. Bạn chỉ có thể cập nhật tập lệnh của mình mỗi khi bạn muốn sử dụng một trình biên dịch khác, nhưng điều đó sẽ loại bỏ giá trị của việc sử dụng CMake ngay từ đầu.
Được rồi, hãy cập nhật bộ nhớ cache ...
Với bộ nhớ cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
Phiên bản này sẽ chỉ "không hoạt động". Các CMAKE_C(XX)_COMPILER
biến là đã có trong bộ nhớ cache, vì vậy nó sẽ không được cập nhật, trừ khi bạn buộc nó.
Ah ... chúng ta hãy sử dụng vũ lực, sau đó ...
Buộc bộ nhớ cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
Điều này gần giống với phiên bản biến "bình thường", sự khác biệt duy nhất là giá trị của bạn sẽ được đặt trong bộ nhớ cache, vì vậy người dùng có thể nhìn thấy nó. Nhưng mọi thay đổi sẽ bị ghi đè bởi set
lệnh.
Phá vỡ kiểm tra trình biên dịch và công cụ
Đầu quá trình cấu hình, CMake thực hiện kiểm tra trình biên dịch: Nó có hoạt động không? Nó có thể tạo ra các tệp thực thi không? vv Nó cũng sử dụng trình biên dịch để phát hiện các công cụ liên quan, như ar
và ranlib
. Khi bạn ghi đè giá trị trình biên dịch trong một tập lệnh, thì đã "quá muộn", tất cả các kiểm tra và phát hiện đã được thực hiện.
Ví dụ: trên máy của tôi với gcc làm trình biên dịch mặc định, khi sử dụng set
lệnh to /usr/bin/clang
, ar
được đặt thành /usr/bin/gcc-ar-7
. Khi sử dụng xuất trước khi chạy CMake, nó được đặt thành /usr/lib/llvm-3.8/bin/llvm-ar
.
/opt
hơn là/usr/local
. Tốt hơn/opt/gcc-x.y.z
. Bằng cách này, nếu bạn cần một phiên bản mới hơn, bạn sẽ không gặp bất kỳ khó khăn nào khi gỡ cài đặt phiên bản trước đó.