CMake tam olarak nasıl çalışır?


158

Bunu sadece kendim için sormuyorum. Umarım bu soru benim gibi birçok yeni başlayan için bir referans olacaktır, bu kadar küçük bir CMakeLists.txtdosya için sahnelerin arkasında neler olup bittiğini tamamen şaşırttı.

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

ve çok küçük tutorial.cpp

int main() { return 0; } 

oluşturulan çok fazla dosya var

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

ve CMakeFilesçok fazla dosya ve klasör içeren bir klasör

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

Perde arkasında neler olup bittiğini anlamamak (örneğin: dosyalar neden bu şekilde oluşturulmuş olabilir ve amaçlarının ne olduğu) CMake'yi öğrenmenin önündeki en büyük engeldi.

Biri bilirse, bunu gelecek kuşak için açıklar mısınız? Bu dosyaların amacı nedir ve yazdığımda cmake ., cmake projeyi oluşturmadan önce tam olarak yapılandırmak ve üretmek nedir?


1
Kaynak dışı yapıların farkındayım. Kimse kaynak dışı bir yapı oluşturmadıysa ve hala oluşturulan dosyaları temizlemenin bir yolunu arıyorsa, bu teknik iyi çalışır: stackoverflow.com/a/12055610/453673
Nav

3
Harika bir açıklama var: aosabook.org/en/cmake.html ve muhtemelen soruya derinlemesine cevap (kısaca özetlenemez).
parasrish

@SebTu Bozuk bağlantı. Cmake.html sayfası mevcut değil.
Nav

3
@Nav Yap, işaretleme sözdizimini berbat etti, üzgünüm. Böylece, burada düzeltilmiş versiyonu: cmake yeni insanlar için gerçekten cmake mimarisini okumanızı tavsiye ederim . Cmake'ın kendisini ayrıntılara girmeden nasıl çalıştığını hissetmek için yeterli bilgi sağlar.
SebNag

Yanıtlar:


92

İşin sırrı, oluşturulan dosyaların ne yaptığını anlamak zorunda olmamanızdır.

CMake, derleme sistemine bir çok karmaşıklık getirir, bunların çoğu yalnızca karmaşık yazılım projeleri oluşturmak için kullanırsanız işe yarar.

İyi haber şu ki CMake, bu karışıklığın çoğunu sizden uzak tutmak için iyi bir iş çıkarıyor: Kaynak dışı yapıları kullanın ve oluşturulan dosyalara bakmak zorunda bile değilsiniz. Şimdiye kadar yapmadıysanız (yazdığınızdan beri durum bence cmake .), devam etmeden önce lütfen kontrol edin . Yapı ve kaynak dizinini karıştırmak CMake ile gerçekten acı vericidir ve sistemin nasıl kullanılması gerektiği değildir.

Özetle: Yerine

cd <source_dir>
cmake .

her zaman kullan

cd <build_dir_different_from_source_dir>
cmake <source_dir>

yerine. Genellikle buildderleme dizini olarak kaynak dizinimin içinde boş bir alt klasör kullanıyorum .

Acınızı hafifletmek için, CMake'nin oluşturduğu ilgili dosyalara hızlı bir genel bakış sunalım:

  • Proje dosyaları / Makefiles - Aslında ilgilendiğiniz şeyler: Projenizi seçilen jeneratör altında oluşturmak için gerekli olan dosyalar. Bu, Unix Makefile'dan Visual Studio çözümüne kadar her şey olabilir.
  • CMakeCache.txt - Çalışmalar arasındaki değeri önbelleğe almak için kullanılan kalıcı bir anahtar / değer dizesi depolama alanıdır. Burada saklanan değerler, kütüphane bağımlılıklarına giden yollar veya isteğe bağlı bir bileşenin oluşturulup oluşturulmayacağı olabilir. Değişkenler listesi, çoğunlukla ccmakeveya çalışırken gördüğünüzle aynıdır cmake-gui. Bu zaman zaman bakmak yararlı olabilir, ancak mümkünse değerlerden herhangi birini değiştirmek için yukarıda belirtilen araçları kullanmanızı tavsiye ederim.
  • Oluşturulan dosyalar - Bu, otomatik olarak oluşturulan kaynak dosyalarından, oluşturulan projenizi diğer CMake projeleriyle yeniden entegre etmenize yardımcı olan dışa aktarma makrolarına kadar her şey olabilir. Bunların çoğu sadece talep üzerine üretilir ve sorunuz gibi basit bir projede görünmez.
  • Yapı sistemini mutlu etmek için başka bir şey hemen hemen gürültüdür. Özellikle, CMakeFilesalt dizinde olan hiçbir şeyi umursamadım .

Genel olarak CMake'in sizin için oluşturduğu dosyalardan herhangi birini karıştırmamalısınız. Tüm problemler şu CMakeLists.txtya da bu şekilde çözülebilir . Sonuç, projenizi beklendiği gibi oluşturduğu sürece, muhtemelen iyisinizdir. Kanlı ayrıntılar hakkında çok fazla endişelenmeyin - CMake'in sizi ilk etapta yedeklemeye çalıştığı şey budur.


Teşekkürler. Kaynak dışı yapıların farkındaydı, ancak gördüğünüz gibi, bu soruyu sormanın amacı daha fazla anlamaktı. Cevabınızın CMakeCache.txt kısmı gerçekten yardımcı oldu. Aradığım bu tür bir açıklama. Ayrıca, sorumun son cümlesi: " projeyi inşa etmeden önce cmake tam olarak nasıl yapılandırılıyor ve üretiliyor "
Nav

1
CMakeFilesdizin içerir CMakeError.logve CMakeOutput.logCMake derlemeleri sorun giderme için önemlidir.
Serge Rogatch

1
Bazen CMakeFiles/target_name.dirdizinde kontrol etmeniz gereken iki şey flags.makeve link.txtdosyalarıdır. Bunları, yukarı akış projelerinden bayrakları / bağlantılı şeyleri miras alan karmaşık projede kontrol etmek zorunda kaldım. Örneğin, TPL A'nın TPL B'ye bağımlı olduğu için bazı hatalar yaşadım. Ayrıca, projemin yerel olarak yüklediğim B'ye bağımlılığı vardı; ancak A, sistemimden (yerel yüklemem yerine) farklı etkinleştirilmiş seçeneklere sahip B sürümünü kullandı ve önce geldi ve projemde hatalara neden oldu. Sadece link.txt bakarak bunun olduğunu öğrendim.
bartgol

13

Web sitesinde belirtildiği gibi:

Cmake, derleyiciden bağımsız bir yöntem kullanarak yazılımın derleme sürecini yönetmek için platformlar arası, açık kaynaklı bir derleme sistemidir

Çoğu durumda proje oluşturmak / dosya yapmak için kullanılır - örneğin Makefile, yazılımınızı oluşturmak için kullanılan (çoğunlukla Linux / Unix platformunda).

Cmake, platforma özel proje üretecek / belirli derleme / platform için dosya oluşturacak platformlar arası derleme dosyaları sağlamaya izin verir.

Örneğin, yazılımınızı Windows üzerinde Visual Studio ile derlemeyi deneyebilir ve ardından CMakeLists.txtdosyanızdaki uygun sözdizimini başlatabilirsiniz

cmake .

projenizin Windows platformundaki dizininde, Cmake gerekli tüm proje / çözüm dosyalarını ( .slnvb.) oluşturur.

Yazılımınızı Linux / Unix platformunda oluşturmak istiyorsanız, sadece CMakeLists.txtdosyanızın bulunduğu kaynak dizine gidip aynı tetikleyiciyi kullanırsınız ve cmake .basit makeya da yazılım oluşturmak için gerekli tüm dosyaları oluşturur make all.

Burada temel Cmake işlevleri hakkında çok iyi bir sunum var http://www.elpauer.org/stuff/learning_cmake.pdf

DÜZENLE

Platforma bağımlı kitaplık içerme / değişken tanımları vb. Yapmak istiyorsanız bu sözdizimini CMakeLists.txtdosyada kullanabilirsiniz

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

Ayrıca, yapının başarısız olmasını engelleyebileceğiniz birçok komut var ve yerinde Cmake, örneğin destek kitaplıklarınızın olmadığını filesystemve regexsisteminizde yüklü olduğunu size bildirecektir . Bunu yapmak için aşağıdaki sözdizimini kullanabilirsiniz:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

Uygun sistem / IDE / derleyici için makefiles oluşturacağını kontrol ettikten sonra.


1
Teşekkürler Patryk. Yararlı cevap, ancak bağlantı kurduğunuz pdf, temel olarak CMake'in uygulanması olan CMake öğrenmenin ikinci aşamasını açıklar. Bir kişinin CMake'de dünyada neler olduğunu anlaması gereken ilk aşamanın açıklamasını soruyorum!
Nav

@Nav Cevabımı biraz genişlettim. Daha fazla bilgi için yine de web'de arama yapabilirsiniz.
Patryk

Bu, sorulan soruyu cevaplamaktan oldukça uzaktır.
SenhorLucas

1

CMake'in tam olarak nasıl çalıştığı geliştiriciler için bir sorudur, bu nedenle bu soru burada cevaplanamaz.

Bununla birlikte, CMake'i ne zaman kullanmanız gerektiği ve bu nedenle nasıl çalıştığı konusunda endişelenmeniz gerektiğinde yararlı bir rehberlik verebiliriz. Ben de "oh o sadece çalışır" cevapları hayranı değilim - çünkü, özellikle yazılım, HİÇBİR ŞEY hiç "sadece çalışır" ve HER ZAMAN bir noktada nitrit-cesur ayrıntıları girmek zorunda.

CMake endüstriyel güçte bir araçtır. Birkaç ÇOK karmaşık süreci otomatik hale getirir ve özellikle oldukça yeni bir geliştirici olarak farkında olmayabileceğiniz birçok değişkeni göz önünde bulundurur, muhtemelen CMake'in kullanabileceği tüm işletim sistemleri ve oluşturma araçları hakkında sınırlı bilgi ile çalışır. Bu kadar çok dosyanın üretilmesinin nedeni ve neden bu kadar karmaşık göründüğü, diğer tüm sistemlerin karmaşık olması ve hesaba katılması ve otomatik hale getirilmesi gerektiğidir. Buna ek olarak, aracın "önbellekleme" ve zamandan kazandıran diğer özellikleri de vardır CMake'deki her şeyi anlamak, bu oluşturma araçlarındaki ve işletim sistemlerindeki her şeyi ve bu değişkenlerin olası tüm kombinasyonlarını anlamak anlamına gelir, ki hayal edebileceğiniz gibi imkansızdır.

Büyük bir platformlar arası derleme sistemini yönetmekten sorumlu değilseniz ve kod tabanınızın birkaç KLOC, belki 100KLOG'a kadar olduğunu, CMake kullanmanın 100.000 dolarlık bir ormancılık ağacı kaldırmaya benzediğini unutmayın. 2 ayak çiçek bahçenizdeki otları çıkarmak için makine. (Bu arada, daha önce böyle bir makine görmediyseniz, youtube'da bir tane aramalısınız, harikalar)

Yapım sisteminiz küçük ve basitse, kendi makyaj dosyalarınızı elle yazmak veya kendiniz yazmak daha iyi olacaktır. Dosyalarınız kullanışsız hale geldiğinde veya başka bir platformda sisteminizin bir sürümünü oluşturmanız gerektiğinde, CMake'e geçebilirsiniz. Bu noktada, çözmeniz gereken birçok sorun olacak ve bunun hakkında daha odaklanmış sorular sorabilirsiniz. Bu arada, CMake hakkında yazılmış harika kitaplardan bazılarına göz atın, hatta daha iyisi kendiniz yazın! 8)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.