Bagaimana tepatnya cara kerja CMake?

158

Saya tidak meminta ini untuk diri saya sendiri. Saya harap pertanyaan ini akan menjadi referensi bagi banyak pemula yang menyukai saya, merasa benar-benar membingungkan tentang apa sebenarnya yang terjadi di balik layar ketika untuk CMakeLists.txtfile sekecil itu

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

dan seperti kecil tutorial.cpp

int main() { return 0; } 

ada begitu banyak file yang dihasilkan

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

dan CMakeFilesfolder dengan begitu banyak file dan folder

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

Tidak memahami apa yang terjadi di balik layar (yaitu: mengapa file mungkin harus dibuat dan apa tujuannya), adalah kendala terbesar untuk dapat mempelajari CMake.

Jika ada yang tahu, bisakah Anda menjelaskannya demi keturunan? Apa tujuan dari file-file ini, dan ketika saya mengetik cmake ., apa sebenarnya yang cmake konfigurasikan dan hasilkan sebelum membangun proyek?

Nav
sumber
1
Saya mengetahui pembangunan di luar sumber. Jika ada yang tidak melakukan build out dari sumber dan masih mencari cara untuk membersihkan file yang dihasilkan, teknik ini berfungsi dengan baik: stackoverflow.com/a/12055610/453673
Nav
3
Ada deskripsi yang bagus di: aosabook.org/en/cmake.html dan mungkin jawaban mendalam untuk pertanyaan (yang tidak dapat diringkas secara singkat di sini).
parasrish
@SebTu Tautan Rusak. Halaman cmake.html tidak ada.
Nav
3
@Nav Yap, mengacaukan sintaks markup, maaf. Jadi, inilah versi yang diperbaiki: Untuk orang yang baru mengenal cmake, saya sangat merekomendasikan membaca arsitektur cmake . Ini memberikan informasi yang cukup untuk memahami bagaimana cmake bekerja tanpa menghilangkan rinciannya.
SebNag

Jawaban:

92

Rahasianya adalah Anda tidak harus memahami apa yang dilakukan file yang dihasilkan.

CMake memperkenalkan banyak kompleksitas ke dalam sistem build, yang sebagian besar hanya bermanfaat jika Anda menggunakannya untuk membangun proyek perangkat lunak yang kompleks.

Kabar baiknya adalah bahwa CMake melakukan pekerjaan yang baik untuk menjaga banyak kekacauan ini dari Anda: Gunakan build out-of-source dan Anda bahkan tidak perlu melihat file yang dihasilkan. Jika Anda tidak melakukan ini sejauh ini (yang saya kira adalah masalahnya, sejak Anda menulis cmake .), silakan periksa sebelum melanjutkan . Mencampur direktori build dan source benar-benar menyakitkan dengan CMake dan bukan bagaimana sistem seharusnya digunakan.

Singkatnya: Alih-alih

cd <source_dir>
cmake .

selalu gunakan

cd <build_dir_different_from_source_dir>
cmake <source_dir>

sebagai gantinya. Saya biasanya menggunakan subfolder kosong builddi dalam direktori sumber saya sebagai direktori bangunan.

Untuk meringankan rasa sakit Anda, izinkan saya memberikan gambaran singkat tentang file yang relevan yang dihasilkan CMake:

  • File proyek / Makefiles - Apa yang sebenarnya Anda minati: File yang diperlukan untuk membangun proyek Anda di bawah generator yang dipilih. Ini bisa berupa apa saja mulai dari Unix Makefile hingga solusi Visual Studio.
  • CMakeCache.txt - Ini adalah penyimpanan string kunci / nilai persisten yang digunakan untuk menyimpan nilai di antara berbagai proses. Nilai yang disimpan di sini dapat menjadi jalur menuju dependensi pustaka atau apakah komponen opsional akan dibuat sama sekali. Daftar variabel sebagian besar identik dengan yang Anda lihat saat menjalankan ccmakeatau cmake-gui. Ini dapat berguna untuk dilihat dari waktu ke waktu, tetapi saya akan merekomendasikan untuk menggunakan alat-alat tersebut untuk mengubah nilai apa pun jika memungkinkan.
  • File yang dihasilkan - Ini bisa apa saja, dari file sumber autogenerated untuk mengekspor makro yang membantu Anda mengintegrasikan kembali proyek buatan Anda dengan proyek CMake lainnya. Sebagian besar ini hanya dihasilkan atas permintaan dan tidak akan muncul dalam proyek sederhana seperti yang dari pertanyaan Anda.
  • Yang lainnya cukup berisik untuk membuat sistem build senang. Secara khusus, saya tidak pernah perlu peduli tentang apa pun yang terjadi di dalam CMakeFilessubdirektori.

Secara umum Anda tidak boleh main-main dengan file yang dihasilkan CMake untuk Anda. Semua masalah dapat diselesaikan dari dalam CMakeLists.txtdengan satu atau lain cara. Selama hasilnya membangun proyek Anda seperti yang diharapkan, Anda mungkin baik-baik saja. Jangan terlalu khawatir tentang detail berdarah - karena inilah yang CMake coba luangkan untuk Anda.

KomikSMS
sumber
Terima kasih. Sadar akan sumber yang keluar dari sumber, tetapi seperti yang akan Anda lihat, tujuan mengajukan pertanyaan ini adalah untuk lebih memahami. Bagian CMakeCache.txt dari jawaban Anda sangat membantu. Penjelasan seperti inilah yang saya cari. Juga, kalimat terakhir dari pertanyaan saya: " apa sebenarnya yang cmake konfigurasikan dan hasilkan sebelum membangun proyek "
Nav
1
CMakeFilesdirektori berisi CMakeError.logdan CMakeOutput.logpenting untuk mengatasi masalah pembuatan CMake.
Serge Rogatch
1
Dua hal yang kadang perlu Anda periksa di CMakeFiles/target_name.dirdirektori adalah flags.makedan link.txtfile. Saya harus memeriksa ini dalam proyek kompleks, yang mewarisi bendera / barang terkait dari proyek hulu. Misalnya,: Saya memiliki beberapa kesalahan karena TPL A memiliki ketergantungan pada TPL B. Juga proyek saya memiliki ketergantungan pada B, yang saya instal secara lokal; tetapi A menggunakan versi B dari sistem saya (daripada instalasi lokal saya) yang memiliki opsi yang berbeda diaktifkan, dan itu datang lebih dulu, menyebabkan kesalahan dalam proyek saya. Hanya dengan melihat tautan.txt saya dapat mengetahui bahwa ini terjadi.
bartgol
13

Sebagaimana dinyatakan di situs webnya:

Cmake adalah sistem pembangunan sumber terbuka lintas platform, untuk mengelola proses pembuatan perangkat lunak menggunakan metode kompiler-independen

Dalam kebanyakan kasus ini digunakan untuk menghasilkan file proyek / membuat - dalam contoh Anda telah menghasilkan Makefileyang digunakan untuk membangun perangkat lunak Anda (kebanyakan pada platform Linux / Unix).

Cmake memungkinkan untuk menyediakan file build lintas platform yang akan menghasilkan proyek platform spesifik / membuat file untuk kompilasi / platform tertentu.

Misalnya Anda dapat mencoba untuk mengkompilasi perangkat lunak Anda pada Windows dengan Visual Studio kemudian dengan sintaks yang tepat dalam CMakeLists.txtfile Anda, Anda dapat memulai

cmake .

di dalam direktori proyek Anda pada platform Windows, Cmake akan menghasilkan semua file proyek / solusi yang diperlukan ( .slndll.).

Jika Anda ingin membangun perangkat lunak Anda pada platform Linux / Unix, Anda cukup pergi ke direktori sumber tempat Anda menyimpan CMakeLists.txtfile Anda dan memicu hal yang sama cmake .dan itu akan menghasilkan semua file yang diperlukan bagi Anda untuk membangun perangkat lunak dengan cara sederhana makeatau make all.

Di sini Anda memiliki beberapa presentasi yang sangat baik tentang fungsionalitas kunci Cmake http://www.elpauer.org/stuff/learning_cmake.pdf

EDIT

Jika Anda ingin membuat pustaka dependen platform menyertakan / definisi variabel dll. Anda dapat menggunakan sintaks ini dalam CMakeLists.txtfile

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

Ada juga banyak perintah dengan penggunaan yang Anda dapat mencegah pembangunan gagal dan sebagai gantinya Cmake akan memberi tahu Anda bahwa misalnya Anda tidak memiliki pustaka pendorong filesystem dan regexdiinstal pada sistem Anda. Untuk melakukan itu, Anda dapat menggunakan sintaks berikut:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

Setelah memeriksa bahwa itu akan menghasilkan file makefiles untuk sistem / IDE / compiler yang sesuai.

Patryk
sumber
1
Terima kasih, Patryk. Jawaban yang bermanfaat, tetapi pdf yang Anda tautkan, menjelaskan sebagian besar tahap kedua pembelajaran CMake, yang pada dasarnya adalah implementasi CMake. Saya bertanya tentang penjelasan tahap pertama, di mana seseorang harus memahami apa yang sedang terjadi di CMake!
Nav
@ Tidak. Saya sedikit memperluas jawaban saya. Anda masih dapat mencari di web untuk informasi lebih lanjut.
Patryk
Ini cukup jauh dari menjawab pertanyaan yang diajukan.
SenhorLucas
1

Cara kerja CMake yang tepat adalah pertanyaan bagi pengembang, jadi pertanyaan ini tidak dapat dijawab di sini.

Namun kami dapat memberikan sentuhan panduan yang bermanfaat sejauh kapan Anda harus menggunakan CMake dan ketika itu Anda perlu khawatir tentang cara kerjanya. Saya bukan penggemar "oh itu hanya bekerja" jawaban baik - karena, terutama dalam perangkat lunak, TIDAK ADA "hanya bekerja" dan Anda SELALU harus masuk ke rincian seluk-beluk di beberapa titik.

CMake adalah alat kekuatan industri. Ini mengotomatiskan beberapa proses yang SANGAT rumit dan memperhitungkan banyak variabel yang mungkin tidak Anda sadari, terutama sebagai pengembang yang cukup baru, mungkin bekerja dengan pengetahuan yang terbatas tentang semua sistem operasi dan membangun alat yang dapat ditangani oleh CMake. Alasan begitu banyak file dihasilkan dan mengapa hal-hal tampak begitu rumit adalah karena semua sistem lain itu kompleks dan harus diperhitungkan dan diotomatisasi. Selain itu ada masalah "caching" dan fitur hemat waktu lainnya dari alat ini. Untuk memahami segala sesuatu di CMake berarti memahami segala sesuatu dalam alat bangun ini dan OS serta semua kemungkinan kombinasi dari variabel-variabel ini, yang dapat Anda bayangkan tidak mungkin.

Penting untuk dicatat bahwa jika Anda tidak bertanggung jawab mengelola sistem pembangunan lintas-platform besar, dan basis kode Anda adalah beberapa KLOC, mungkin hingga 100KLOG, menggunakan CMake sepertinya sedikit seperti menggunakan penghilangan pohon kehutanan senilai 100.000 dolar mesin untuk menghilangkan gulma dari taman bunga 2 kaki kali 2 kaki Anda. (Omong-omong, jika Anda belum pernah melihat mesin seperti itu, Anda harus mencarinya di youtube, mereka luar biasa)

Jika sistem build Anda kecil dan sederhana, akan lebih baik jika Anda hanya menulis makefile sendiri dengan tangan atau membuat skrip sendiri. Ketika makefile Anda menjadi berat atau Anda perlu membangun versi sistem Anda di platform lain, maka Anda dapat beralih ke CMake. Pada saat itu, Anda akan memiliki banyak masalah untuk dipecahkan dan Anda dapat mengajukan pertanyaan yang lebih fokus tentang hal itu. Sementara itu, periksa beberapa buku hebat yang telah ditulis tentang CMake, atau bahkan lebih baik, tulis sendiri! 8)

Tuan Jeps
sumber