C / C++ Kuralları

Sorun bildir Kaynağı görüntüle Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Kurallar

cc_binary

Kural kaynağını görüntüleme
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, exec_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

Çalıştırılabilen bir ikili dosya oluşturur.


Hedefin name değeri, uygulamanın ana giriş noktası olan kaynak dosyanın adıyla (uzantı hariç) aynı olmalıdır. Örneğin, giriş noktanız main.cc ise adınız main olmalıdır.

Örtülü çıkış hedefleri

  • name.stripped (yalnızca açıkça istenirse derlenir): İkili programın stripped sürümü. Hata ayıklama sembollerini kaldırmak için strip -g ikili program üzerinde çalıştırılır. --stripopt=-foo kullanılarak komut satırında ek şerit seçenekleri sağlanabilir.
  • name.dwp (yalnızca açıkça istenirse derlenir): Fission etkinse uzaktan dağıtılan ikili dosyalarda hata ayıklama için uygun bir hata ayıklama bilgileri paketi dosyası. Aksi takdirde: Boş bir dosya.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiketler listesi; varsayılan değer []'dir.

İkili hedefe bağlanacak diğer kitaplıkların listesi.

Bunlar cc_library veya objc_library hedefleri olabilir.

Bağlantılayıcı komut dosyalarının (.lds) bağımlılıklara yerleştirilmesine ve linkopts içinde bunlara referans verilmesine de izin verilir.
srcs

Etiketler listesi; varsayılan değer []'dir.

Kitaplık hedefi oluşturmak için işlenen C ve C++ dosyalarının listesi. Bunlar, oluşturulmamış (normal kaynak kod) veya oluşturulmuş C/C++ kaynak ve başlık dosyalarıdır.

Tüm .cc, .c ve .cpp dosyaları derlenir. Bunlar oluşturulmuş dosyalar olabilir: Adlandırılmış bir dosya başka bir kuralın outs içindeyse bu cc_library otomatik olarak söz konusu kurala bağlı olur.

Saf derleyici dosyaları (.s, .asm) önceden işlenmez ve genellikle derleyici kullanılarak oluşturulur. Önceden işlenmiş derleme dosyaları (.S), önceden işlenir ve genellikle C/C++ derleyicisi kullanılarak derlenir.

.h dosyası derlenmez ancak bu kuraldaki kaynaklar tarafından dahil edilebilir. Hem .cc hem de .h dosyaları, bu srcs dosyalarında veya bu kuralın hdrs dosyasında ya da deps bağımsız değişkeninde listelenen üstbilgileri doğrudan içerebilir.

Tüm #included dosyalarının bu veya referans verilen cc_library kurallarının hdrs özelliğinde belirtilmesi veya bu kitaplık için özelse srcs içinde listelenmeleri gerekir. Daha ayrıntılı bilgi için "Başlık dahil etme kontrolü" bölümüne bakın.

.so, .lo ve .a dosyaları önceden derlenmiş dosyalardır. Kaynak koduna sahip olmadığımız üçüncü taraf kodları kullanan kitaplığınızda bu kodlar srcs olarak görünebilir.

srcs özelliği başka bir kuralın etiketini içeriyorsa cc_library, derleme için kaynak dosya olarak söz konusu kuralın çıkış dosyalarını kullanır. Bu, tek seferlik kaynak kodu oluşturma için kullanışlıdır (Ara sıra kullanımdan daha fazlası için bir Starlark kural sınıfı uygulamak ve cc_common API'yi kullanmak daha iyidir)

İzin verilen srcs dosya türleri:

  • C ve C++ kaynak dosyaları: .c, .cc, .cpp, .cxx, .c++, .C
  • C ve C++ başlık dosyaları: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • C önişleyicili derleyici: .S
  • Arşiv: .a, .pic.a
  • "Her zaman bağla" kitaplığı: .lo, .pic.lo
  • Sürümlü veya sürümsüz paylaşılan kitaplık: .so, .so.version
  • Nesne dosyası: .o, .pic.o

... ve bu dosyaları oluşturan tüm kurallar (ör. cc_embed_data). Farklı uzantılar, gcc sözleşmesine uygun olarak farklı programlama dillerini gösterir.

data

Etiketler listesi; varsayılan değer []'dir.

Bu kitaplığın çalışma zamanında ihtiyaç duyduğu dosyaların listesi. data ile ilgili genel yorumları Çoğu derleme kuralı tarafından tanımlanan tipik özellikler bölümünde bulabilirsiniz.

data, oluşturulan bir dosyanın adıysa bu cc_library kuralı otomatik olarak oluşturma kuralına bağlıdır.

Bir data kural adıysa bu cc_library kuralı otomatik olarak bu kurala bağlıdır ve bu kuralın outs'leri otomatik olarak bu cc_library'un veri dosyalarına eklenir.

C++ kodunuz bu veri dosyalarına aşağıdaki gibi erişebilir:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

Etiketler listesi; varsayılan değer []'dir.

Bu dosyaları C++ bağlayıcı komutuna iletin.

Örneğin, derlenmiş Windows .res dosyaları, ikili hedefe yerleştirilmek üzere burada sağlanabilir.

conlyopts

Dize listesi; varsayılan değer []'tir.

Bu seçenekleri C derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu dize parçalarına ayırma işlemine tabidir.
copts

Dize listesi; varsayılan değer []'tir.

Bu seçenekleri C/C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu dize parçalarına ayırma işlemine tabidir.

Bu özellikteki her dize, ikili hedef derlenmeden önce COPTS alanına belirtilen sırayla eklenir. İşaretler yalnızca bu hedefin derlenmesi için geçerlidir, bağımlılıklarının derlenmesi için geçerli değildir. Bu nedenle, başka bir yere dahil edilen başlık dosyalarına dikkat edin. Tüm yollar mevcut pakete değil, çalışma alanına göre olmalıdır. Bu özelliğin third_party dışında kullanılması gerekmez.

Pakette özellik no_copts_tokenization tanımlanmışsa Bourne kabuğu jetonu yalnızca tek bir "Make" değişkeninden oluşan dizeler için geçerlidir.

cxxopts

Dize listesi; varsayılan değer []'tir.

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu dize parçalarına ayırma işlemine tabidir.
defines

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeni yerine koyma ve Bourne kabuğu dize oluşturma işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dize, -D ile başa eklenir ve bu hedefin derleme komut satırına ve ona bağlı her kurala eklenir. Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine local_defines için değer tanımlayın.
dynamic_deps

Etiketler listesi; varsayılan değer []'dir.

Bunlar, mevcut hedefin bağlı olduğu diğer cc_shared_library bağımlılıklarıdır.

cc_shared_library uygulaması, geçişli deps içindeki hangi cc_libraries öğelerinin farklı bir cc_shared_library tarafından zaten sağlandığı için bağlanmaması gerektiğine karar vermek üzere dynamic_deps listesini (geçişli olarak, yani mevcut hedefin dynamic_deps'sının dynamic_deps'si de) kullanır.

hdrs_check

Dize; varsayılan değer ""'tir

Desteği sonlandırıldı, işlemsiz.
includes

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek dahil dizinlerinin listesi. "Değişken yap" yerine koyma işlemine tabidir. Her dize, paket yolunun önüne eklenir ve "include_paths" CROSSTOOL özelliği aracılığıyla genişletilmek üzere C++ araç zincirine iletilir. Tipik özellik tanımlarına sahip bir POSIX sisteminde çalışan bir araç zinciri -isystem path_to_package/include_entry oluşturur. Bu, yalnızca #include ifadelerini yazma konusunda Google stilini kullanmayan üçüncü taraf kitaplıklar için kullanılmalıdır. COPTS'tan farklı olarak bu işaretler bu kural ve ona bağlı her kural için eklenir. (Not: Bu, bağlı olduğu kurallar değildir.) Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS alanına "-I" işaretleri ekleyin.

Eklenen include yolları, oluşturulan dosyaların yanı sıra kaynak ağaçtaki dosyaları da içerir.

Etiket; varsayılan değer "@bazel_tools//tools/cpp:link_extra_lib"'dir.

Ek kitaplıkların bağlanmasını kontrol edin.

Varsayılan olarak C++ ikili dosyaları, varsayılan olarak //tools/cpp:link_extra_libs etiket işaretine bağlı olan //tools/cpp:link_extra_lib ile bağlantılıdır. İşaretçi ayarlanmadığında bu kitaplık varsayılan olarak boştur. Etiket işaretini ayarlamak, zayıf semboller için geçersiz kılma işlemleri, paylaşılan kitaplık işlevleri için müdahaleciler veya özel çalışma zamanı kitaplıkları (malloc değişimleri için malloc veya --custom_malloc'yi tercih edin) gibi isteğe bağlı bağımlılıkların bağlanmasına olanak tanır. Bu özelliği None olarak ayarlamak bu davranışı devre dışı bırakır.

linkopts

Dize listesi; varsayılan değer []'tir.

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Make" değişkeni yerine koyma, Bourne kabuğu dize oluşturma ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS öğesine eklenir.

Bu listedeki $ veya - ile başlamayan her öğenin, deps'deki bir hedefin etiketi olduğu varsayılır. Söz konusu hedef tarafından oluşturulan dosyaların listesi, bağlayıcı seçeneklerine eklenir. Etiket geçersizse veya deps içinde beyan edilmemişse hata bildirilir.

linkshared

Boole; varsayılan değer False'tir

Paylaşılan kitaplık oluşturma. Bu özelliği etkinleştirmek için kuralınıza linkshared=True ekleyin. Bu seçenek varsayılan olarak kapalıdır.

Bu işaretin varlığı, -shared işaretinin gcc ile bağlantı kurduğunu ve ortaya çıkan paylaşılan kitaplığın örneğin bir Java programına yüklenmesi için uygun olduğunu gösterir. Ancak cc_binary kuralıyla oluşturulan paylaşılan kitaplıkların yalnızca diğer programlar tarafından manuel olarak yüklendiği varsayıldığından, derleme amacıyla hiçbir zaman bağımlı ikili dosyaya bağlanmaz. Bu nedenle, cc_library kuralının yerine geçmez. Ölçeklenebilirlik açısından bu yaklaşımdan tamamen kaçınmanızı ve java_library'ün cc_library kurallarına bağlı olmasını öneririz.

Hem linkopts=['-static'] hem de linkshared=True öğesini belirtirseniz tamamen kendi kendine yeten tek bir birim elde edersiniz. Hem linkstatic=True hem de linkshared=True'yi belirtirseniz çoğunlukla kendi kendine yeten tek bir birim elde edersiniz.

linkstatic

Boole; varsayılan değer True'tir

cc_binary ve cc_test için: İkiliyi statik modda bağlayın. cc_library.link_static için: Aşağıya bakın.

Bu seçenek varsayılan olarak cc_binary için açık, geri kalanı için kapalıdır.

Etkinse ve bu bir ikili dosya veya testse bu seçenek, derleme aracına mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a bağlamasını söyler. libc gibi sistem kitaplıkları (ancak C/C++ çalışma zamanı kitaplıkları dahil değildir, aşağıya bakın) ve statik kitaplığı olmayan kitaplıklar hâlâ dinamik olarak bağlanır. Bu nedenle, ortaya çıkan yürütülebilir dosya dinamik olarak bağlı olmaya devam eder ve bu nedenle yalnızca çoğunlukla statiktir.

Bir yürütülebilir dosyayı bağlamanın üç farklı yolu vardır:

  • Her şeyin statik olarak bağlandığı fully_static_link özelliğiyle STATIC (ör. "gcc -static foo.o libbar.a libbaz.a -lm").
    Bu mod, features özelliğinde fully_static_link belirtilerek etkinleştirilir.
  • STATIC: Tüm kullanıcı kitaplıklarının statik olarak bağlandığı (statik bir sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı (ör. "gcc foo.o libfoo.a libbaz.a -lm") moddur.
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DYNAMIC (dinamik sürüm mevcutsa) örn. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False belirtilerek etkinleştirilir.

features içindeki linkstatic özelliği veya fully_static_link, //third_party dışında kullanılıyorsa lütfen nedenini açıklamak için kuralın yanına bir yorum ekleyin.

linkstatic özelliği, cc_library() kuralında kullanılıyorsa farklı bir anlama sahiptir. C++ kitaplığında linkstatic=True, yalnızca statik bağlantıya izin verildiğini belirtir. Bu nedenle .so oluşturulmaz. linkstatic=False, statik kitaplıkların oluşturulmasını engellemez. Bu özellik, dinamik kitaplıkların oluşturulmasını kontrol etmek için kullanılır.

Üretimde linkstatic=False ile oluşturulmuş çok az kod olmalıdır. Değer linkstatic=False ise derleme aracı, *.runfiles alanındaki bağımlı paylaşılan kitaplıklar için sembolik bağlantılar oluşturur.

local_defines

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeni yerine koyma ve Bourne kabuğu dize oluşturma işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dize, -D ile başa eklenir ve bu hedefin derleme komut satırına eklenir ancak bağımlılarına eklenmez.
malloc

Etiket; varsayılan değer "@bazel_tools//tools/cpp:malloc"'dir.

malloc'a olan varsayılan bağımlılığı geçersiz kılın.

Varsayılan olarak C++ ikili dosyaları //tools/cpp:malloc ile bağlanır. Bu kitaplık boş olduğundan ikili dosya sonunda libc malloc'i kullanır. Bu etiket bir cc_library'ye atıfta bulunmalıdır. Derleme C++ dışı bir kural içinse bu seçeneğin hiçbir etkisi olmaz. linkshared=True belirtilirse bu özelliğin değeri yoksayılır.

module_interfaces

Etiketler listesi; varsayılan değer []'dir.

Dosya listesi, C++20 Modülleri Arayüzü olarak kabul edilir.

C++ Standard, modül arayüzü dosya uzantısı konusunda herhangi bir kısıtlamaya tabi değildir.

  • Clang cppm kullanır
  • GCC, herhangi bir kaynak dosyası uzantısını kullanabilir
  • MSVC ixx kullan

Kullanım, --experimental_cpp_modules işaretiyle korunur.

nocopts

Dize; varsayılan değer ""'tir

Eşleşen seçenekleri C++ derleme komutundan kaldırın. "Make" değişkeni yerine getirilebilir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden mevcut olan tüm COPTS (kuralın copts özelliğinde açıkça belirtilen değerler dahil) bu kuralı derlemek amacıyla COPTS'ten kaldırılır. Bu özelliğin third_party dışında kullanılmasına veya gerekli olmasına gerek yoktur. Değerler, "Make" değişkeni yerine koyma işlemi dışında hiçbir şekilde önceden işlenmez.
reexport_deps

Etiketler listesi; varsayılan değer []'dir.

stamp

Tam sayı; varsayılan değer -1'tür

Derleme bilgilerinin ikili dosyaya kodlanıp kodlanmayacağı. Olası değerler:
  • stamp = 1: --nostamp derlemelerinde bile derleme bilgilerini her zaman ikili dosyaya damgalayın. İkili dosya ve ona bağlı tüm yayın sonrası işlemler için uzaktan önbelleğe alma işlemini potansiyel olarak sonlandırdığından bu ayardan kaçınılmalıdır.
  • stamp = 0: Derleme bilgilerini her zaman sabit değerlerle değiştirin. Bu, iyi bir derleme sonucu önbelleğe alma sağlar.
  • stamp = -1: Derleme bilgilerinin yerleştirilmesi, --[no]stamp işareti tarafından kontrol edilir.

Damgalanmış ikili dosyalar, bağımlılıkları değişmediği sürece yeniden oluşturulmaz.

win_def_file

Etiket; varsayılan değer None'dir.

Bağlantı oluşturucuya iletilecek Windows DEF dosyası.

Bu özellik yalnızca hedef platform Windows olduğunda kullanılmalıdır. Paylaşılan bir kitaplığı bağlarken simgeleri dışa aktarmak için kullanılabilir.

cc_import

Kural kaynağını görüntüleme
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)

cc_import kuralları, kullanıcıların önceden derlenmiş C/C++ kitaplıklarını içe aktarmasına olanak tanır.

Tipik kullanım alanları şunlardır:
1. Statik kitaplık bağlama


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = 1,
)
2. Paylaşılan kitaplık bağlama (Unix)

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Paylaşılan kitaplığı arayüz kitaplığına bağlama

Unix'te:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # libmylib.ifso is an interface library for libmylib.so which will be passed to linker
  interface_library = "libmylib.ifso",
  # libmylib.so will be available for runtime
  shared_library = "libmylib.so",
)

Windows'da:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. Paylaşılan bir kitaplığı system_provided=True ile bağlama

Unix'te:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
  # libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
  # This indicates that Bazel is not responsible for making libmylib.so available.
  system_provided = 1,
)

Windows'da:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
5. Statik veya paylaşılan kitaplığa bağlantı verme

Unix'te:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

Windows'da:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

Geri kalan işlemler Unix ve Windows'ta aynıdır:


# first will link to libmylib.a (or libmylib.lib)
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so (or libmylib.lib)
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)

cc_import, dahil et özelliğini destekler. Örneğin:


cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = ["vendor/curl/include"],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiketler listesi; varsayılan değer []'dir.

Hedefin bağımlı olduğu diğer kitaplıkların listesi. deps ile ilgili genel yorumları Çoğu derleme kuralı tarafından tanımlanan tipik özellikler bölümünde bulabilirsiniz.
hdrs

Etiketler listesi; varsayılan değer []'dir.

Bu önceden derlenmiş kitaplık tarafından yayınlanan ve kaynaklar tarafından bağımlı kurallara doğrudan dahil edilecek başlık dosyalarının listesi.

Boole; varsayılan değer False'tir

1 ise bu C++ önceden derlenmiş kitaplığa (doğrudan veya dolaylı olarak) bağımlı olan tüm ikili dosyalar, bazılarında ikili dosya tarafından referans verilen simge olmasa bile statik kitaplıkta arşivlenen tüm nesne dosyalarını bağlar. Bu, kodunuz ikili programdaki kod tarafından açıkça çağrılmıyorsa (ör. kodunuz bir hizmet tarafından sağlanan geri çağırma işlevini almak için kaydoluyorsa) kullanışlıdır.

alwayslink, Windows'daki VS 2017 ile çalışmıyorsa bunun nedeni bilinen bir sorundur. Lütfen VS 2017'nizi en son sürüme yükseltin.

includes

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek dahil dizinlerinin listesi. "Değişken yap" yerine koyma işlemine tabidir. Her dize, paket yolunun önüne eklenir ve "include_paths" CROSSTOOL özelliği aracılığıyla genişletilmek üzere C++ araç zincirine iletilir. Tipik özellik tanımlarına sahip bir POSIX sisteminde çalışan bir araç zinciri -isystem path_to_package/include_entry oluşturur. Bu, yalnızca #include ifadelerini yazma konusunda Google stilini kullanmayan üçüncü taraf kitaplıklar için kullanılmalıdır. COPTS'tan farklı olarak bu işaretler bu kural ve ona bağlı her kural için eklenir. (Not: Bu, bağlı olduğu kurallar değildir.) Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS alanına "-I" işaretleri ekleyin.

Varsayılan include yolu, oluşturulan dosyaları içermez. Oluşturulan bir başlık dosyasını #include yapmanız gerekiyorsa srcs içinde listeleyin.

interface_library

Etiket; varsayılan değer None'dir.

Paylaşılan kitaplığı bağlamak için tek bir arayüz kitaplığı.

İzin verilen dosya türleri: .ifso, .tbd, .lib, .so veya .dylib

linkopts

Dize listesi; varsayılan değer []'tir.

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Make" değişkeni yerine koyma, Bourne kabuğu dize oluşturma ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS öğesine eklenir.

Bu listedeki $ veya - ile başlamayan her öğenin, deps'deki bir hedefin etiketi olduğu varsayılır. Söz konusu hedef tarafından oluşturulan dosyaların listesi, bağlayıcı seçeneklerine eklenir. Etiket geçersizse veya deps içinde tanımlanmamışsa hata bildirilir.

objects

Etiketler listesi; varsayılan değer []'dir.

pic_objects

Etiketler listesi; varsayılan değer []'dir.

pic_static_library

Etiket; varsayılan değer None'dir.

shared_library

Etiket; varsayılan değer None'dir.

Tek bir önceden derlenmiş paylaşılan kitaplık. Bazel, çalışma zamanında kendisine bağlı olan ikili dosyanın bu ikili dosyaya erişebilmesini sağlar.

İzin verilen dosya türleri: .so, .dll veya .dylib

static_library

Etiket; varsayılan değer None'dir.

Tek bir önceden derlenmiş statik kitaplık.

İzin verilen dosya türleri: .a, .pic.a veya .lib

system_provided

Boole; varsayılan değer False'tir

1 ise çalışma zamanında gerekli olan paylaşılan kitaplığın sistem tarafından sağlandığını gösterir. Bu durumda interface_library belirtilmeli ve shared_library boş bırakılmalıdır.

cc_library

Kural kaynağını görüntüleme
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

C++ derlenmiş kitaplıklar için cc_library() kullanın. Sonuç, gerekene bağlı olarak .so, .lo veya .a olur.

Statik bağlantıyla bir cc_library'e bağlı bir öğe oluşturursanız bağlı kitaplık kuralının çıkışı .a dosyasıdır. alwayslink=True değerini belirtirseniz .lo dosyasını alırsınız.

Gerçek çıkış dosyası adı, ortak kitaplık için libfoo.so olur. Burada foo, kuralın adıdır. Diğer kitaplık türleri sırasıyla .lo ve .a ile biter. Belirli bir paylaşılan kitaplık adına ihtiyacınız varsa (ör. bir Python modülü tanımlamak için) kitaplığı istediğiniz ada kopyalamak üzere bir genrule kullanın.

Başlık dahil etme kontrolü

Derlemede kullanılan tüm başlık dosyaları, cc_* kurallarının hdrs veya srcs bölümünde bildirilmelidir. Bu kural zorunlu kılındı.

cc_library kurallarında, hdrs içindeki başlıklar kitaplığın herkese açık arayüzünü içerir ve hem kitaplığın kendi hdrs ve srcs dosyalarından hem de cc_* kurallarının deps dosyalarındaki kitaplığı listeleyen hdrs ve srcs dosyalarından doğrudan eklenebilir. srcs içindeki başlıklar yalnızca kitaplığın hdrs ve srcs içindeki dosyalardan doğrudan eklenmelidir. hdrs veya srcs içine başlık ekleyip eklemeyeceğinize karar verirken bu kitaplığın tüketicilerinin bu başlığı doğrudan ekleyebilmesini isteyip istemediğinizi sormanız gerekir. Bu, programlama dillerinde public ve private görünürlüğü arasında karar vermekle yaklaşık olarak aynıdır.

cc_binary ve cc_test kurallarının dışa aktarılan bir arayüzü olmadığından hdrs özellikleri de yoktur. Doğrudan ikili dosyaya veya teste ait tüm üstbilgiler srcs içinde listelenmelidir.

Bu kuralları açıklamak için aşağıdaki örneğe bakın.


cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

Bu örnekte izin verilen doğrudan dahil etme işlemleri aşağıdaki tabloda listelenmiştir. Örneğin, foo.cc'ün foo.h ve bar.h'yi doğrudan dahil etmesine izin verilir ancak baz.h'e izin verilmez.

Dosya dahilİzin verilen dahil etme işlemleri
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

Dahil etme denetimi kuralları yalnızca doğrudan dahil etme işlemleri için geçerlidir. Yukarıdaki örnekte foo.cc'ün bar.h içermesine izin verilir. bar.h, baz.h içerebilir. baz.h ise baz-impl.h içerebilir. Teknik olarak, bir .cc dosyasının derlemesi, deps kapatma işleminde bulunan herhangi bir cc_library içindeki hdrs veya srcs içindeki herhangi bir başlık dosyasını aktarmalı olarak içerebilir. Bu durumda derleyici, foo.cc'yi derlerken baz.h ve baz-impl.h'ü okuyabilir ancak foo.cc, #include "baz.h" içermemelidir. Buna izin verilebilmesi için baz, foo'nin deps alanına eklenmelidir.

Bazel, dahil etme kontrol kurallarını uygulamak için araç zinciri desteğine ihtiyaç duyar. layering_check özelliğinin araç zinciri tarafından desteklenmesi ve açıkça istenmesi (örneğin, --features=layering_check komut satırı işareti veya package işlevinin features parametresi aracılığıyla) gerekir. Bazel tarafından sağlanan araç zincirleri bu özelliği yalnızca Unix ve macOS'te clang ile destekler.

Örnekler


cc_library(
    name = "ast_inspector_lib",
    srcs = ["ast_inspector_lib.cc"],
    hdrs = ["ast_inspector_lib.h"],
    visibility = ["//visibility:public"],
    deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
    # alwayslink as we want to be able to call things in this library at
    # debug time, even if they aren't used anywhere in the code.
    alwayslink = 1,
)

Aşağıdaki örnek, third_party/python2_4_3/BUILD sitesinden alınmıştır. Kodun bir kısmı dl kitaplığını kullanır (başka bir dinamik kitaplık yüklemek için). Bu nedenle bu kural, dl kitaplığını bağlamak için -ldl bağlantı seçeneğini belirtir.


cc_library(
    name = "python2_4_3",
    linkopts = [
        "-ldl",
        "-lutil",
    ],
    deps = ["//third_party/expat"],
)

Aşağıdaki örnek third_party/kde/BUILD'ten alınmıştır. Hazır .so dosyalarını depoda tutarız. Başlık dosyaları, include adlı bir alt dizinde bulunur.


cc_library(
    name = "kde",
    srcs = [
        "lib/libDCOP.so",
        "lib/libkdesu.so",
        "lib/libkhtml.so",
        "lib/libkparts.so",
        ...more .so files...,
    ],
    includes = ["include"],
    deps = ["//third_party/X11"],
)

Aşağıdaki örnek third_party/gles/BUILD'ten alınmıştır. Üçüncü taraf kodunun genellikle bazı defines ve linkopts öğelerine ihtiyacı vardır.


cc_library(
    name = "gles",
    srcs = [
        "GLES/egl.h",
        "GLES/gl.h",
        "ddx.c",
        "egl.c",
    ],
    defines = [
        "USE_FLOAT",
        "__GL_FLOAT",
        "__GL_COMMON",
    ],
    linkopts = ["-ldl"],  # uses dlopen(), dl library
    deps = [
        "es",
        "//third_party/X11",
    ],
)

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiketler listesi; varsayılan değer []'dir.

Kitaplık hedefine bağlı diğer kitaplıkların listesi.

Bunlar cc_library veya objc_library hedefleri olabilir.

deps ile ilgili genel yorumları Çoğu derleme kuralı tarafından tanımlanan tipik özellikler bölümünde bulabilirsiniz.

Bunlar, C++ kitaplık kurallarının adları olmalıdır. Bu kuralın kitaplığını bağlayan bir ikili dosyası oluşturduğunuzda, deps içindeki kitaplıkları da bağlarsınız.

"deps" adına rağmen bu kitaplığın tüm istemcileri buraya ait değildir. Çalışma zamanındaki veri bağımlılıkları data'e aittir. Diğer kurallar tarafından oluşturulan kaynak dosyalar srcs klasörüne aittir.

Önceden derlenmiş bir üçüncü taraf kitaplığını bağlamak için srcs yerine kitabın adını ekleyin.

Bir öğeyi bu kitaplığa bağlamadan bağımlı hale getirmek için data alanına öğenin adını ekleyin.

srcs

Etiketler listesi; varsayılan değer []'dir.

Kitaplık hedefi oluşturmak için işlenen C ve C++ dosyalarının listesi. Bunlar, oluşturulmamış (normal kaynak kod) veya oluşturulmuş C/C++ kaynak ve başlık dosyalarıdır.

Tüm .cc, .c ve .cpp dosyaları derlenir. Bunlar oluşturulmuş dosyalar olabilir: Adlandırılmış bir dosya başka bir kuralın outs içindeyse bu cc_library otomatik olarak söz konusu kurala bağlı olur.

Saf derleyici dosyaları (.s, .asm) önceden işlenmez ve genellikle derleyici kullanılarak oluşturulur. Önceden işlenmiş derleme dosyaları (.S), önceden işlenir ve genellikle C/C++ derleyicisi kullanılarak derlenir.

.h dosyası derlenmez ancak bu kuraldaki kaynaklar tarafından dahil edilebilir. Hem .cc hem de .h dosyaları, bu srcs dosyalarında veya bu kuralın hdrs dosyasında ya da deps bağımsız değişkeninde listelenen üstbilgileri doğrudan içerebilir.

Tüm #included dosyalarının bu veya referans verilen cc_library kurallarının hdrs özelliğinde belirtilmesi veya bu kitaplık için özelse srcs içinde listelenmeleri gerekir. Daha ayrıntılı bilgi için "Başlık dahil etme kontrolü" bölümüne bakın.

.so, .lo ve .a dosyaları önceden derlenmiş dosyalardır. Kaynak koduna sahip olmadığımız üçüncü taraf kodları kullanan kitaplığınızda bu kodlar srcs olarak görünebilir.

srcs özelliği başka bir kuralın etiketini içeriyorsa cc_library, derleme için kaynak dosya olarak söz konusu kuralın çıkış dosyalarını kullanır. Bu, tek seferlik kaynak kodu oluşturma için kullanışlıdır (Ara sıra kullanımdan daha fazlası için bir Starlark kural sınıfı uygulamak ve cc_common API'yi kullanmak daha iyidir)

İzin verilen srcs dosya türleri:

  • C ve C++ kaynak dosyaları: .c, .cc, .cpp, .cxx, .c++, .C
  • C ve C++ başlık dosyaları: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • C önişleyicili derleyici: .S
  • Arşiv: .a, .pic.a
  • "Her zaman bağla" kitaplığı: .lo, .pic.lo
  • Sürümlü veya sürümsüz paylaşılan kitaplık: .so, .so.version
  • Nesne dosyası: .o, .pic.o

... ve bu dosyaları oluşturan tüm kurallar (ör. cc_embed_data). Farklı uzantılar, gcc sözleşmesine uygun olarak farklı programlama dillerini gösterir.

data

Etiketler listesi; varsayılan değer []'dir.

Bu kitaplığın çalışma zamanında ihtiyaç duyduğu dosyaların listesi. data ile ilgili genel yorumları Çoğu derleme kuralı tarafından tanımlanan tipik özellikler bölümünde bulabilirsiniz.

data, oluşturulan bir dosyanın adıysa bu cc_library kuralı otomatik olarak oluşturma kuralına bağlıdır.

Bir data kural adıysa bu cc_library kuralı otomatik olarak bu kurala bağlıdır ve bu kuralın outs'leri otomatik olarak bu cc_library'un veri dosyalarına eklenir.

C++ kodunuz bu veri dosyalarına aşağıdaki gibi erişebilir:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
hdrs

Etiketler listesi; varsayılan değer []'dir.

Bu kitaplık tarafından yayınlanan ve kaynaklar tarafından bağımlı kurallara doğrudan dahil edilecek başlık dosyalarının listesi.

Kitaplığın arayüzünü tanımlayan başlık dosyalarını bildirmek için tercih edilen konum budur. Bu üstbilgiler, bu kuraldaki veya bağımlı kurallardaki kaynaklar tarafından dahil edilmek üzere kullanıma sunulur. Bu kitaplığın bir müşterisi tarafından dahil edilmemesi amaçlanan üstbilgiler, yayınlanmış bir üstbilgi tarafından dahil edilse bile srcs özelliğinde listelenmelidir. Daha ayrıntılı bilgi için "Başlık dahil etme kontrolü" bölümüne bakın.

İzin verilen headers dosya türleri: .h, .hh, .hpp, .hxx.

additional_compiler_inputs

Etiketler listesi; varsayılan değer []'dir.

Derleyici komut satırına iletmek istediğiniz ek dosyalar (ör. temizleyici yoksayın listeleri). Burada belirtilen dosyalar daha sonra $(location) işleviyle copts içinde kullanılabilir.
additional_linker_inputs

Etiketler listesi; varsayılan değer []'dir.

Bu dosyaları C++ bağlayıcı komutuna iletin.

Örneğin, derlenmiş Windows .res dosyaları, ikili hedefe yerleştirilmek üzere burada sağlanabilir.

Boole; varsayılan değer False'tir

1 ise bu C++ kitaplığına (doğrudan veya dolaylı olarak) bağlı olan tüm ikili dosyalar, srcs listesinde belirtilen dosyaların tüm nesne dosyalarını bağlar (bazılarında ikili dosya tarafından referans verilen simge olmasa bile). Bu, kodunuz ikili programdaki kod tarafından açıkça çağrılmıyorsa (ör. kodunuz bir hizmet tarafından sağlanan geri çağırma işlevini almak için kaydoluyorsa) kullanışlıdır.

alwayslink, Windows'daki VS 2017 ile çalışmıyorsa bunun nedeni bilinen bir sorundur. Lütfen VS 2017'nizi en son sürüme yükseltin.

conlyopts

Dize listesi; varsayılan değer []'tir.

Bu seçenekleri C derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu dize parçalarına ayırma işlemine tabidir.
copts

Dize listesi; varsayılan değer []'tir.

Bu seçenekleri C/C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu dize parçalarına ayırma işlemine tabidir.

Bu özellikteki her dize, ikili hedef derlenmeden önce COPTS alanına belirtilen sırayla eklenir. İşaretler yalnızca bu hedefin derlenmesi için geçerlidir, bağımlılıklarının derlenmesi için geçerli değildir. Bu nedenle, başka bir yere dahil edilen başlık dosyalarına dikkat edin. Tüm yollar mevcut pakete değil, çalışma alanına göre olmalıdır. Bu özelliğin third_party dışında kullanılması gerekmez.

Pakette özellik no_copts_tokenization tanımlanmışsa Bourne kabuğu jetonu yalnızca tek bir "Make" değişkeninden oluşan dizeler için geçerlidir.

cxxopts

Dize listesi; varsayılan değer []'tir.

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu dize parçalarına ayırma işlemine tabidir.
defines

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeni yerine koyma ve Bourne kabuğu dize oluşturma işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dize, -D ile başa eklenir ve bu hedefin derleme komut satırına ve ona bağlı her kurala eklenir. Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine local_defines için değer tanımlayın.
hdrs_check

Dize; varsayılan değer ""'tir

Desteği sonlandırıldı, işlemsiz.
implementation_deps

Etiketler listesi; varsayılan değer []'dir.

Kitaplık hedefine bağlı diğer kitaplıkların listesi. deps'tekilerin aksine, bu kitaplıkların üstbilgileri ve dahil etme yolları (ve tüm geçişli bağımlılıkları) yalnızca bu kitaplığın derlenmesi için kullanılır, kendisine bağlı kitaplıklar için kullanılmaz. implementation_deps ile belirtilen kitaplıklar, bu kitaplığa bağlı olan ikili hedeflerde hâlâ bağlıdır.
include_prefix

Dize; varsayılan değer ""'tir

Bu kuralın üstbilgilerinin yollarına eklenecek ön ek.

Bu kuralın hdrs özelliğindeki üstbilgilerin erişilebilir olması için bu özelliğin değerinin, depoya göre yollarının başına eklenmesi gerekir.

Bu ön ek eklenmeden önce strip_include_prefix özelliğindeki ön ek kaldırılır.

Bu özellik yalnızca third_party kapsamında yasaldır.

includes

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek dahil dizinlerinin listesi. "Değişken yap" yerine koyma işlemine tabidir. Her dize, paket yolunun önüne eklenir ve "include_paths" CROSSTOOL özelliği aracılığıyla genişletilmek üzere C++ araç zincirine iletilir. Tipik özellik tanımlarına sahip bir POSIX sisteminde çalışan bir araç zinciri -isystem path_to_package/include_entry oluşturur. Bu, yalnızca #include ifadelerini yazma konusunda Google stilini kullanmayan üçüncü taraf kitaplıklar için kullanılmalıdır. COPTS'tan farklı olarak bu işaretler bu kural ve ona bağlı her kural için eklenir. (Not: Bu, bağlı olduğu kurallar değildir.) Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS alanına "-I" işaretleri ekleyin.

Eklenen include yolları, oluşturulan dosyaların yanı sıra kaynak ağaçtaki dosyaları da içerir.

linkopts

Dize listesi; varsayılan değer []'tir.

cc_binary.linkopts adresine göz atın. linkopts özelliği, deps özellikleri aracılığıyla (veya benzer şekilde ele alınan diğer özellikler aracılığıyla: cc_binary'in malloc özelliği) doğrudan veya dolaylı olarak bu kitaplığa bağımlı olan tüm hedeflere de uygulanır. Bağımlılık bağlantı seçenekleri, bağımlı bağlantı seçeneklerine göre önceliklidir (yani bağımlı bağlantı seçenekleri komut satırında daha sonra görünür). --linkopt bölümünde belirtilen bağlantı seçenekleri, kural bağlantı seçeneklerine göre önceliklidir.

linkopts özelliğinin yalnızca .so dosyaları veya yürütülebilir dosyalar oluştururken geçerli olduğunu, .a veya .lo dosyaları oluştururken geçerli olmadığını unutmayın. Dolayısıyla, linkstatic=True özelliği ayarlanmışsa linkopts özelliği bu kitaplığın oluşturulması üzerinde hiçbir etkiye sahip değildir. Yalnızca bu kitaplığa bağlı diğer hedefleri etkiler.

Ayrıca, "-Wl,-soname" veya "-Xlinker -soname" seçeneklerinin desteklenmediğini ve bu özellikte hiçbir zaman belirtilmemesi gerektiğini unutmayın.

cc_library kuralları tarafından oluşturulan .so dosyaları, bağlı oldukları kitaplıklara bağlı değildir. Ana deponun dışında kullanılmak üzere (ör. dlopen() veya LD_PRELOAD ile manuel kullanım için) paylaşılan bir kitaplık oluşturmaya çalışıyorsanız linkshared=True özelliğiyle bir cc_binary kuralı kullanmak daha iyi olabilir. cc_binary.linkshared adresine göz atın.

linkstamp

Etiket; varsayılan değer None'dir.

Belirtilen C++ kaynak dosyasını aynı anda derleyip nihai ikili dosyaya bağlar. Bu hile, zaman damgası bilgilerini ikili dosyalar içine yerleştirmek için gereklidir. Kaynak dosyayı normal şekilde bir nesne dosyasına derleyirsek zaman damgası yanlış olur. Bağlantı damgası derlemesi belirli bir derleyici işareti grubu içermeyebilir ve bu nedenle belirli bir üstbilgi, derleyici seçeneği veya başka bir derleme değişkenine bağlı olmamalıdır. Bu seçeneğe yalnızca base paketinde ihtiyaç duyulur.
linkstatic

Boole; varsayılan değer False'tir

cc_binary ve cc_test için: İkiliyi statik modda bağlayın. cc_library.link_static için: Aşağıya bakın.

Bu seçenek varsayılan olarak cc_binary için açık, geri kalanı için kapalıdır.

Etkinse ve bu bir ikili dosya veya testse bu seçenek, derleme aracına mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a bağlamasını söyler. libc gibi sistem kitaplıkları (ancak C/C++ çalışma zamanı kitaplıkları dahil değildir, aşağıya bakın) ve statik kitaplığı olmayan kitaplıklar hâlâ dinamik olarak bağlanır. Bu nedenle, ortaya çıkan yürütülebilir dosya dinamik olarak bağlı olmaya devam eder ve bu nedenle yalnızca çoğunlukla statiktir.

Bir yürütülebilir dosyayı bağlamanın üç farklı yolu vardır:

  • Her şeyin statik olarak bağlandığı fully_static_link özelliğiyle STATIC (ör. "gcc -static foo.o libbar.a libbaz.a -lm").
    Bu mod, features özelliğinde fully_static_link belirtilerek etkinleştirilir.
  • STATIC: Tüm kullanıcı kitaplıklarının statik olarak bağlandığı (statik bir sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı (ör. "gcc foo.o libfoo.a libbaz.a -lm") moddur.
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DYNAMIC (dinamik sürüm mevcutsa) örn. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False belirtilerek etkinleştirilir.

features içindeki linkstatic özelliği veya fully_static_link, //third_party dışında kullanılıyorsa lütfen nedenini açıklamak için kuralın yanına bir yorum ekleyin.

linkstatic özelliği, cc_library() kuralında kullanılıyorsa farklı bir anlama sahiptir. C++ kitaplığında linkstatic=True, yalnızca statik bağlantıya izin verildiğini belirtir. Bu nedenle .so oluşturulmaz. linkstatic=False, statik kitaplıkların oluşturulmasını engellemez. Bu özellik, dinamik kitaplıkların oluşturulmasını kontrol etmek için kullanılır.

Üretimde linkstatic=False ile oluşturulmuş çok az kod olmalıdır. Değer linkstatic=False ise derleme aracı, *.runfiles alanındaki bağımlı paylaşılan kitaplıklar için sembolik bağlantılar oluşturur.

local_defines

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeni yerine koyma ve Bourne kabuğu dize oluşturma işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dize, -D ile başa eklenir ve bu hedefin derleme komut satırına eklenir ancak bağımlılarına eklenmez.
module_interfaces

Etiketler listesi; varsayılan değer []'dir.

Dosya listesi, C++20 Modülleri Arayüzü olarak kabul edilir.

C++ Standard, modül arayüzü dosya uzantısı konusunda herhangi bir kısıtlamaya tabi değildir.

  • Clang cppm kullanır
  • GCC, herhangi bir kaynak dosyası uzantısını kullanabilir
  • MSVC ixx kullan

Kullanım, --experimental_cpp_modules işaretiyle korunur.

strip_include_prefix

Dize; varsayılan değer ""'tir

Bu kuralın üstbilgilerinin yollarından kaldırılacak ön ek.

Ayarlandığında, bu kuralın hdrs özelliğindeki üstbilgilerin yoluna bu ön ek eklenmeden erişilebilir.

Göreli bir yolsa pakete göreli bir yol olarak alınır. Mutlak bir yol ise depoya göreli yol olarak anlaşılır.

include_prefix özelliğindeki ön ek, bu ön ek kaldırıldıktan sonra eklenir.

Bu özellik yalnızca third_party kapsamında yasaldır.

textual_hdrs

Etiketler listesi; varsayılan değer []'dir.

Bu kitaplık tarafından yayınlanan ve kaynaklar tarafından bağımlı kurallara metinsel olarak dahil edilecek başlık dosyalarının listesi.

Bu, tek başına derlenemeyen başlık dosyalarının tanımlandığı yerdir. Yani geçerli kod oluşturmak için her zaman diğer kaynak dosyalar tarafından metinsel olarak eklenmesi gerekir.

win_def_file

Etiket; varsayılan değer None'dir.

Bağlantı oluşturucuya iletilecek Windows DEF dosyası.

Bu özellik yalnızca hedef platform Windows olduğunda kullanılmalıdır. Paylaşılan bir kitaplığı bağlarken simgeleri dışa aktarmak için kullanılabilir.

cc_shared_library

Kural kaynağını görüntüleme
cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)

Paylaşılan bir kitaplık oluşturur.

Örnek

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

Örnekte foo_shared, foo ve baz'yi statik olarak bağlar. baz, geçişli bir bağımlılıktır. dynamic_dep bar_shared tarafından zaten dinamik olarak sağlandığı için bar bağlantısı eklenmez.

foo_shared, hangi sembollerin dışa aktarılacağını kontrol etmek için bir bağlayıcı komut dosyası *.lds dosyası kullanır. cc_shared_library kural mantığı, hangi sembollerin dışa aktarılacağını kontrol etmez. Yalnızca iki paylaşılan kitaplık aynı hedefleri dışa aktarırsa analiz aşamasında hata vermek için dışa aktarıldığı varsayılan öğeleri kullanır.

cc_shared_library'ün her doğrudan bağımlılığının dışa aktarıldığı varsayılır. Bu nedenle Bazel, analiz sırasında foo'in foo_shared tarafından dışa aktarıldığını varsayar. baz, foo_shared tarafından dışa aktarıldığı varsayılmaz. exports_filter ile eşleşen her hedefin de dışa aktarıldığı varsayılır.

Örnekteki her cc_library en fazla bir cc_shared_library içinde görünmelidir. bazbar_shared'a da bağlamak isteseydik tags = ["LINKABLE_MORE_THAN_ONCE"]'yi baz'e eklememiz gerekirdi.

shared_lib_name özelliği nedeniyle, bar_shared tarafından üretilen dosyanın adı Linux'da varsayılan olarak libbar.so yerine bar.so olur.

Hatalar

Two shared libraries in dependencies export the same symbols.

Bu durum, aynı hedefi dışa aktaran iki farklı cc_shared_library bağımlılığı olan bir hedef oluşturduğunuzda ortaya çıkar. Bu sorunu düzeltmek için kitaplıkların cc_shared_library bağımlılıkları arasından birinde dışa aktarılmasını durdurmanız gerekir.

Bu durum, aynı hedefi statik olarak bağlayan iki farklı cc_shared_library bağımlılığı olan yeni bir cc_shared_library oluşturduğunuzda ortaya çıkar. Dışa aktarma işlemiyle ilgili hataya benzer.

Bu sorunu düzeltmenin bir yolu, kitaplığı cc_shared_library bağımlılıkları arasından birine bağlamayı durdurmaktır. Aynı zamanda, kitaplığı hâlâ bağlayan kullanıcının kitaplığı dışa aktarması gerekir. Böylece, kitaplığı bağlamayan kullanıcı simgelere erişmeye devam edebilir. Hedefi dışa aktaran üçüncü bir kitaplık da kullanabilirsiniz. Üçüncü yöntem, soruna neden olan cc_library öğesini LINKABLE_MORE_THAN_ONCE ile etiketlemektir. Ancak bu düzeltme nadiren kullanılmalıdır ve cc_library öğesinin birden fazla kez bağlantı vermenin güvenli olduğundan emin olmanız gerekir.

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

Bu, deps'ün geçişli kapatma kapsamındaki bir kitaplığa cc_shared_library bağımlılıkları kullanmadan erişilebildiği ancak dynamic_deps'de farklı bir cc_shared_library'a bağlı olduğu ve dışa aktarılmadığı anlamına gelir.

Çözüm, cc_shared_library bağımlılığından dışa aktarmak veya dışa aktaran üçüncü bir cc_shared_library'ü kullanmaktır.

Do not place libraries which only contain a precompiled dynamic library in deps.

Önceden derlenmiş bir dinamik kitaplığınız varsa bu kitaplığın, şu anda oluşturduğunuz mevcut cc_shared_library hedefine statik olarak bağlanması gerekmez ve bağlanamaz. Bu nedenle, cc_shared_library'un deps bölümüne ait değildir. Bu önceden derlenmiş dinamik kitaplık, cc_libraries'lerinizden birinin bağımlılığıysa cc_library'ın doğrudan bu kitaplığa bağımlı olması gerekir.

Trying to export a library already exported by a different shared library

Mevcut kuralda, dinamik bağımlılıklarınızdan biri tarafından zaten dışa aktarılan bir hedefi dışa aktardığınızı iddia ediyorsanız bu hatayı görürsünüz.

Bunu düzeltmek için hedefi deps'ten kaldırın ve dinamik bağımlılıktan yararlanın veya exports_filter'ın bu hedefi yakalamadığından emin olun.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiketler listesi; varsayılan değer []'dir.

Tam olarak arşivlendikten sonra koşulsuz olarak paylaşılan kitaplığa statik olarak bağlanacak üst düzey kitaplıklar.

Bu doğrudan bağımlılıkların geçişli kitaplık bağımlılıkları, dynamic_deps'daki bir cc_shared_library tarafından bağlanmadığı sürece bu paylaşılan kitaplığa bağlanır.

Analiz sırasında kural uygulaması, birden fazla cc_shared_libraries aynı hedefleri dışa aktardığında hata vermek için deps içinde listelenen tüm hedefleri paylaşılan kitaplık tarafından dışa aktarılmış olarak kabul eder. Kural uygulaması, bağlayıcıyı paylaşılan nesne tarafından hangi sembollerin dışa aktarılması gerektiği konusunda bilgilendirmez. Kullanıcı, kaynak koddaki bağlayıcı komut dosyaları veya görünürlük beyanları aracılığıyla bu konuyla ilgilenmelidir.

Aynı kitaplık birden fazla cc_shared_library'e statik olarak bağlandığında da uygulama hataları tetikler. Bu durum, "LINKABLE_MORE_THAN_ONCE" öğesini cc_library.tags öğesine ekleyerek veya "cc_library" öğesini paylaşılan kitaplıklardan birinin dışa aktarması olarak listeleyerek önlenebilir. Böylece, bir kitaplık diğerinin dynamic_dep öğesi haline getirilebilir.

additional_linker_inputs

Etiketler listesi; varsayılan değer []'dir.

Bağlantılayıcıya iletmek istediğiniz ek dosyalar (ör. bağlantılayıcı komut dosyaları). Bağlantılayıcının bu dosyayı bilmesi için ihtiyaç duyduğu tüm bağlantılayıcı işaretlerini ayrı olarak iletmeniz gerekir. Bunu user_link_flags özelliği aracılığıyla yapabilirsiniz.
dynamic_deps

Etiketler listesi; varsayılan değer []'dir.

Bunlar, mevcut hedefin bağlı olduğu diğer cc_shared_library bağımlılıklarıdır.

cc_shared_library uygulaması, geçişli deps içindeki hangi cc_libraries öğelerinin farklı bir cc_shared_library tarafından zaten sağlandığı için bağlanmaması gerektiğine karar vermek üzere dynamic_deps listesini (geçişli olarak, yani mevcut hedefin dynamic_deps'sının dynamic_deps'si de) kullanır.

experimental_disable_topo_sort_do_not_use_remove_before_7_0

Boole; varsayılan değer False'tir

exports_filter

Dize listesi; varsayılan değer []'tir.

Bu özellik, mevcut paylaşılan kitaplık tarafından dışa aktarıldığı iddia edilen hedeflerin listesini içerir.

Paylaşılan kitaplık tarafından dışa aktarıldığı anlaşılan tüm hedefler deps. Bu özellik, paylaşılan kitaplık tarafından dışa aktarılan ancak deps'ün geçişli bağımlılıkları olan tüm hedefleri listelemek için kullanılmalıdır.

Bu özelliğin aslında bu hedeflere bir bağımlılık kenarı eklemediğini, bunun yerine bağımlılık kenarının deps tarafından oluşturulması gerektiğini unutmayın.Bu özellikteki girişler yalnızca dizelerdir. Bu özelliğe bir hedef yerleştirdiğinizde, paylaşılan kitaplığın bu hedefteki sembolleri dışa aktardığına dair bir hak talebinde bulunmuş olursunuz. cc_shared_library mantığı, aslında bağlayıcıya hangi simgelerin dışa aktarılması gerektiğini söylemez.

Aşağıdaki söz dizimine izin verilir:

foo/BUILD'deki tüm hedefleri hesaba katmak için //foo:__pkg__

foo/BUILD veya foo/ altındaki diğer paketlerdeki (ör. foo/bar/BUILD) tüm hedefleri hesaba katmak için //foo:__subpackages__

roots

Etiketler listesi; varsayılan değer []'dir.

shared_lib_name

Dize; varsayılan değer ""'tir

Varsayılan olarak cc_shared_library, ortak kitaplık çıkış dosyası için hedefin adına ve platforma göre bir ad kullanır. Buna uzantı ve bazen de önek dahildir. Bazen varsayılan adı istemeyebilirsiniz. Örneğin, Python için C++ paylaşılan kitaplıklarını yüklerken varsayılan lib* ön eki genellikle istenmez. Bu durumda, özel bir ad seçmek için bu özelliği kullanabilirsiniz.
static_deps

Dize listesi; varsayılan değer []'tir.

Dize listesi; varsayılan değer []'tir.

Bağlantı oluşturucuya iletmek isteyebileceğiniz ek işaretler. Örneğin, bağlayıcıyı additional_linker_inputs aracılığıyla iletilen bir bağlayıcı komut dosyasından haberdar etmek için aşağıdakileri kullanabilirsiniz:

 cc_shared_library(
    name = "foo_shared",
    additional_linker_inputs = select({
      "//src/conditions:linux": [
        ":foo.lds",
        ":additional_script.txt",
      ],
      "//conditions:default": []}),
    user_link_flags = select({
      "//src/conditions:linux": [
        "-Wl,-rpath,kittens",
        "-Wl,--version-script=$(location :foo.lds)",
        "-Wl,--script=$(location :additional_script.txt)",
      ],
      "//conditions:default": []}),
      ...
 )
win_def_file

Etiket; varsayılan değer None'dir.

Bağlantı oluşturucuya iletilecek Windows DEF dosyası.

Bu özellik yalnızca hedef platform Windows olduğunda kullanılmalıdır. Paylaşılan bir kitaplığı bağlarken simgeleri dışa aktarmak için kullanılabilir.

cc_static_library

Kural kaynağını görüntüleme
cc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Bu kural şu anda deneyseldir ve yalnızca --experimental_cc_static_library işaretiyle kullanılabilir. Hedeflerin ve bunların geçişli bağımlılıklarının listesinden statik bir kitaplık oluşturur.

Elde edilen statik kitaplık, deps içinde listelenen hedeflerin nesne dosyalarını ve geçişli bağımlılıklarını içerir. Bu işlemde PIC nesnelerine öncelik verilir.

Çıkış grupları

linkdeps

deps içinde listelenen ve statik kitaplığa herhangi bir nesne dosyası sağlamayan ancak en az bir statik, dinamik veya arayüz kitaplığı sağlayan hedeflerin geçişli bağımlılıklarının etiketlerini içeren bir metin dosyası. Elde edilen statik kitaplık için bu kitaplıkların bağlantı sırasında mevcut olması gerekebilir.

linkopts

deps dosyasında listelenen hedeflerin tüm geçişli bağımlılıklarının kullanıcı tarafından sağlanan linkopts dosyasını içeren bir metin dosyası.

Yinelenen simgeler

Varsayılan olarak cc_static_library kuralı, oluşturulan statik kitaplığın yinelenen simge içermediğini kontrol eder. Bu durumda derleme, yinelenen simgeleri ve bunları içeren nesne dosyalarını listeleyen bir hata mesajıyla başarısız olur.

Bu kontrol, features = ["-symbol_check"] ayarlanarak hedef veya paket başına veya --features=-symbol_check aracılığıyla dünya genelinde devre dışı bırakılabilir.

symbol_check için araç seti desteği

Bazel ile birlikte gönderilen otomatik olarak yapılandırılan C++ araç zincirleri, symbol_check özelliğini tüm platformlarda destekler. Özel araç zincirleri, iki yöntemden biriyle bu sürüme destek ekleyebilir:

  • ACTION_NAMES.validate_static_library işlemini uygulama ve symbol_check özelliğiyle etkinleştirme. İşlemde ayarlanan araç, iki bağımsız değişkenle çağrılır: yinelenen sembolleri kontrol edecek statik kitaplık ve kontrol başarılı olursa oluşturulması gereken dosyanın yolu.
  • symbol_check özelliğinin, arşivleyici işaretleri eklemesi, statik kitaplığı oluşturan işlemin yinelenen simgelerde başarısız olmasına neden olur.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiketler listesi; varsayılan değer []'dir.

Tüm geçişli bağımlılıkları dahil olmak üzere statik bir kitaplıkta birleştirilecek hedeflerin listesi.

Nesne dosyası sağlamayan bağımlılıklar statik kitaplığa dahil edilmez ancak etiketleri linkdeps çıkış grubu tarafından sağlanan dosyada toplanır.

cc_test

Kural kaynağını görüntüleme
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

cc_test() kuralı bir testi derleyebilir. Burada test, bazı test kodlarının etrafına yerleştirilmiş bir ikili sarmalayıcıdır.

C++ testleri varsayılan olarak dinamik olarak bağlanır.
Bir birim testini statik olarak bağlamak için linkstatic=True değerini belirtin. Testinizin neden linkstatic'ye ihtiyaç duyduğunu açıklamanız faydalı olabilir.

Örtülü çıkış hedefleri

  • name.stripped (yalnızca açıkça istenirse derlenir): İkili programın stripped sürümü. Hata ayıklama sembollerini kaldırmak için strip -g ikili program üzerinde çalıştırılır. --stripopt=-foo kullanılarak komut satırında ek şerit seçenekleri sağlanabilir.
  • name.dwp (yalnızca açıkça istenirse derlenir): Fission etkinse uzaktan dağıtılan ikili dosyalarda hata ayıklama için uygun bir hata ayıklama bilgileri paketi dosyası. Aksi takdirde: Boş bir dosya.

cc_binary() bağımsız değişkenlerine bakın. Bununla birlikte, stamp bağımsız değişkeni testler için varsayılan olarak 0 olarak ayarlanır ve cc_test bağımsız değişkeninde tüm test kurallarında ortak olan ek özellikler (*_test) bulunur.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiketler listesi; varsayılan değer []'dir.

İkili hedefe bağlanacak diğer kitaplıkların listesi.

Bunlar cc_library veya objc_library hedefleri olabilir.

Bağlantılayıcı komut dosyalarının (.lds) bağımlılıklara yerleştirilmesine ve linkopts içinde bunlara referans verilmesine de izin verilir.
srcs

Etiketler listesi; varsayılan değer []'dir.

Kitaplık hedefi oluşturmak için işlenen C ve C++ dosyalarının listesi. Bunlar, oluşturulmamış (normal kaynak kod) veya oluşturulmuş C/C++ kaynak ve başlık dosyalarıdır.

Tüm .cc, .c ve .cpp dosyaları derlenir. Bunlar oluşturulmuş dosyalar olabilir: Adlandırılmış bir dosya başka bir kuralın outs içindeyse bu cc_library otomatik olarak söz konusu kurala bağlı olur.

Saf derleyici dosyaları (.s, .asm) önceden işlenmez ve genellikle derleyici kullanılarak oluşturulur. Önceden işlenmiş derleme dosyaları (.S), önceden işlenir ve genellikle C/C++ derleyicisi kullanılarak derlenir.

.h dosyası derlenmez ancak bu kuraldaki kaynaklar tarafından dahil edilebilir. Hem .cc hem de .h dosyaları, bu srcs dosyalarında veya bu kuralın hdrs dosyasında ya da deps bağımsız değişkeninde listelenen üstbilgileri doğrudan içerebilir.

Tüm #included dosyalarının bu veya referans verilen cc_library kurallarının hdrs özelliğinde belirtilmesi veya bu kitaplık için özelse srcs içinde listelenmeleri gerekir. Daha ayrıntılı bilgi için "Başlık dahil etme kontrolü" bölümüne bakın.

.so, .lo ve .a dosyaları önceden derlenmiş dosyalardır. Kaynak koduna sahip olmadığımız üçüncü taraf kodları kullanan kitaplığınızda bu kodlar srcs olarak görünebilir.

srcs özelliği başka bir kuralın etiketini içeriyorsa cc_library, derleme için kaynak dosya olarak söz konusu kuralın çıkış dosyalarını kullanır. Bu, tek seferlik kaynak kodu oluşturma için kullanışlıdır (Ara sıra kullanımdan daha fazlası için bir Starlark kural sınıfı uygulamak ve cc_common API'yi kullanmak daha iyidir)

İzin verilen srcs dosya türleri:

  • C ve C++ kaynak dosyaları: .c, .cc, .cpp, .cxx, .c++, .C
  • C ve C++ başlık dosyaları: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • C önişleyicili derleyici: .S
  • Arşiv: .a, .pic.a
  • "Her zaman bağla" kitaplığı: .lo, .pic.lo
  • Sürümlü veya sürümsüz paylaşılan kitaplık: .so, .so.version
  • Nesne dosyası: .o, .pic.o

... ve bu dosyaları oluşturan tüm kurallar (ör. cc_embed_data). Farklı uzantılar, gcc sözleşmesine uygun olarak farklı programlama dillerini gösterir.

data

Etiketler listesi; varsayılan değer []'dir.

Bu kitaplığın çalışma zamanında ihtiyaç duyduğu dosyaların listesi. data ile ilgili genel yorumları Çoğu derleme kuralı tarafından tanımlanan tipik özellikler bölümünde bulabilirsiniz.

data, oluşturulan bir dosyanın adıysa bu cc_library kuralı otomatik olarak oluşturma kuralına bağlıdır.

Bir data kural adıysa bu cc_library kuralı otomatik olarak bu kurala bağlıdır ve bu kuralın outs'leri otomatik olarak bu cc_library'un veri dosyalarına eklenir.

C++ kodunuz bu veri dosyalarına aşağıdaki gibi erişebilir:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

Etiketler listesi; varsayılan değer []'dir.

Bu dosyaları C++ bağlayıcı komutuna iletin.

Örneğin, derlenmiş Windows .res dosyaları, ikili hedefe yerleştirilmek üzere burada sağlanabilir.

conlyopts

Dize listesi; varsayılan değer []'tir.

Bu seçenekleri C derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu dize parçalarına ayırma işlemine tabidir.
copts

Dize listesi; varsayılan değer []'tir.

Bu seçenekleri C/C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu dize parçalarına ayırma işlemine tabidir.

Bu özellikteki her dize, ikili hedef derlenmeden önce COPTS alanına belirtilen sırayla eklenir. İşaretler yalnızca bu hedefin derlenmesi için geçerlidir, bağımlılıklarının derlenmesi için geçerli değildir. Bu nedenle, başka bir yere dahil edilen başlık dosyalarına dikkat edin. Tüm yollar mevcut pakete değil, çalışma alanına göre olmalıdır. Bu özelliğin third_party dışında kullanılması gerekmez.

Pakette özellik no_copts_tokenization tanımlanmışsa Bourne kabuğu jetonu yalnızca tek bir "Make" değişkeninden oluşan dizeler için geçerlidir.

cxxopts

Dize listesi; varsayılan değer []'tir.

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu dize parçalarına ayırma işlemine tabidir.
defines

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeni yerine koyma ve Bourne kabuğu dize oluşturma işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dize, -D ile başa eklenir ve bu hedefin derleme komut satırına ve ona bağlı her kurala eklenir. Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine local_defines için değer tanımlayın.
dynamic_deps

Etiketler listesi; varsayılan değer []'dir.

Bunlar, mevcut hedefin bağlı olduğu diğer cc_shared_library bağımlılıklarıdır.

cc_shared_library uygulaması, geçişli deps içindeki hangi cc_libraries öğelerinin farklı bir cc_shared_library tarafından zaten sağlandığı için bağlanmaması gerektiğine karar vermek üzere dynamic_deps listesini (geçişli olarak, yani mevcut hedefin dynamic_deps'sının dynamic_deps'si de) kullanır.

hdrs_check

Dize; varsayılan değer ""'tir

Desteği sonlandırıldı, işlemsiz.
includes

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek dahil dizinlerinin listesi. "Değişken yap" yerine koyma işlemine tabidir. Her dize, paket yolunun önüne eklenir ve "include_paths" CROSSTOOL özelliği aracılığıyla genişletilmek üzere C++ araç zincirine iletilir. Tipik özellik tanımlarına sahip bir POSIX sisteminde çalışan bir araç zinciri -isystem path_to_package/include_entry oluşturur. Bu, yalnızca #include ifadelerini yazma konusunda Google stilini kullanmayan üçüncü taraf kitaplıklar için kullanılmalıdır. COPTS'tan farklı olarak bu işaretler bu kural ve ona bağlı her kural için eklenir. (Not: Bu, bağlı olduğu kurallar değildir.) Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS alanına "-I" işaretleri ekleyin.

Eklenen include yolları, oluşturulan dosyaların yanı sıra kaynak ağaçtaki dosyaları da içerir.

Etiket; varsayılan değer "@bazel_tools//tools/cpp:link_extra_lib"'dir.

Ek kitaplıkların bağlanmasını kontrol edin.

Varsayılan olarak C++ ikili dosyaları, varsayılan olarak //tools/cpp:link_extra_libs etiket işaretine bağlı olan //tools/cpp:link_extra_lib ile bağlantılıdır. İşaretçi ayarlanmadığında bu kitaplık varsayılan olarak boştur. Etiket işaretini ayarlamak, zayıf semboller için geçersiz kılma işlemleri, paylaşılan kitaplık işlevleri için müdahaleciler veya özel çalışma zamanı kitaplıkları (malloc değişimleri için malloc veya --custom_malloc'yi tercih edin) gibi isteğe bağlı bağımlılıkların bağlanmasına olanak tanır. Bu özelliği None olarak ayarlamak bu davranışı devre dışı bırakır.

linkopts

Dize listesi; varsayılan değer []'tir.

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Make" değişkeni yerine koyma, Bourne kabuğu dize oluşturma ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS öğesine eklenir.

Bu listedeki $ veya - ile başlamayan her öğenin, deps'deki bir hedefin etiketi olduğu varsayılır. Söz konusu hedef tarafından oluşturulan dosyaların listesi, bağlayıcı seçeneklerine eklenir. Etiket geçersizse veya deps içinde beyan edilmemişse hata bildirilir.

linkshared

Boole; varsayılan değer False'tir

Paylaşılan kitaplık oluşturma. Bu özelliği etkinleştirmek için kuralınıza linkshared=True ekleyin. Bu seçenek varsayılan olarak kapalıdır.

Bu işaretin varlığı, -shared işaretinin gcc ile bağlantı kurduğunu ve ortaya çıkan paylaşılan kitaplığın örneğin bir Java programına yüklenmesi için uygun olduğunu gösterir. Ancak cc_binary kuralıyla oluşturulan paylaşılan kitaplıkların yalnızca diğer programlar tarafından manuel olarak yüklendiği varsayıldığından, derleme amacıyla hiçbir zaman bağımlı ikili dosyaya bağlanmaz. Bu nedenle, cc_library kuralının yerine geçmez. Ölçeklenebilirlik açısından bu yaklaşımdan tamamen kaçınmanızı ve java_library'ün cc_library kurallarına bağlı olmasını öneririz.

Hem linkopts=['-static'] hem de linkshared=True öğesini belirtirseniz tamamen kendi kendine yeten tek bir birim elde edersiniz. Hem linkstatic=True hem de linkshared=True'yi belirtirseniz çoğunlukla kendi kendine yeten tek bir birim elde edersiniz.

linkstatic

Boole; varsayılan değer False'tir

cc_binary ve cc_test için: İkiliyi statik modda bağlayın. cc_library.link_static için: Aşağıya bakın.

Bu seçenek varsayılan olarak cc_binary için açık, geri kalanı için kapalıdır.

Etkinse ve bu bir ikili dosya veya testse bu seçenek, derleme aracına mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a bağlamasını söyler. libc gibi sistem kitaplıkları (ancak C/C++ çalışma zamanı kitaplıkları dahil değildir, aşağıya bakın) ve statik kitaplığı olmayan kitaplıklar hâlâ dinamik olarak bağlanır. Bu nedenle, ortaya çıkan yürütülebilir dosya dinamik olarak bağlı olmaya devam eder ve bu nedenle yalnızca çoğunlukla statiktir.

Bir yürütülebilir dosyayı bağlamanın üç farklı yolu vardır:

  • Her şeyin statik olarak bağlandığı fully_static_link özelliğiyle STATIC (ör. "gcc -static foo.o libbar.a libbaz.a -lm").
    Bu mod, features özelliğinde fully_static_link belirtilerek etkinleştirilir.
  • STATIC: Tüm kullanıcı kitaplıklarının statik olarak bağlandığı (statik bir sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı (ör. "gcc foo.o libfoo.a libbaz.a -lm") moddur.
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DYNAMIC (dinamik sürüm mevcutsa) örn. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False belirtilerek etkinleştirilir.

features içindeki linkstatic özelliği veya fully_static_link, //third_party dışında kullanılıyorsa lütfen nedenini açıklamak için kuralın yanına bir yorum ekleyin.

linkstatic özelliği, cc_library() kuralında kullanılıyorsa farklı bir anlama sahiptir. C++ kitaplığında linkstatic=True, yalnızca statik bağlantıya izin verildiğini belirtir. Bu nedenle .so oluşturulmaz. linkstatic=False, statik kitaplıkların oluşturulmasını engellemez. Bu özellik, dinamik kitaplıkların oluşturulmasını kontrol etmek için kullanılır.

Üretimde linkstatic=False ile oluşturulmuş çok az kod olmalıdır. Değer linkstatic=False ise derleme aracı, *.runfiles alanındaki bağımlı paylaşılan kitaplıklar için sembolik bağlantılar oluşturur.

local_defines

Dize listesi; varsayılan değer []'tir.

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeni yerine koyma ve Bourne kabuğu dize oluşturma işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dize, -D ile başa eklenir ve bu hedefin derleme komut satırına eklenir ancak bağımlılarına eklenmez.
malloc

Etiket; varsayılan değer "@bazel_tools//tools/cpp:malloc"'dir.

malloc'a olan varsayılan bağımlılığı geçersiz kılın.

Varsayılan olarak C++ ikili dosyaları //tools/cpp:malloc ile bağlanır. Bu kitaplık boş olduğundan ikili dosya sonunda libc malloc'i kullanır. Bu etiket bir cc_library'ye atıfta bulunmalıdır. Derleme C++ dışı bir kural içinse bu seçeneğin hiçbir etkisi olmaz. linkshared=True belirtilirse bu özelliğin değeri yoksayılır.

module_interfaces

Etiketler listesi; varsayılan değer []'dir.

Dosya listesi, C++20 Modülleri Arayüzü olarak kabul edilir.

C++ Standard, modül arayüzü dosya uzantısı konusunda herhangi bir kısıtlamaya tabi değildir.

  • Clang cppm kullanır
  • GCC, herhangi bir kaynak dosyası uzantısını kullanabilir
  • MSVC ixx kullan

Kullanım, --experimental_cpp_modules işaretiyle korunur.

nocopts

Dize; varsayılan değer ""'tir

Eşleşen seçenekleri C++ derleme komutundan kaldırın. "Make" değişkeni yerine getirilebilir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden mevcut olan tüm COPTS (kuralın copts özelliğinde açıkça belirtilen değerler dahil) bu kuralı derlemek amacıyla COPTS'ten kaldırılır. Bu özelliğin third_party dışında kullanılmasına veya gerekli olmasına gerek yoktur. Değerler, "Make" değişkeni yerine koyma işlemi dışında hiçbir şekilde önceden işlenmez.
reexport_deps

Etiketler listesi; varsayılan değer []'dir.

stamp

Tam sayı; varsayılan değer 0'tür

Derleme bilgilerinin ikili dosyaya kodlanıp kodlanmayacağı. Olası değerler:
  • stamp = 1: --nostamp derlemelerinde bile derleme bilgilerini her zaman ikili dosyaya damgalayın. İkili dosya ve ona bağlı tüm yayın sonrası işlemler için uzaktan önbelleğe alma işlemini potansiyel olarak sonlandırdığından bu ayardan kaçınılmalıdır.
  • stamp = 0: Derleme bilgilerini her zaman sabit değerlerle değiştirin. Bu, iyi bir derleme sonucu önbelleğe alma sağlar.
  • stamp = -1: Derleme bilgilerinin yerleştirilmesi, --[no]stamp işareti tarafından kontrol edilir.

Damgalanmış ikili dosyalar, bağımlılıkları değişmediği sürece yeniden oluşturulmaz.

win_def_file

Etiket; varsayılan değer None'dir.

Bağlantı oluşturucuya iletilecek Windows DEF dosyası.

Bu özellik yalnızca hedef platform Windows olduğunda kullanılmalıdır. Paylaşılan bir kitaplığı bağlarken simgeleri dışa aktarmak için kullanılabilir.

cc_toolchain

Kural kaynağını görüntüleme
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

C++ araç zincirini temsil eder.

Bu kural aşağıdakilerden sorumludur:

  • C++ işlemlerinin çalıştırılması için gereken tüm yapıları toplama. Bu, all_files, compiler_files, linker_files veya _files ile biten diğer özellikler gibi özelliklerle yapılır. Bunlar genellikle gerekli tüm dosyaları gruplandıran dosya gruplarıdır.
  • C++ işlemleri için doğru komut satırlarını oluşturma. Bu işlem, CcToolchainConfigInfo sağlayıcısı kullanılarak yapılır (ayrıntılar aşağıda verilmiştir).

C++ araç zincirini yapılandırmak için toolchain_config özelliğini kullanın. Ayrıntılı C++ araç zinciri yapılandırması ve araç zinciri seçim dokümanları için bu sayfada da bilgi bulabilirsiniz.

bazel build //... çağrılırken araç zincirlerinin gereksiz yere oluşturulmasını ve yapılandırılmasını önlemek için tags = ["manual"] kullanın

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

all_files

Etiket; zorunlu

Tüm cc_toolchain yapılarının koleksiyonu. Bu yapı taşları, rules_cc ile ilgili tüm işlemlere giriş olarak eklenir (aşağıdaki özelliklerden daha hassas yapı taşı kümeleri kullanan işlemler hariç). Bazel, all_files'ün diğer tüm yapı sağlayıcı özelliklerinin bir üst kümesi olduğunu varsayar (ör. bağlantı damgası derlemesi hem derleme hem de bağlantı dosyalarına ihtiyaç duyar, bu nedenle all_files alır).

cc_toolchain.files, C++ araç zincirini kullanan tüm Starlark kuralları tarafından kullanılan bu içeriği barındırır.

ar_files

Etiket; varsayılan değer None'dir.

Arşivleme işlemleri için gerekli tüm cc_toolchain yapılarını içeren koleksiyon.
as_files

Etiket; varsayılan değer None'dir.

Derleme işlemleri için gereken tüm cc_toolchain yapılarını içeren koleksiyon.
compiler_files

Etiket; zorunlu

Derleme işlemleri için gereken tüm cc_toolchain yapılarını içeren koleksiyon.
compiler_files_without_includes

Etiket; varsayılan değer None'dir.

Giriş keşfinin desteklendiği durumlarda (şu anda yalnızca Google) derleme işlemleri için gereken tüm cc_toolchain yapılarını toplama.
coverage_files

Etiket; varsayılan değer None'dir.

Kapsam işlemleri için gereken tüm cc_toolchain yapılarını içeren koleksiyon. Belirtilmezse all_files kullanılır.
dwp_files

Etiket; zorunlu

dwp işlemleri için gereken tüm cc_toolchain yapılarını içeren koleksiyon.
dynamic_runtime_lib

Etiket; varsayılan değer None'dir.

C++ çalışma zamanı kitaplığı için dinamik kitaplık yapıları (ör. libstdc++.so).

Bu, "static_link_cpp_runtimes" özelliği etkinleştirildiğinde ve bağımlılıkları dinamik olarak bağladığımızda kullanılır.

exec_transition_for_inputs

Boole; varsayılan değer False'tir

Kullanımdan kaldırıldı. İşlemsiz.
libc_top

Etiket; varsayılan değer None'dir.

Derleme/bağlama işlemlerine giriş olarak iletilen libc yapıları koleksiyonu.
linker_files

Etiket; zorunlu

İşlemleri bağlamak için gereken tüm cc_toolchain yapılarını içeren koleksiyon.
module_map

Etiket; varsayılan değer None'dir.

Modüler derlemeler için kullanılacak modül haritası yapıları.
objcopy_files

Etiket; zorunlu

objcopy işlemleri için gereken tüm cc_toolchain yapılarını içeren koleksiyon.
output_licenses

Dize listesi; varsayılan değer []'tir.

static_runtime_lib

Etiket; varsayılan değer None'dir.

C++ çalışma zamanı kitaplığı için statik kitaplık yapısı (ör. libstdc++.a).

Bu, "static_link_cpp_runtimes" özelliği etkinleştirildiğinde ve bağımlılıkları statik olarak bağladığımızda kullanılır.

strip_files

Etiket; zorunlu

Sarma işlemleri için gereken tüm cc_toolchain yapılarını içeren koleksiyon.
supports_header_parsing

Boole; varsayılan değer False'tir

cc_toolchain üstbilgi ayrıştırma işlemlerini desteklediğinde Doğru olarak ayarlanır.
supports_param_files

Boole; varsayılan değer True'tir

cc_toolchain, işlemleri bağlamak için param dosyalarının kullanılmasını desteklediğinde True olarak ayarlanır.
toolchain_config

Etiket; zorunlu

cc_toolchain_config_info sağlayan kuralın etiketi.
toolchain_identifier

Dize; varsayılan değer ""'tir

Bu cc_toolchain ile ilgili crosstool_config.toolchain'i eşleştirmek için kullanılan tanımlayıcı.

#5380 sorunu düzeltilene kadar cc_toolchain ile CROSSTOOL.toolchain'ı ilişkilendirmenin önerilen yolu budur. Bu özellik, toolchain_config özelliğiyle (#5380) değiştirilecek.

cc_toolchain_suite

Kural kaynağını görüntüleme
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Desteği sonlandırıldı: Kural işlem yapmaz ve kaldırılacaktır.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

fdo_prefetch_hints

Kural kaynağını görüntüleme
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Çalışma alanındaki bir FDO ön getirme ipuçları profilini temsil eder. Örnekler:


fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

profile

Etiket; zorunlu

İpuçları profilinin etiketi. İpuçları dosyası .afdo uzantısına sahiptir. Etiket, fdo_absolute_path_profile kuralını da işaret edebilir.

fdo_profile

Kural kaynağını görüntüleme
fdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Çalışma alanındaki bir FDO profilini temsil eder. Örnek:


fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

memprof_profile

Etiket; varsayılan değer None'dir.

MemProf profilinin etiketi. Profilin .profdata uzantısı (dizine eklenen/sembolleştirilmiş bir memprof profili için) veya memprof .profdata dosyası içeren bir zip dosyası için.zip uzantısı olması gerekir.
profile

Etiket; zorunlu

FDO profilinin etiketi veya onu oluşturan bir kural. FDO dosyasının uzantısı aşağıdakilerden biri olabilir: dizine eklenmemiş LLVM profili için .profraw, dizine eklenen LLVM profili için .profdata, LLVM profraw profili içeren .zip, AutoFDO profili için .afdo, XBinary profili için .xfdo. Etiket, fdo_absolute_path_profile kuralını da işaret edebilir.
proto_profile

Etiket; varsayılan değer None'dir.

Protobuf profilinin etiketi.

memprof_profile

Kural kaynağını görüntüleme
memprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Çalışma alanındaki bir MEMPROF profilini temsil eder. Örnek:


memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

profile

Etiket; zorunlu

MEMPROF profilinin etiketi. Profilin .profdata uzantısı (dizine eklenen/sembolleştirilmiş bir memprof profili için) veya memprof .profdata dosyası içeren bir zip dosyası için.zip uzantısı olması gerekir. Etiket, fdo_absolute_path_profile kuralını da işaret edebilir.

propeller_optimize

Kural kaynağını görüntüleme
propeller_optimize(name, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Workspace'te bir Propeller optimizasyon profilini temsil eder. Örnek:


propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

cc_profile

Etiket; zorunlu

Çeşitli derleme işlemlerine iletilen profilin etiketi. Bu dosyanın uzantısı .txt olmalıdır.
ld_profile

Etiket; zorunlu

Bağlantı işlemine iletilen profilin etiketi. Bu dosyanın uzantısı .txt olmalıdır.