Sama seperti make clean
menghapus semua file yang telah dibuat makefile, saya ingin melakukan hal yang sama dengan CMake. Terlalu sering saya menemukan diri saya secara manual melalui direktori menghapus file seperti cmake_install.cmake
dan CMakeCache.txt
, dan CMakeFiles
folder.
Apakah ada perintah cmake clean
untuk menghapus semua file ini secara otomatis? Idealnya ini harus mengikuti struktur rekursif yang ditentukan dalam CMakeLists.txt
file direktori saat ini .
cd <location-of-cmakelists>/build && cmake ..
Negara bagian FAQ resmi CMake :
sumber
Di hari-hari ini di mana-mana Git, Anda mungkin lupa CMake dan gunakan
git clean -d -f -x
, yang akan menghapus semua file yang tidak di bawah kendali sumber.sumber
-x
pilihan meskipun. Itu trik yang sangat baik darigit
perdagangan. Meskipun saya pribadi masih akan melakukan dry-run dulugit clean -d -f -x -n
,. Kadang-kadang saya menyimpan file kenyamanan yang saya gunakan untuk proyek dengan folder proyek di bawahgit
kendali, tapi itu bukan sesuatu yang ingin saya bagikan dengan orang lain jadi saya tidakgit add
membawanya ke proyek. Ini akan menghapus file semacam itu jika saya tidak berhati-hati untuk menambahkan-e <pattern>
opsi. Pada catatan itu, alangkah baiknya jikagit
memiliki.gitcleanignore
file. :)chattr +i $filename
(memerlukan izin root, tidak diizinkan untuk memodifikasi file setelah ini). Dengan cara ini git tidak akan dapat menghapus file itu bahkan jika ia mencoba melakukannya sepertirm -f
.git add
?Saya meng-google-nya selama setengah jam dan satu-satunya hal berguna yang saya dapatkan adalah menjalankan
find
utilitas:Juga, pastikan untuk memanggil
make clean
(atau generator CMake apa pun yang Anda gunakan) sebelumnya itu.:)
sumber
rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFiles
dan masih belum selesai ...Anda dapat menggunakan sesuatu seperti:
Saya biasanya membuat perintah "make clean-all" menambahkan panggilan ke "make clean" untuk contoh sebelumnya:
Jangan mencoba menambahkan target "bersih" sebagai ketergantungan:
Karena "bersih" bukanlah target nyata di CMake dan ini tidak berhasil.
Selain itu, Anda tidak boleh menggunakan "clean-cmake-file" ini sebagai ketergantungan apa pun:
Karena, jika Anda melakukannya, semua file CMake akan dihapus sebelum clean-all selesai, dan make akan membuat Anda mengalami kesalahan saat mencari "CMakeFiles / clean-all.dir / build.make". Karena itu, Anda tidak dapat menggunakan perintah clean-all sebelum "apapun" dalam konteks apa pun:
Itu juga tidak berhasil.
sumber
Cukup mengeluarkan
rm CMakeCache.txt
karya untuk saya juga.sumber
cmake /build-path
lagi.Mungkin agak ketinggalan jaman, tetapi karena ini adalah hit pertama ketika Anda google
cmake clean
, saya akan menambahkan ini:Karena Anda dapat memulai membangun di dir membangun dengan target yang ditentukan dengan
cmake --build . --target xyz
Anda tentu saja bisa lari
cmake --build . --target clean
untuk menjalankan
clean
target di file build yang dihasilkan.sumber
Saya setuju bahwa build out-of-source adalah jawaban terbaik. Tetapi untuk saat-saat ketika Anda harus melakukan in-source build, saya telah menulis skrip Python yang tersedia di sini , yang:
sumber
make
ketika tidak adaMakefile
hadiah karena pembersihan sebelumnya (yaitu, buat skrip ini idempoten). Cukup tambahkan baris (diberi spasi dengan benar):if os.path.isfile(os.path.join(directory,'Makefile')):
tepat sebelum baris 24:args = [
dan tentu saja indentasi seluruh fungsi tubuh setelah baris baru ditambahkan. Ini hanya akan melakukan amake ... clean
jikaMakefile
ada dalam direktori saat ini sedang dibersihkan. Kalau tidak, skripnya sempurna!Solusi yang saya temukan baru-baru ini adalah menggabungkan konsep build out-of-source dengan wrapper Makefile.
Dalam file CMakeLists.txt tingkat atas, saya menyertakan yang berikut untuk mencegah build in-source:
Lalu, saya membuat Makefile tingkat atas, dan termasuk yang berikut:
Target default
all
dipanggil dengan mengetikmake
, dan memanggil target./build/Makefile
.Hal pertama yang dilakukan target
./build/Makefile
adalah membuatbuild
direktori menggunakan$(MKDIR)
, yang merupakan variabel untukmkdir -p
. Direktoribuild
adalah tempat kami akan melakukan pembangunan di luar sumber kami. Kami memberikan argumen-p
untuk memastikan bahwamkdir
tidak berteriak kepada kami untuk mencoba membuat direktori yang mungkin sudah ada.Hal kedua yang dilakukan target
./build/Makefile
adalah mengubah direktori kebuild
direktori dan menjalankannyacmake
.Kembali ke
all
target, kami memohon$(MAKE) -C build
, di mana$(MAKE)
variabel Makefile dihasilkan secara otomatismake
.make -C
mengubah direktori sebelum melakukan apa pun. Karena itu, menggunakan$(MAKE) -C build
sama dengan melakukancd build; make
.Untuk meringkas, memanggil pembungkus Makefile ini dengan
make all
ataumake
setara dengan melakukan:Target
distclean
memanggilcmake ..
, lalumake -C build clean
, dan akhirnya, menghapus semua konten daribuild
direktori. Saya percaya ini adalah persis apa yang Anda minta dalam pertanyaan Anda.Bagian terakhir dari Makefile mengevaluasi apakah target yang disediakan pengguna adalah atau tidak
distclean
. Jika tidak, itu akan mengubah direktoribuild
sebelum memanggilnya. Ini sangat kuat karena pengguna dapat mengetik, misalnyamake clean
, dan Makefile akan mengubahnya menjadi setaracd build; make clean
.Kesimpulannya, pembungkus Makefile ini, dalam kombinasi dengan konfigurasi CMake out-of-source wajib, membuatnya agar pengguna tidak perlu berinteraksi dengan perintah
cmake
. Solusi ini juga menyediakan metode yang elegan untuk menghapus semua file output CMake daribuild
direktori.PS Di Makefile, kami menggunakan awalan
@
untuk menekan output dari perintah shell, dan awalan@-
untuk mengabaikan kesalahan dari perintah shell. Saat menggunakanrm
sebagai bagian daridistclean
target, perintah akan mengembalikan kesalahan jika file tidak ada (mereka mungkin sudah dihapus menggunakan baris perintah denganrm -rf build
, atau mereka tidak pernah dihasilkan di tempat pertama). Kesalahan pengembalian ini akan memaksa Makefile kami untuk keluar. Kami menggunakan awalan@-
untuk mencegahnya. Dapat diterima jika file sudah dihapus; kami ingin Makefile kami terus berjalan dan menghapus sisanya.Hal lain yang perlu diperhatikan: Makefile ini mungkin tidak berfungsi jika Anda menggunakan sejumlah variabel variabel CMake untuk membangun proyek Anda, misalnya
cmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar"
,. Makefile ini mengasumsikan Anda memanggil CMake dengan cara yang konsisten, baik dengan mengetikcmake ..
atau dengan memberikancmake
sejumlah argumen yang konsisten (yang dapat Anda sertakan dalam Makefile Anda).Akhirnya, kredit di mana kredit jatuh tempo. Wrapper Makefile ini diadaptasi dari Makefile yang disediakan oleh Template Proyek Aplikasi C ++ .
sumber
Tentu saja, build out-of-source adalah metode masuk ke Unix Makefiles, tetapi jika Anda menggunakan generator lain seperti Eclipse CDT, ia lebih suka Anda membangun in-source. Dalam hal ini, Anda harus membersihkan file CMake secara manual. Coba ini:
Atau jika Anda telah mengaktifkan globstar
shopt -s globstar
, coba pendekatan yang kurang menjijikkan ini sebagai gantinya:sumber
build
. Butuh waktu sedikit lebih lama daripada perintah-perintah itu tetapi saya harus melakukannya sekali saja :)coba gunakan: cmake --clean-first path-of-CMakeLists.txt-file -B output-dir
--clean-first: Bangun target bersihkan dulu, lalu bangun.
(Untuk membersihkan saja, gunakan --target bersih.)
sumber
Dalam kasus di mana Anda meneruskan
-D
parameter ke CMake saat membuat file build dan tidak ingin menghapus seluruh direktori build /:Hapus saja direktori CMakeFiles / di dalam direktori build Anda.
Ini menyebabkan CMake untuk menjalankan kembali, dan membangun file sistem dibuat ulang. Bangunan Anda juga akan mulai dari awal.
sumber
Untuk menyederhanakan pembersihan saat menggunakan build "out of source" (yaitu Anda membuat dalam
build
direktori), saya menggunakan skrip berikut:Setiap kali Anda perlu membersihkan, Anda harus mengambil skrip ini dari
build
direktori:sumber
cd .. ; rm ; mkdir ; cd
urutan dengancd .. ; rm -rf build/*
.Jika Anda memiliki definisi kustom dan ingin menyimpannya sebelum membersihkan, jalankan yang berikut di direktori build Anda:
Kemudian buat direktori build baru (atau hapus direktori build lama dan buat kembali) dan akhirnya jalankan
cmake
dengan argumen yang akan Anda dapatkan dengan script di atas.sumber
Jika Anda berlari
itu akan membuat ulang file CMake. Yang diperlukan jika Anda menambahkan file baru ke folder sumber yang dipilih oleh * .cc, misalnya.
Meskipun ini bukan "bersih" per se, itu "membersihkan" file CMake dengan membuat ulang cache.
sumber
Saya menggunakan skrip shell berikut untuk tujuan tersebut:
Jika Anda menggunakan Windows maka gunakan Cygwin untuk skrip ini.
sumber
Sangat lucu melihat pertanyaan ini mendapat begitu banyak perhatian dan solusi rumit, yang memang menunjukkan rasa sakit untuk tidak memiliki metode bersih dengan cmake.
Nah, Anda pasti bisa
cd build
mengerjakannya, lalu lakukanrm -rf *
ketika Anda perlu membersihkan. Namun,rm -rf *
ini adalah perintah yang berbahaya mengingat banyak orang yang sering tidak tahu di mana mereka berada.Jika Anda
cd ..
,rm -rf build
dan kemudianmkdir build
dan kemudiancd build
, itu terlalu banyak mengetik.Jadi solusi yang baik adalah dengan tetap keluar dari folder build dan beri tahu cmake path:
untuk mengkonfigurasi:
cmake -B build
untuk membangun:
cmake --build build
untuk membersihkan:
rm -rf build
untuk membuat ulang folder build: Anda bahkan tidak perlu
mkdir build
, cukup konfigurasikan dengancmake -B build
dan cmake akan membuatnyasumber
cmake
sebagian besar memasakMakefile
, salah satu bisa menambahkanrm
ke palsu bersih .Sebagai contoh,
sumber
Saya memiliki ini di file rc shell saya (
.bashrc
,.zshrc
):Anda seharusnya menggunakannya hanya untuk build out-of-source. Katakanlah Anda memiliki direktori bernama
build/
untuk tujuan ini. Maka Anda hanya perlu larit-cmake-clean
dari dalamnya.sumber
Saya menggunakan jawaban zsxwing dengan sukses untuk memecahkan masalah berikut:
Saya memiliki sumber yang saya bangun di beberapa host (di papan Raspberry Pi Linux, di mesin virtual VMware Linux, dll.)
Saya memiliki skrip Bash yang membuat direktori sementara berdasarkan nama host mesin seperti ini:
sumber
Buat direktori bangunan sementara, misalnya,
build_cmake
,. Karenanya semua file build Anda akan berada di dalam folder ini.Kemudian di file CMake utama Anda tambahkan perintah di bawah ini.
Oleh karena itu saat kompilasi lakukan
Dan untuk membersihkan lakukan:
sumber