ความแตกต่างระหว่าง CMAKE_CURRENT_SOURCE_DIR และ CMAKE_CURRENT_LIST_DIR


105

จาก Wiki:

CMAKE_CURRENT_SOURCE_DIR นี่คือไดเร็กทอรีที่มีการประมวลผล CMakeLists.txt ในปัจจุบัน

CMAKE_CURRENT_LIST_DIR (ตั้งแต่ 2.8.3) นี่คือไดเร็กทอรีของ listfile ที่กำลังดำเนินการอยู่

จากเอกสาร:

CMAKE_CURRENT_SOURCE_DIR:พา ธ ไปยังไดเร็กทอรีต้นทางที่กำลังประมวลผล นี่คือเส้นทางแบบเต็มไปยังไดเร็กทอรีต้นทางที่กำลังประมวลผลโดย cmake

CMAKE_CURRENT_LIST_DIR:ไดเร็กทอรีแบบเต็มของ listfile ที่กำลังดำเนินการ เมื่อ CMake ดำเนินการกับ listfiles ในโปรเจ็กต์ของคุณตัวแปรนี้จะถูกตั้งค่าเป็นไดเร็กทอรีที่มี listfile ที่กำลังประมวลผลอยู่ (CMAKE_CURRENT_LIST_FILE) อยู่เสมอ ค่ามีขอบเขตแบบไดนามิก เมื่อ CMake เริ่มประมวลผลคำสั่งในไฟล์ต้นฉบับมันจะตั้งค่าตัวแปรนี้เป็นไดเร็กทอรีที่ไฟล์นี้อยู่ เมื่อ CMake เสร็จสิ้นการประมวลผลคำสั่งจากไฟล์ระบบจะคืนค่าก่อนหน้านี้ ดังนั้นค่าของตัวแปรภายในแมโครหรือฟังก์ชันจึงเป็นไดเร็กทอรีของไฟล์ที่เรียกใช้รายการด้านล่างสุดบน call stack ไม่ใช่ไดเร็กทอรีของไฟล์ที่มีมาโครหรือนิยามฟังก์ชัน

ตัวแปรเหล่านี้จะมีค่าต่างกันภายใต้สถานการณ์ใด


10
และยังแตกต่างจากความเรียบง่ายและดี./อย่างไร?
kyb

คำตอบ:


139

ตัวแปรCMAKE_CURRENT_SOURCE_DIRและCMAKE_CURRENT_LIST_DIRอาจอ้างถึงไดเร็กทอรีที่แตกต่างกันสำหรับไฟล์รายการ CMake ที่รวมอยู่ในไฟล์อื่นด้วยคำสั่งinclude เช่นหากมีCMakeLists.txtอยู่ในไดเร็กทอรีprojectและมีคำสั่งต่อไปนี้

include(src/CMakeLists.txt)

แล้วขณะที่src/CMakeLists.txtกำลังดำเนินการCMAKE_CURRENT_LIST_DIRจะอ้างถึงproject/srcในขณะที่ยังคงชี้ไปที่ไดเรกทอรีนอกCMAKE_CURRENT_SOURCE_DIRproject

CMAKE_CURRENT_LIST_DIRมีประโยชน์เมื่อคุณต้องการค้นหาไฟล์ทรัพยากรเช่นไฟล์เทมเพลตหรือสคริปต์ชุดงานที่อยู่ถัดจากCMakeLists.txtไฟล์ที่กำลังดำเนินการอยู่


หมายเหตุ: เมื่อใช้add_subdirectory()คำสั่งมากกว่าinclude()พฤติกรรมที่แตกต่างกันและเมื่อจะถูกประมวลผลตัวแปรทั้งสองจะชี้ไปที่src/CMakeLists.txtproject/src


42
+1. ฉันเพิ่งจะเพิ่มที่CMAKE_CURRENT_LIST_DIRเปลี่ยนแปลงกับแฟ้มทุกครั้งที่คุณinclude(); CMakeLists.txtมันไม่ได้มีที่จะเรียกว่า
Angew ไม่ภูมิใจใน

2
การสนทนาที่ดีที่นี่เกี่ยวกับวิธีการใช้งานอย่างมีประสิทธิภาพCMAKE_CURRENT_LIST_DIRและinclude(...)ในโครงการของคุณ
jmcarter9t

1
สับสนได้ง่ายเนื่องจากCMAKE_CURRENT_SOURCE_DIRมีความคล้ายคลึงกับCMAKE_SOURCE_DIRเอกสารมากกว่า
Malachi

และด้วยadd_subdirectory()? ตัวแปรทั้งสองจะชี้ไปที่โฟลเดอร์หรือไม่
einpoklum

@einpoklum ใช่ทั้งคู่ชี้ไปที่โฟลเดอร์
rjhcnf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.