Evet sevgili yazılımperver dostlarım uzun bir aradan sonra tekrar bir aradayız ve son kaldığımız yerden devam ediyoruz.
Nerede kalmıştık peki 🙂 Öncelikle, C++ ile SDL3 geliştirmeye yönelik hazırlamış olduğumuz cpp-playground reposunda, SDL3 tabanlı uygulamamızı
CMake kullanarak hem windows hem de linux’te nasıl derleyebileceğimize bakmıştık. Detaylar için aşağıdaki yazıya göz atabilirsiniz:
Bunu yaparken de, SDL kütüphanelerini tek tek indirip, oluşturmaya ilişkin adımları ve betikleri eklemiştik.
Bunlar, hem zaman alıcı hem de her seferinde yapmak çok zor oluyordu.
Artık bunu da Conan 2’ye geçirmenin vakti geldi. Bu yazımızda, bu geçişe bakıyor olacağız. Conan 2’ye yönelik hususlar için aşağıdaki yazıma göz atabilirsiniz:
[ARAÇ] Conan 2.0 – C++ Paket Yönetim Aracı
Conan 2’yi, uygulamalarda kullanmak oldukça kolay. Burada “conanfile.txt” hazırlayıp, daha sonra ilgili toolchain dosyalarını CMake preset dosyaları içerisine eklemeniz yeterli. Şimdi sırayla neler yaptığımıza göz atalım.
İlk olarak, conanfile.txt’yi oluşturduk. Bu dosya temelde, uygulamanın hangi paketlere ve sürümlerine ihtiyacı olduğunu söylüyor:
|
1 2 3 4 5 6 7 8 9 |
[requires] sdl/3.4.0 sdl_image/3.4.0 sdl_ttf/3.2.2 gtest/1.16.0 [generators] CMakeDeps CMakeToolchain |
Burada, tavsiye edilen genelde ilgili sürümü direk girmek, (ör. 3.4.0) bunula birlikte aralık da tanımlamanız mümkün. Yukarıdaki satırları girdikten sonra aşağıdaki komut ile ilgili paketleri yerel makinemize indiriyoruz. Conan’da yazılım oluşturma ilgili ayarları hizalamak için profiller kullanılmakta. Bu uygulama için özel bir profil hazırlamasak da, daha profesyonel ya da takım içeren durumlar için kendi profillerinizi oluşturmanızda fayda var. Sonraki yazılarımda, profil konusuna da detaylı eğileceğim. Şimdilik aşağıdaki komut ile halihazırdaki derleme aracını kullanıyor olacağız.
|
1 |
conan profile detect --force |
Tabi bu komutu çağırmadan önce, gerekli derleyicilerin, komut satırından erişebilir olduğundan emin olmalısınız. Windows için MSVC geliştirici komut satırını, linux için ise yine benzer şekilde g++/clang++’ı kurmuş ve c++ için ilgili derleyiciyi ayarlamış olmanız lazım. Buna yönelik İpucu Varsayılan Derleyici Değiştirme yazıma göz atabilirsiniz.
Bu komut ile artık, conan’ın varsayılan dizini altında (C:\Users\yazilimperver-dev\.conan2\profiles) default isimli bir dosya oluşmuş olacak. Benim için içeriği aşağıdaki gibi:
|
1 2 3 4 5 6 7 8 |
[settings] arch=x86_64 build_type=Release compiler=msvc compiler.cppstd=14 compiler.runtime=dynamic compiler.version=194 os=Windows |
Profilimize da baktıktan sonra, artık bu profil ile uyumlu bağımlılıkları indirebiliriz. Bu noktada Conan, conancenter’a bakıyor olacak ve bizim profil ile birebir uyumlu bir binary hazır var ise direk onu indirecek, yok ise yerel makinemizde bunu build ediyor olacak (profil ile ilgili yazımdan sonra burada hazırlayacağımız profiller ile tekrar tekrar build ettirmeden de kullanılabilecek bir noktaya geleceğiz).
|
1 |
conan install . --output-folder=build --build=missing -s build_type=Debug |
Bu komutu çağırdıktan sonra, conan, cmake için gerekli bağımlılıkları (CMakeDeps) ve derleyici ayarlarını (CMakeToolchain) kullabilmemiz için, bir toolchain dosyasını (conan_toolchain.cmake) build dizini altına oluşturur. Daha sonra bu dosyayı, CMake presetleri içerisine aşağıdaki gibi ekliyoruz:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
"configurePresets": [ { "name": "base", "hidden": true, "displayName": "base Configuration", "description": "Default build using Ninja generator", "generator": "Ninja", "binaryDir": "${sourceDir}/build/${presetName}", "installDir": "${sourceDir}/install/${presetName}", "cacheVariables": { "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "BUILD_SHARED_LIBS": "FALSE", "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/build/conan_toolchain.cmake", "CMAKE_POLICY_DEFAULT_CMP0091": "NEW" } }, { "name": "base-msvc", "hidden": true, "displayName": "Visual Studio Base Configuration", "description": "Default build using Visual Studio generator", "generator": "Visual Studio 17 2022", "binaryDir": "${sourceDir}/build/${presetName}", "installDir": "${sourceDir}/install/${presetName}", "cacheVariables": { "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "BUILD_SHARED_LIBS": "FALSE", "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/build/conan_toolchain.cmake", "CMAKE_POLICY_DEFAULT_CMP0091": "NEW" } }, |
bu adımdan sonra, bu presetleri miras alacak presetler de, bu toolchain dosyasını kullanıyor olacaklar.
Install işlemi biraz sürebilir. Burada bütün kütüphaneleri ve ilgili bağımlılıkları indiriyor olacak (SDL3 de oldukça büyük 🙂 )
Yerel makinenizde bunu bir kere yaptıktan sonra, artık her seferinde bunu tekrar tekrar oluşturmaya ihtiyaç kalmayacak.
Bu işlemler de bittikten sonra artık cmake konfigürasyon ve build adımlarına geçebiliriz. Bunlar için ise aşağıdaki komutları çağırmanız yeterli (Release build’ler için de debug’ları release ile değiştirmeniz yeterli):
|
1 2 3 4 5 |
cmake --preset debug-msvc cmake --build --preset build-debug-msvc # Linux için de aşağıdaki presetleri kullanabilirsiniz: build-debug-gcc, build-debug-clang |
Evet, bu adımlar sonrasında, artık yazılımın oluşturulmasına yönelik adımları tamamlamış oluyoruz.
Şimdi gelelim, gitlab CI/CD adımlarına. Bir önceki yazımda temel işlevleri tamamlamıştık ve linux için build adımlarını eklemiştik. Şimdi windows runner için de gerekli adımları ekleyerek, pipeline’ımızı tamamına erdireceğiz.
Aşağıda ilgili pipeline yaml dosyasını görebilirsiniz:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
workflow: rules: - if: $CI_PIPELINE_SOURCE == "web" - if: $CI_PIPELINE_SOURCE == "push" - if: $CI_PIPELINE_SOURCE == "merge_request_event" stages: - build - test variables: CONAN_HOME: "$CI_PROJECT_DIR/.conan2" # --- Windows Job --- build-windows: stage: build tags: - saas-windows-medium-amd64 variables: CC: "cl" CXX: "cl" # Conan cache dizinini proje klasörüne sabitle CONAN_HOME: "$CI_PROJECT_DIR\\.conan2" cache: key: "conan-win-$CI_COMMIT_REF_SLUG" paths: - .conan2/p/ timeout: 60 minutes before_script: - echo "Pipeline started by ${env:GITLAB_USER_NAME} / @${env:GITLAB_USER_LOGIN}" # ── vcvars64.bat'ı PS oturumuna aktar ──────────────────────────────── - | $vswhere = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" $vsPath = & $vswhere -latest -products * ` -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 ` -property installationPath $vcvars = Join-Path $vsPath "VC\Auxiliary\Build\vcvars64.bat" Write-Host "vcvars64.bat: $vcvars" $envDump = cmd /c "`"$vcvars`" amd64 && set" foreach ($line in $envDump) { if ($line -match '^([^=]+)=(.*)$') { [System.Environment]::SetEnvironmentVariable($matches[1], $matches[2], 'Process') } } # ── Conan kurulumu ───────────────────────────────────────────────── - pip install conan --quiet - if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - conan profile detect --force - conan profile show script: - echo "Cpp Playground started from Windows with Conan!" # Bağımlılıkları yükle - conan install . --output-folder=build --build=missing -s build_type=Release - if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } # CMake configure - cmake --preset release-msvc - if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } # Build - cmake --build --preset build-release-msvc - if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } artifacts: paths: - build/release-msvc/app/ - build/release-msvc/test/ expire_in: 3 days when: always # hata olsa da artifact'ı sakla — debug için faydalı # --- Linux Job --- build-linux: stage: build image: ubuntu:24.04 cache: key: "conan-linux" paths: - .conan2/p before_script: - apt-get update -y - apt-get install -y cmake ninja-build gcc g++ python3-pip git pkg-config sudo - pip install conan --break-system-packages - conan profile detect --force script: - echo "Cpp Playground started from Linux with Conan!" # Bağımlılıkları yükle. # -c tools.system.package_manager:mode=install: Eksik sistem paketlerini otomatik kurar # -c tools.system.package_manager:sudo=True: Kurulum için sudo yetkisini kullanır - conan install . --output-folder=build --build=missing -s build_type=Release -c tools.system.package_manager:mode=install -c tools.system.package_manager:sudo=True # Build (Preset kullanarak) - cmake --preset release-gcc - cmake --build --preset build-release-gcc artifacts: paths: - build/release-gcc/app/ - build/release-gcc/test/ expire_in: 1 hour # --- Test Job --- test-linux: stage: test image: ubuntu:24.04 dependencies: - build-linux script: - cd build/release-gcc/test - ./sdl3-example-app-test --gtest_output=xml:../../test-results.xml artifacts: when: always reports: junit: build/release-gcc/test-results.xml |
Windows için gerekli adımlar, build-windows job‘ı altında gerçekleştiriyoruz. Şimdilik hepsi tek bir adımda ve bir yerde. Sonraki adımlarda bunları da tekrar kullanılabilir hale getireceğiz.
Öncelikli olarak Conan’a dair paketleri ve ilgili dosyaları genelde, runner çalışma dizini altına oluşturulması önerilmektedir. Bunun için de CONAN_HOME ortam değişkenini tanımlamanız yeterli:
|
1 2 |
# Conan cache dizinini proje klasörüne sabitle CONAN_HOME: "$CI_PROJECT_DIR\\.conan2" |
C++ uygulamalarınız gitlab tarafından sunulan “saas-windows-medium-amd64” imajı içerisine kurulu MSBuild araçları ile oluşturabilirsiniz.
Bu araç içerisinde, Python ve CMake de kuruludur. CMake ile bunu kullanabilmek için öncelikle vcvars’ı çağırmamız gerekiyor. Aşağıda buna yönelik adımları bulabilirsiniz:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ── vcvars64.bat'ı PS oturumuna aktar ──────────────────────────────── - | $vswhere = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" $vsPath = & $vswhere -latest -products * ` -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 ` -property installationPath $vcvars = Join-Path $vsPath "VC\Auxiliary\Build\vcvars64.bat" Write-Host "vcvars64.bat: $vcvars" $envDump = cmd /c "`"$vcvars`" amd64 && set" foreach ($line in $envDump) { if ($line -match '^([^=]+)=(.*)$') { [System.Environment]::SetEnvironmentVariable($matches[1], $matches[2], 'Process') } } |
Bir sonraki adımda, Conan kurulumuna yönelik adımları görebilirsiniz:
|
1 2 3 4 5 |
# ── Conan kurulumu ───────────────────────────────────────────────── - pip install conan --quiet - if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - conan profile detect --force - conan profile show |
Son olarak da, yazılım oluşturma adımlarını gerçekleştiriyoruz. Burada da üç adım var:
|
1 2 3 |
- conan install - cmake konfigürasyon - cmake build |
Linux için gerekli adımları, build-linux job’ı altında gerçekleştiriyoruz. Çoğu adım windows’a benziyor. Kullandığımız imaj burada, ubuntu:24.04, bir de burada bağımlılıklarımızı da manuel olarak kuruyoruz.
İlgili yazılım oluşturma adımları sonrasında, test-linux job’ı ile birlikte, birim test projemizi oluşturup, sonuçları artifact olarak yayınlıyoruz.
Evet sevgili dostlar, yine yekünü çok olan bir yazımızın sonuna eriştik. Conan’ın kullanımına biraz daha aşinalık kazandığınızı umuyorum. Elbette müphem bir takım noktalar kalmış olabilir, bununla birlikte bunlar sizlerin ilave araştırmalarınız ile sizlere aşikar olacaktır. Öğrenmenin bence en güzel yollarından birisi de bu ya da çeto’yu da bu anlamda kullanabilirsiniz.
Bir sonraki yazımda görüşmek dileğiyle kendinize çok iyi bakın.
