Perbedaan antara CMAKE_CURRENT_SOURCE_DIR dan CMAKE_CURRENT_LIST_DIR

105

Dari Wiki:

CMAKE_CURRENT_SOURCE_DIR ini adalah direktori tempat CMakeLists.txt yang sedang diproses berada di

CMAKE_CURRENT_LIST_DIR (sejak 2.8.3) ini adalah direktori dari listfile yang sedang diproses.

Dari Dokumen:

CMAKE_CURRENT_SOURCE_DIR: Jalur ke direktori sumber sedang diproses. Ini jalur lengkap ke direktori sumber yang saat ini sedang diproses oleh cmake.

CMAKE_CURRENT_LIST_DIR: Direktori lengkap listfile yang sedang diproses. Saat CMake memproses file daftar dalam proyek Anda, variabel ini akan selalu disetel ke direktori tempat listfile yang saat ini sedang diproses (CMAKE_CURRENT_LIST_FILE) berada. Nilainya memiliki ruang lingkup dinamis. Ketika CMake mulai memproses perintah dalam file sumber, CMake menetapkan variabel ini ke direktori tempat file ini berada. Ketika CMake selesai memproses perintah dari file itu mengembalikan nilai sebelumnya. Oleh karena itu, nilai variabel di dalam makro atau fungsi adalah direktori file yang memanggil entri paling bawah pada tumpukan panggilan, bukan direktori file yang berisi definisi makro atau fungsi.

Dalam keadaan apa variabel ini memiliki nilai yang berbeda?

William Payne
sumber
10
Dan juga bagaimana mereka berbeda dari yang sederhana dan bagus ./?
kyb

Jawaban:

139

Variabel CMAKE_CURRENT_SOURCE_DIRdan CMAKE_CURRENT_LIST_DIRmungkin merujuk ke direktori yang berbeda untuk file daftar CMake yang disertakan oleh file lain dengan perintah include . Misalnya, jika a CMakeLists.txtada dalam direktori projectdan berisi petunjuk berikut

include(src/CMakeLists.txt)

maka saat src/CMakeLists.txtsedang diproses CMAKE_CURRENT_LIST_DIRakan merujuk ke project/srcsedangkan CMAKE_CURRENT_SOURCE_DIRmasih menunjuk ke direktori terluar project.

CMAKE_CURRENT_LIST_DIRberguna saat Anda perlu mencari file sumber daya seperti file template atau skrip batch yang terletak di sebelah CMakeLists.txtfile yang sedang diproses.


Catatan: Saat menggunakan add_subdirectory()perintah daripada include(), perilakunya berbeda, dan saat src/CMakeLists.txtdiproses, kedua variabel akan mengarah ke project/src.

sakra
sumber
42
+1. Saya hanya akan menambahkan CMAKE_CURRENT_LIST_DIRperubahan itu dengan setiap file Anda include(); itu tidak harus dipanggil CMakeLists.txt.
Angew tidak lagi bangga dengan SO
2
Diskusi yang bagus di sini tentang cara menggunakan CMAKE_CURRENT_LIST_DIRdan include(...)dalam proyek Anda secara efektif .
jmcarter9t
1
Mudah bingung karena CMAKE_CURRENT_SOURCE_DIRlebih mirip CMAKE_SOURCE_DIRdaripada yang disiratkan oleh dokumen.
Malachi
Dan dengan add_subdirectory()? Apakah kedua variabel akan mengarah ke folder?
einpoklum
@einpoklum, Ya, mereka berdua menunjuk ke folder,
rjhcnf