C++ ve Bazel

Sorun bildir Kaynağı görüntüle Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Bu sayfada, Bazel'i C++ projeleriyle kullanmanıza yardımcı olacak kaynaklar yer almaktadır. Bu kılavuzda, Bazel ile C++ projeleri oluşturmaya özgü bir eğiticinin, derleme kurallarının ve diğer bilgilerin bağlantıları yer alır.

Bazel ile çalışma

Aşağıdaki kaynaklar, C++ projelerinde Bazel ile çalışmanıza yardımcı olur:

En iyi uygulamalar

Genel Bazel en iyi uygulamalarına ek olarak, aşağıda C++ projelerine özel en iyi uygulamalar verilmiştir.

BUILD dosyaları

BUILD dosyalarınızı oluştururken aşağıdaki yönergeleri uygulayın:

  • Her BUILD dosyası, dizindeki derleme birimi başına bir cc_library kural hedefi içermelidir.

  • Artımlılığı en üst düzeye çıkarmak ve derlemeyi paralel hale getirmek için C++ kitaplıklarınızı mümkün olduğunca ayrıntılı hale getirmeniz gerekir.

  • srcs içinde tek bir kaynak dosya varsa kitaplığa bu C++ dosyasının adını verin. Bu kitaplık, C++ dosyalarını, eşleşen tüm üstbilgi dosyalarını ve kitaplığın doğrudan bağımlılıklarını içermelidir. Örneğin:

    cc_library(
        name = "mylib",
        srcs = ["mylib.cc"],
        hdrs = ["mylib.h"],
        deps = [":lower-level-lib"]
    )
    
  • Dosyadaki her cc_library hedefi için bir cc_test kural hedefi kullanın. Hedef [library-name]_test ve kaynak dosyayı [library-name]_test.cc adlandırın. Örneğin, yukarıda gösterilen mylib kitaplık hedefi için bir test hedefi şu şekilde görünür:

    cc_test(
        name = "mylib_test",
        srcs = ["mylib_test.cc"],
        deps = [":mylib"]
    )
    

Yolları dahil edin

İçerme yollarıyla ilgili aşağıdaki yönergeleri uygulayın:

  • Tüm include yollarını çalışma alanı dizinine göreli hale getirin.

  • Sistem başlıkları için köşeli parantez (#include <foo/bar/baz.h>) değil, tırnak işaretiyle belirtilmiş eklemeler (#include "foo/bar/baz.h") kullanın.

  • . (geçerli dizin) veya .. (üst dizin) gibi UNIX dizin kısayolları kullanmaktan kaçının.

  • Proje deposunun dışına işaret eden include'lar gerektiren eski veya third_party kod için (ör. önek gerektiren harici depo include'ları) cc_library kural hedefinde include_prefix ve strip_include_prefix bağımsız değişkenlerini kullanın.

Araç zinciri özellikleri

Aşağıdaki isteğe bağlı özellikler, C++ projesinin hijyenini iyileştirebilir. Bu kurallar, --features komut satırı işareti veya repo, package ya da cc_* kurallarının features özelliği kullanılarak etkinleştirilebilir:

  • parse_headers özelliği, --process_headers_in_dependencies işaretini kullanırken oluşturulan hedeflerdeki ve bağımlılıklarındaki tüm başlık dosyalarını ayrıştırmak (ancak derlemek değil) için C++ derleyicisinin kullanılmasını sağlar. Bu sayede, yalnızca başlık içeren kitaplıklardaki sorunları yakalayabilir ve başlıkların bağımsız olduğundan ve dahil edildikleri sıradan bağımsız olduğundan emin olabilirsiniz.
  • layering_check özelliği, hedeflerin yalnızca doğrudan bağımlılıkları tarafından sağlanan üstbilgileri içermesini zorunlu kılar. Varsayılan araç zinciri, derleyici olarak clang ile Linux'ta bu özelliği destekler.