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.txt
file 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 CMakeFiles
folder 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?
Jawaban:
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
selalu gunakan
sebagai gantinya. Saya biasanya menggunakan subfolder kosong
build
di dalam direktori sumber saya sebagai direktori bangunan.Untuk meringankan rasa sakit Anda, izinkan saya memberikan gambaran singkat tentang file yang relevan yang dihasilkan CMake:
ccmake
ataucmake-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.CMakeFiles
subdirektori.Secara umum Anda tidak boleh main-main dengan file yang dihasilkan CMake untuk Anda. Semua masalah dapat diselesaikan dari dalam
CMakeLists.txt
dengan 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.sumber
CMakeFiles
direktori berisiCMakeError.log
danCMakeOutput.log
penting untuk mengatasi masalah pembuatan CMake.CMakeFiles/target_name.dir
direktori adalahflags.make
danlink.txt
file. 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.Sebagaimana dinyatakan di situs webnya:
Dalam kebanyakan kasus ini digunakan untuk menghasilkan file proyek / membuat - dalam contoh Anda telah menghasilkan
Makefile
yang 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.txt
file Anda, Anda dapat memulaidi dalam direktori proyek Anda pada platform Windows, Cmake akan menghasilkan semua file proyek / solusi yang diperlukan (
.sln
dll.).Jika Anda ingin membangun perangkat lunak Anda pada platform Linux / Unix, Anda cukup pergi ke direktori sumber tempat Anda menyimpan
CMakeLists.txt
file Anda dan memicu hal yang samacmake .
dan itu akan menghasilkan semua file yang diperlukan bagi Anda untuk membangun perangkat lunak dengan cara sederhanamake
ataumake 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.txt
fileAda 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
danregex
diinstal pada sistem Anda. Untuk melakukan itu, Anda dapat menggunakan sintaks berikut:Setelah memeriksa bahwa itu akan menghasilkan file makefiles untuk sistem / IDE / compiler yang sesuai.
sumber
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)
sumber