Evet sevgili yazılımperver dostlarım. En son yaptığımız güncellemeler sonrasında artık uengine4’ü artık daha kolay oluşturabildiğinizi umuyorum. Buna yardımcı olması açısından ReadMe sayfasını da güncelledim, göz atmayı unutmayın. Ayrıca windows için olan kurulum adımlarına yönelik betiği de ekledim, inşallah linux için de ekleyeceğim.
Şimdi gelelim bu yazımızın konusuna: ccache.
Hemen ufak bir illüstrasyon ile başlayalım 🙂
Şaka bir yana, büyük ölçekli bir projede yer aldıysanız, yazılımın sıfırdan oluşturulma süreleri oldukça uzun olabilmekte (ki ben açıkçası bir ara 1 saati bulan build sürelerini hatırlıyorum).
Bu yazımda da, derlemeyi hızlandırma konusunda sizlere oldukça faydalı olacağını düşündüğüm ccache’ten bahsedeceğim. Bunu yaparken de, uEngine4’ü kullanıyor olacağız. Aslında bakarsanız, bu tek yazılık bir konu da değil ve bu son olmayacak, peyderpey benzer konulara değiniyor olacağım. Haydi başlayalım.
ccache nedir?
CCache temelde daha önce derlenen nesneleri tutarak, tekrar ilgili kaynak kodları derlendiğinde, daha önce derlenmiş olan nesneleri kullanmaya dayanmaktadır. Bu da özellikle “Rebuild” sürelerini oldukça kısaltıyor.
İlk olarak Samba açık kaynak projesinin oluşturulmasında, projeyi oluşturma süresini hızlandırmak için yardımcı bir araç olarak geliştirilmiş sonrasında da kendisine oldukça geniş bir kullanım kitlesi bulmuş durumda. CCache Sayfası erişerek detaylara göz atabilirsiniz.
Peki gerçekten ihtiyacım var mı? Kendi sayfasında da ifade ettiği üzere, sık sık rebuild yapıyorsanız, kesinlikle bundan faydalanacaksınız. Ayrıca, benzer dosyalar farklı dizinlerden derlense bile, yine önceden derlenmiş olan bu nesneler kullanılabilecektir ki bu ortak kaynak kodlar ile çalışanlar için ciddi bir zaman kazancı olacağı düşüncesindeyim. Ayrıca küçük ekipler için bu derlenen nesneler de paylaşılabilmekte. Her ne kadar buna yönelik başka araçlar da olsa, ccache de bu konuda sizlere yardımcı olacaktır.
ccache’in desteklediği platformlar ve derleyiciler için https://ccache.dev/platform-compiler-language-support.html adresine göz atmanızda fayda var.
CCache’in genel çalışma prensibi aşağıda verilen figürde gösterilmiştir:
CCache ilgili kaynak dosyalarını analiz ederken aşağıdaki bilgileri kullanmaktadır:
- Derleyici,
- Derleyiciye geçirilen parametreler,
- Dosya içerik ve boyutu.
CCache temelde derleyici wrapper’ı olarak çalışmaktadır ve geçirilen argümanları ilgili derleyiciye direk geçirir. Bu bağlamda da iki şekilde kullanım öneriliyor:
- Birincisi her komutun başına eklenebilir, denemek için ve spesifik projeler için iyi olabilir,
- İkincisi ise derleyici yerine geçerek yapması, bütün derlemeler için kullanmak istediğimizde bunu kullanabiliriz.
yukarıda bahsettiğim iki kullanım yanında benim de tercih ettiğim CMake ile kullanım da bulunmaktadır. Bu yazımda da buna değiniyor olacağım.
CMake ile kullanım
CMake ile kullanım için yapmanız gereken öncelikle CMake sürümünü kontrol etmek olacak, ccache, CMake 3.4 ile birlikte desteklenmeye başladı.
Öncelikli olarak https://ccache.dev/download.html adresinden ilgili platform için ccache sürümünü indirmeniz ve kurmanız gerekiyor.
- Windows için ilgili dosyayı indirip, ccache.exe’yi PATH ortam değişkenine eklemeniz yeterli,
- Linux için ise yine benzer sayfadan çalıştırılabilir dosyayı indirebilir ya da https://github.com/ccache/ccache adresinden kaynak dosyaları indirip el ile oluşturabilirsiniz. Ben açıkçası ikinci yöntemi tercih ediyorum,
Bu adımlardan sonra CMake ile kullanıma hazırız. Bunun için aşağıdaki adımları CMake betiğinize eklemeniz yeterli:
1 2 3 4 5 6 7 8 |
find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) message("CCACHE is found") set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) # Less useful to doit forlinking, see edit2 else(CCACHE_FOUND) message("CCACHE is NOT found") endif(CCACHE_FOUND) |
Bu betik temelde, her derleme için ccache’in kullanılmasına yönelik ayarı yapıyor. Windows ile kullanımda ise aşağıdaki betiklerin de eklenmesi gerekiyor:
1 2 3 4 5 6 7 8 9 10 |
if(MSVC) message("MSVC compile options will be optimized for CCache") foreach(config DEBUG RELWITHDEBINFO) foreach(lang C CXX) set(flags_var "CMAKE_${lang}_FLAGS_${config}") string(REPLACE "/Zi" "/Z7" ${flags_var} "${${flags_var}}") set(${flags_var} "${${flags_var}}" PARENT_SCOPE) endforeach() endforeach() endif() |
Yukarıdaki betik sadece MSVC (visual C++) Debug build’leri için. Bir şekilde ccache windows buildlerinde, debug buildleri için sıkıntı yaşanmakta ve yukarıdaki ayarlar ile bu problemin üstesinden gelebilirsiniz. Bunu en alt seviyeye koyarsanız daha önceki target’lar için de geçerli olur. Tek bir proje için “PARENT_SCOPE” ibaresini kaldırabilirsiniz. Tabi ninja kullanırsanız, bunlar ile uğraşmanıza gerek kalmaz. Şimdi isterseniz buna değinelim.
Windows kurulum
Her ne kadar çeşitli kaynaklarda, ccache’in Windows üzerinde Visual Studio ile de kullanımı sağlandığı ifade edilse de ben bunun düzgün çalıştığını görmedim. O sebeple de windows üzerinde de ninja ile ccache’i kullandım. Ninja ile hem windows hem de linux üzerinde ccache’i başarılı bir şekilde kullanabilirsiniz.
Yukarıda da bahsettiğim gibi CCache’in windows için kurulumu ilgili çalıştırılabilir dosyanın basitçe kopyalanmasına dayanır.
Kurulum adımları:
- Öncelikle siteden ccache’i windows için indirin ve dizini bilgisayar içerisinde bir yere kopyalayın (burada C:\ altına kopyalandığı kabul edilecektir)
- Daha sonra bu dizini PATH ortam değişkenine ekleyin ve diğer kalemlerin üstünde olduğundan emin olun,
- Bir komut satırı açılarak
ccache --version
komutunun aşağıdaki gibi çıktı verdiğini kontrol edin- ccache –version
-
123456789101112131415ccache version 4.9.1Features: file-storage http-storage redis+unix-storage redis-storageCopyright (C) 2002-2007 Andrew TridgellCopyright (C) 2009-2024 Joel Rosdahl and other contributorsSee <https://ccache.dev/credits.html> for a complete list of contributors.This program is free software; you can redistribute it and/or modify it underthe terms of the GNU General Public License as published by the Free SoftwareFoundation; either version 3 of the License, or (at your option) any later version.
-
- ccache –version
-
- “ccache -s -v” komutu ile kurulan CCache’in kullandığı önemli dizinler ve arabellek doluluk oranı görülebilir
-
1234567891011Cache directory: C:\Users\yazilimperver\AppData\Local\ccacheConfig file: C:\Users\yazilimperver\AppData\Local\ccache\ccache.confSystem config file: C:\ProgramData\ccache\ccache.confStats updated: neverLocal storage:Cache size (GiB): 0.0 / 5.0 ( 0.00%)Files: 0Hits: 0Misses: 0Reads: 0Writes: 0
-
- “ccache -s -v” komutu ile kurulan CCache’in kullandığı önemli dizinler ve arabellek doluluk oranı görülebilir
CCache’in projenizi başarılı bir şekilde “cache” leyip “cache”lemediğini görmek için, projenizi build etmeden önce:
ccache -z
veccache -C
komutları ile CCache önbelleğini ve istatiskleri sıfırlayın,- Projenizi build edin,
ccache -s -v
komutunu çağırdığınızda aşağıdakine benzer bir çıktı göreceksiniz
-
-
123456789101112131415161718192021Cache directory: C:\Users\yazilimperver\AppData\Local\ccacheConfig file: C:\Users\yazilimperver\AppData\Local\ccache\ccache.confSystem config file: C:\ProgramData\ccache\ccache.confStats updated: 05/04/24 18:18:07Cacheable calls: 785 / 786 (99.87%)Hits: 0 / 785 ( 0.00%)Direct: 0Preprocessed: 0Misses: 785 / 785 (100.0%)Uncacheable calls: 1 / 786 ( 0.13%)Called for preprocessing: 1 / 1 (100.0%)Successful lookups:Direct: 0 / 785 ( 0.00%)Preprocessed: 0 / 785 ( 0.00%)Local storage:Cache size (GiB): 0.2 / 5.0 ( 3.36%)Files: 1566Hits: 0 / 785 ( 0.00%)Misses: 785 / 785 (100.0%)Reads: 1570Writes: 1570
- Yukarıdaki gibi “Cacheable calls” kısmı yüksek ise sizin için derleme süresinin kısalma miktarı da bu oranda fazla olacaktır,
- Eğer yukarıda “Uncacheable calls” kısmı yüksek ise bir problem olabilir. Aşağıdaki hususları kontrol etmekte fayda var:
-
-
-
- Windows ise yukarıda bahsettiğim, betiklerin eklendiğinden emin olun,
- Dosyaların ya da derleyicinin değişmediğinden emin olun,
- CCache ön belleğinin dolmadığından emin olun.
-
Şimdi gelelim fasulyenin faydalarına 🙂
uEngine4’ü Windowsta oluşturduğumda yaklaşık 56 saniye sürerken, ccache ile ikinci rebuild’te bu süre 6 saniyeye düştü ki, bu yaklaşık 6 kat hızlanma demek. Linux için de benzer değerleri göreceksiniz.
Yazımı bitirmeden önce ccache ile ilgili birkaç önemli komuta da değinmek istiyorum:
- “ccache -s” komutu
- Ön bellek kullanım miktarı
- “ccache -s -v” komutu
- Kurulan CCache’in kullandığı önemli dizinler ve arabellek doluluk oranı görülebilir
- “ccache -z” komutu
- İstatistikleri sıfırlar
- “ccache -C” komutu
- Ayarlar dışında kullanılan ön belleği sıfırlar
- CCache’i devreden çıkarmak için
- “CCACHE_DISABLE=1” olarak ayarlanabilir
Bu yazımızın da sonuna geldik. Bir sonraki yazımda görüşmek dileğiyle kendinize çok iyi bakın.