İlerleyen süreçte gerçekleştirilecek tüm örnekler Ubuntu 22.04 dağıtımına sahip Linux işletim sistemi üzerinde yapılmıştır. Ancak benzer adımları küçük bir araştırmayla istediğiniz işletim sisteminde yürütebilirsiniz.
Kullanım örneğine geçmeden önce, C++ kodlarını derlemek ve çalıştırabilmek için GCC derleyicisini içeren build-essential debian paketi (farklı bir derleyici (Clang vb.) kullanmak isterseniz o derleyiciye ait paket), CMake ile çalışabilmek için ise cmake debian paketine ihtiyacımız var.
sudo apt install build-essential
sudo apt install cmake
Temel CMake kullanımını görmek için basit bir C++ kodu yazarak süreci ilerleteceğiz. Herhangi bir metin editörü veya terminal üzerinden aşağıda yer alan dizin yapısını oluşturun.
├── build
├── CMakeLists.txt
└── src
└── main.cpp
"main.cpp" dosyasına aşağıdaki kodu ekleyin:
#include <iostream>
int main() {
std::cout << "Hello World!" << std::endl;
return 0;
}
Kök dizininde önceden oluşturduğumuz "CMakeList.txt" dosyasını düzenleyerek CMake direktiflerini belirtin:
cmake_minimum_required(VERSION 3.22.1)
project(
CMakeLearn
VERSION 0.0.1
DESCRIPTION "CMake Learn Application"
LANGUAGES CXX
)
add_executable(CMakeLearn src/main.cpp)
Projemizin derlenmesi ve kullanılabilmesi için minimum CMake versiyonunun 3.22.1 olması gerektiğini, projemizin adının CMakeLearn ve versiyonun 0.0.1 olduğunu, projeye dair yürütülebilir dosyanın src altında yer alan main.cpp aracılığıyla oluşturularak CMakeLearn adıyla kaydedilmesini belirlemiş olduk.
İlk kısımda bahsettiğimiz kısıtlama ve bağımlıklar için örnek durum oluşmuş oldu. CMake versiyonunu belirttiğimiz için, başka cihaz veya platformda aynı CMake dosyası kullanılarak proje derlenmeye çalışıldığında versiyon uyumsuzluğu söz konusuysa hata alınacaktır.
Ayrıca aşağıda yer alan satırların "CMakeLists.txt" dosyasına eklenmesi durumunda projenin C++17 standardını desteklediği, derleyicinin g++ olması ve C++17 standardını desteklemesi gerektiğini belirtebiliriz. Eğer required değeri false olarak set edilirse zorunluluk şartı bulunmayacaktır.
set(CMAKE_CXX_XOMPILER g++)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED true)
Şimdilik bu düzenlemeri dışarıda bırakıyoruz. Her şeyimiz hazır. Terminal aracılığıyla build dizine giderek CMake'i çalıştırın. CMake derleme işlemi için gerekli olan dosyaları ve içerikleri belirlediğimiz direktiflere (CMakeLists.txt) göre oluşturacaktır.
cd build/
cmake ..
Bu komutun çıktısını incelediğimizde, CMake'in varsayılan olarak seçili olan Unix Makefiles standartına göre yapılandırma dosyalarını ve içeriklerini GNU/GCC 11.4.0 versiyonuna sahip "/usr/bin/cc" dizininde yer alan derleyicimize uygun olarak build dizini içerisine otomatik olarak oluşturduğunu görebilirsiniz.
Seçili olan makefile standardını aşağıda yer alan komut aracılığıyla kolaylıkla kontrol edebilirsiniz.
cmake --help
CMake'in oluşturduğu dosya ve içeriklerini inceleyelim.
Oluşan dosyaları incelediğimizde derleyici ve işletim sistemine uygun olarak belirtilen direktiflere sahip nesneler, geçici/ara dosyalar ve derleme işlemini gerçekleştireceğimiz Makefile dosyasının elde edildiğini görebiliriz. Bu dosyalar aracılığıyla "make" komutunu kullanarak projeyi derleyebilir ve çalışabilir hale getirebiliriz.
make
Derleme işlemi tamamlandığında CMakeLists.txt dosyasında belirtilen dizin içerisinde "CMakeLearn" yürütülebilir dosyası oluştu ve çalıştırdığımızda ise "Hello World!" çıktısını elde etmiş olduk!
CMake'in bizlere sağladığı kolaylığı daha iyi anlamak için aynı işlemleri Clang derleyicisine uygun dosya ve içerikleri oluşturmak için gerçekleştireceğiz. Bu işlem için Clang derleyicisine sahip olmanız gerekir.
sudo apt-get install clang
İlk olarak build dizinin temizleyelim. Ardından yeniden Makefile dosyasını oluşturmak için CMake'i kullanalım.
cd build/
rm -rf *
cmake -DCMAKE_C_COMPILER=clang ..
Cmake komutunun çıktısının incelediğimizde ilk kullanımımızdan farklı olarak compiler olarak Clang 14.0.0 sürümünün, "/usr/bin/clang" dizininden seçildiğini görebilirsiniz. Şimdi make komutunu çalıştırarak, yürütülebilir olarak oluşacak olan "CMakeLearn" dosyamızı elde edelim. Ardından dosyamızı çalıştırarak "Hello, World!" çıktısını alalım.
make
Farklı derleyiciler için işlem yapmak istediğinizde komut satırı üzerinden parametre geçmek zorunda değilsiniz. Bunun yerine "CMakeLists.txt" dosyasını düzenleyebilir veya terminal üzerinde "CMAKE_GENERATOR" parametresini set edebilirsiniz. Clang için örnek düzenlemeye bu bağlantıdan ulaşabilirsiniz.
Şu ana kadar kullandığımız tüm örneklerde make komutuna uygun derleme dosyaları oluşturarak kullandık, buna alternatif olarak gömülü vb. projelerde kullanılan "Ninja" için derleme dosyalarını da CMake ile oluşturabilirz.
Bu işlem için Ninja'nın sisteminizde kurulu olması gerekir.
sudo apt-get install ninja-build
İlk olarak build dizinini temizleyelim ve yeniden dosyaları oluşturmak için CMake'i kullanalım.
cd build/
rm -rf *
cmake -GNinja ..
Oluşan dosya çıktılarını incelediğimizde yukarıda yer alan çıktılardan farklı olarak ninja için belirlenmiş dosyalarında oluştuğunu görebiliyoruz. Derleme işlemini ninja komutuyla gerçekleştirelim ve yürütülebilir dosyayı çalıştırarak "Hello, World!" çıktısına alalım.
ninja
Derleme işlemlerinde make ve ninja kullanacağımızın bilgisine sahiptik. Fakat dışarıdan bilmediğiniz bir projeyi derlemek için aşağıdaki yöntemle derleme yapabilirsiniz. Elbette bu işlemi yapabilmeniz için "cmake .." komutunu kullanarak gerekli dosyaları oluşturmuş olmanız gerekiyor.
cd build/
cmake --build .
Örnekler içerisinde birçok kez rm -rf * komutu kullanılıyor. Fakat make ve ninja için help aracılığıyla gerekli komutları öğrenerek cmake --build . ile birlikte kullanabilirsiniz. Örneğin Unix System Files ve make kullanacaksınız;
cmake --build . --target clean
cmake --build . --target all
- ChatGPT 3.5'ten yardım alınmıştır.
- CMake 2.8.12 Documentation
- How to CMake Good - 0b - Running CMake
- CMake Tutorial
- Switching between GCC and Clang/LLVM using CMake
- How to Use Ninja
- What is Ninja vs CMake
- Difference between invoking
ninja
directly vs throughcmake --build
- Can you help me understand what the difference of Make, CMake, and Ninja?
- ENCSS - CMake hands-on workshop
- Cmake Temel (Zero to Level0.1)
- Learn CMake's Scripting Language in 15 Minutes