Kaynak dışı bir derleme istediğiniz gibi görünüyor . Kaynak dışı bir yapı oluşturmanın birkaç yolu vardır.
Yaptığın şeyi yap, koş
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
hangi cmake bir oluşturmasına neden olur inşa ağacı içinde /path/to/my/build/folder
için kaynak ağacının içinde /path/to/my/source/folder
.
Bir kez oluşturduğunuzda, cmake kaynak klasörün nerede olduğunu hatırlar - böylece yapı ağacında cmake'ı yeniden çalıştırabilirsiniz.
cmake /path/to/my/build/folder
ya da
cmake .
mevcut dizininiz zaten yapı klasörü ise.
CMake 3.13 veya üstü için, kaynağı ayarlamak ve klasörler oluşturmak için bu seçenekleri kullanın
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
Daha eski CMake için, kaynağı ayarlamak ve klasörler oluşturmak için bazı belgelenmemiş seçenekleri kullanın :
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
(1) ile tam olarak aynı şeyi yapacak, ancak mevcut çalışma dizinine güvenmeden.
CKağıt yılında çıkışlarının tüm koyar inşa ağacının sen özgürce kullanıyor bu yüzden sürece, varsayılan olarak ${CMAKE_SOURCE_DIR}
veya ${CMAKE_CURRENT_SOURCE_DIR}
sizin cmake dosyalarında, bu temas etmemelidir kaynak ağacını .
Yanlış gidebilecek en büyük şey, daha önce kaynak ağacınızda bir yapı ağacı oluşturmuş olmanızdır (yani, bir kaynak derlemesine sahipseniz ). Bunu yaptıktan sonra, yukarıdaki (1) 'in ikinci kısmı devreye girer ve cmake, kaynakta veya inşa konumlarında herhangi bir değişiklik yapmaz. Bu nedenle, bir kaynak içi yapıya sahip bir kaynak dizin için kaynak dışı bir yapı oluşturamazsınız . Bunu CMakeCache.txt
, kaynak dizinden (en azından) kaldırarak oldukça kolay bir şekilde düzeltebilirsiniz . CMakeFiles
CMake'nin oluşturduğu ve sizin de kaldırmanız gereken birkaç başka dosya (çoğunlukla dizinde) vardır, ancak bunlar cmake'nin kaynak ağacını bir yapı ağacı olarak görmesine neden olmaz.
Kaynak dışı derlemeler genellikle kaynak içi derlemelerden daha cazip olduğundan, cmake'nizi kaynak dışı derlemeler gerektirecek şekilde değiştirmek isteyebilirsiniz:
# 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."
)
Yukarıdaki makro, yaygın olarak kullanılan bir modülden gelir MacroOutOfSourceBuild
. MacroOutOfSourceBuild.cmake
Google'da çok sayıda kaynak var, ancak orijinalini bulamıyorum ve buraya tam olarak dahil edilecek kadar kısa.
Ne yazık ki cmake, makro çağrıldığında genellikle birkaç dosya yazmıştır, bu nedenle yapıyı fiilen gerçekleştirmenizi engelleyecek olsa da, yine de silmeniz gerekir CMakeCache.txt
ve CMakeFiles
.
İkili dosyaların, paylaşılan ve statik kitaplıkların yazılacağı yolları ayarlamayı yararlı bulabilirsiniz - bu durumda cmake çıktısını bir 'bin' dizinine nasıl yapabilirim? (feragatname, bu soruya en çok oylanan cevaba sahibim ... ama ben bunu böyle biliyorum).
CMAKE_BINARY_DIR
veyaCMAKE_CACHEFILE_DIR
. Tüm buset()
aramaları kaldırır ve yaparsanız ne olurcd Compile; rm -rf *; cmake ../src
?