Kedengarannya seperti Anda menginginkan build out of source . Ada beberapa cara untuk membuat build di luar sumber.
Lakukan apa yang kamu lakukan, lari
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
yang akan menyebabkan cmake untuk menghasilkan pohon membangun di /path/to/my/build/folder
atas pohon sumber di /path/to/my/source/folder
.
Setelah Anda membuatnya, cmake mengingat di mana folder sumber berada - sehingga Anda dapat menjalankan kembali cmake di pohon build dengan
cmake /path/to/my/build/folder
atau bahkan
cmake .
jika direktori Anda saat ini sudah menjadi folder build.
Untuk CMake 3.13 atau yang lebih baru, gunakan opsi ini untuk mengatur sumber dan folder build
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
Untuk CMake yang lebih lama, gunakan beberapa opsi tidak berdokumen untuk menyetel folder sumber dan build :
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
yang akan melakukan hal yang persis sama seperti (1), tetapi tanpa bergantung pada direktori kerja saat ini.
CMake menempatkan semua outputnya di pohon build secara default, jadi kecuali Anda secara bebas menggunakan ${CMAKE_SOURCE_DIR}
atau ${CMAKE_CURRENT_SOURCE_DIR}
dalam file cmake Anda, itu tidak boleh menyentuh pohon sumber Anda .
Hal terbesar yang bisa salah adalah jika sebelumnya Anda telah membuat pohon build di pohon sumber Anda (misalnya, Anda memiliki build dalam sumber ). Setelah Anda melakukan ini, bagian kedua dari (1) di atas dimulai, dan cmake tidak membuat perubahan apa pun pada sumber atau lokasi pembuatan. Jadi, Anda tidak dapat membuat build out-of-source untuk direktori sumber dengan build dalam-sumber . Anda dapat memperbaikinya dengan cukup mudah dengan menghapus (minimal) CMakeCache.txt
dari direktori sumber. Ada beberapa file lain (kebanyakan di CMakeFiles
direktori) yang dihasilkan CMake yang harus Anda hapus juga, tetapi ini tidak akan menyebabkan cmake memperlakukan pohon sumber sebagai pohon build.
Karena build out-of-source seringkali lebih diinginkan daripada build dalam-sumber, Anda mungkin ingin memodifikasi cmake Anda agar memerlukan build di luar sumber:
# Ensures that we do an out of source build
MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${CMAKE_BINARY_DIR}" insource)
GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${PARENTDIR}" insourcesubdir)
IF(insource OR insourcesubdir)
MESSAGE(FATAL_ERROR "${MSG}")
ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
"${CMAKE_PROJECT_NAME} requires an out of source build."
)
Makro di atas berasal dari modul yang biasa digunakan bernama MacroOutOfSourceBuild
. Ada banyak sumber tentang MacroOutOfSourceBuild.cmake
di google tetapi saya tidak dapat menemukan yang asli dan itu cukup pendek untuk dimasukkan di sini secara lengkap.
Sayangnya cmake biasanya telah menulis beberapa file pada saat makro dipanggil, jadi meskipun itu akan menghentikan Anda untuk benar-benar melakukan pembangunan, Anda masih perlu menghapus CMakeCache.txt
dan CMakeFiles
.
Anda mungkin merasa berguna untuk menyetel jalur tempat penulisan biner, pustaka bersama, dan pustaka statis - dalam hal ini lihat bagaimana cara membuat keluaran cmake menjadi dir 'bin'? (penafian, saya memiliki jawaban dengan suara terbanyak untuk pertanyaan itu ... tapi begitulah cara saya mengetahuinya).
CMAKE_BINARY_DIR
atauCMAKE_CACHEFILE_DIR
. Apa yang terjadi jika Anda menghapus semuaset()
panggilan ini dan melakukannyacd Compile; rm -rf *; cmake ../src
?