อย่าเขียนทับCMAKE_C_COMPILER
แต่ส่งออกCC
(และCXX
) ก่อนเรียก cmake:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
การส่งออกจะต้องทำเพียงครั้งเดียวในครั้งแรกที่คุณกำหนดค่าโครงการจากนั้นค่าเหล่านั้นจะถูกอ่านจากแคช CMake
UPDATE : คำอธิบายอีกต่อไปว่าทำไมไม่ลบล้างCMAKE_C(XX)_COMPILER
ความคิดเห็นของ Jake
ฉันขอแนะนำไม่ให้ลบล้างCMAKE_C(XX)_COMPILER
ค่าด้วยเหตุผลหลักสองประการ: เนื่องจากมันเล่นได้ไม่ดีกับแคชของ CMake และเนื่องจากมันทำให้การตรวจสอบคอมไพเลอร์และการตรวจจับเครื่องมือเสียหาย
เมื่อใช้set
คำสั่งคุณมีสามตัวเลือก:
- ไม่มีแคชเพื่อสร้างตัวแปรปกติ
- ด้วยแคชเพื่อสร้างตัวแปรแคช
- บังคับแคชเพื่อบังคับค่าแคชเสมอเมื่อกำหนดค่า
มาดูกันว่าจะเกิดอะไรขึ้นสำหรับการเรียกที่เป็นไปได้ทั้งสามแบบset
:
ไม่มีแคช
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
เมื่อทำเช่นนี้คุณจะสร้างตัวแปร "ปกติ" CMAKE_C(XX)_COMPILER
ที่ซ่อนตัวแปรแคชที่มีชื่อเดียวกัน นั่นหมายความว่าคอมไพลเลอร์ของคุณได้รับการฮาร์ดโค้ดในสคริปต์บิลด์ของคุณแล้วและคุณไม่สามารถกำหนดค่าที่กำหนดเองได้ สิ่งนี้จะเป็นปัญหาหากคุณมีสภาพแวดล้อมการสร้างหลายตัวพร้อมกับคอมไพเลอร์ที่แตกต่างกัน คุณสามารถอัปเดตสคริปต์ของคุณทุกครั้งที่คุณต้องการใช้คอมไพเลอร์อื่น แต่นั่นจะลบคุณค่าของการใช้ CMake ตั้งแต่แรก
เอาล่ะมาอัพเดทแคชกัน ...
ด้วยแคช
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
เวอร์ชันนี้จะ "ไม่ทำงาน" CMAKE_C(XX)_COMPILER
ตัวแปรที่มีอยู่แล้วในแคชจึงจะได้รับการปรับปรุงจนกว่าคุณจะบังคับให้มัน
อ่า ... มาใช้แรงกันเถอะ ...
บังคับให้แคช
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
ซึ่งเกือบจะเหมือนกับเวอร์ชันตัวแปร "ปกติ" ข้อแตกต่างเพียงอย่างเดียวคือค่าของคุณจะถูกตั้งค่าในแคชเพื่อให้ผู้ใช้สามารถมองเห็นได้ แต่การเปลี่ยนแปลงใด ๆ จะถูกเขียนทับโดยset
คำสั่ง
การตรวจสอบคอมไพเลอร์และการใช้เครื่องมือ
ในช่วงต้นของกระบวนการกำหนดค่า CMake จะทำการตรวจสอบคอมไพเลอร์: มันทำงานหรือไม่? มันสามารถสร้างไฟล์ปฏิบัติการได้หรือไม่? ฯลฯ นอกจากนี้ยังใช้คอมไพเลอร์ในการตรวจสอบเครื่องมือที่เกี่ยวข้องเช่นและar
ranlib
เมื่อคุณแทนที่ค่าคอมไพลเลอร์ในสคริปต์แสดงว่า "สายเกินไป" การตรวจสอบและการตรวจจับทั้งหมดเสร็จสิ้นแล้ว
ยกตัวอย่างเช่นในเครื่องของฉันกับ GCC เป็นคอมไพเลอร์เริ่มต้นเมื่อใช้set
คำสั่ง/usr/bin/clang
, มีการตั้งค่าar
/usr/bin/gcc-ar-7
เมื่อใช้การส่งออกก่อนที่จะเรียกใช้ CMake จะถูกตั้งค่าเป็น/usr/lib/llvm-3.8/bin/llvm-ar
.
/opt
โดยเฉพาะอย่างยิ่ง/usr/local
/opt/gcc-x.y.z
ด้วยวิธีนี้หากคุณต้องการเวอร์ชันที่ใหม่กว่าคุณจะไม่มีปัญหาในการถอนการติดตั้งเวอร์ชันก่อนหน้า