C / C++ Kuralları

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

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, dynamic_deps, env, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, package_metadata, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

Yürütülebilir bir ikili dosya oluşturur.


Hedefin name, uygulamanın ana giriş noktası olan kaynak dosyanın adıyla aynı olmalıdır (uzantı hariç). Ö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 istendiğinde oluşturulur): İkili programın çıkarılmış sürümü. Hata ayıklama sembollerini kaldırmak için ikili programda strip -g ç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 oluşturulur): Fission etkinse: Uzaktan dağıtılan ikili dosyaların hata ayıklaması 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

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

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

Bunlar cc_library veya objc_library hedef olabilir.

Bağlayıcı komut dosyalarını (.lds) deps'e yerleştirmek ve linkopts içinde bunlara referans vermek de mümkündür ancak bu kullanım alanı için lütfen additional_linker_inputs'ı göz önünde bulundurun.
srcs

Etiket 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 kodu) 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çinde yer alıyorsa bu cc_library otomatik olarak söz konusu diğer 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 oluşturulur.

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

Tüm #included dosyaları, bu veya referans verilen cc_library kurallarının hdrs özelliğinde belirtilmelidir ya da bu kitaplığa özelse srcs içinde listelenmelidir. Daha ayrıntılı açıklama için "Başlık dahil etme kontrolü" bölümüne bakın.

.so, .lo ve .a dosyaları önceden derlenmiş dosyalardır. Kitaplığınız, kaynak koduna sahip olmadığımız üçüncü taraf kodu kullanıyorsa bu hataları srcs olarak gösterebilir.

srcs özelliği başka bir kuralın etiketini içeriyorsa, cc_library, derlemek için bu kuralın çıkış dosyalarını kaynak dosya olarak kullanır. Bu, kaynak kodun tek seferlik oluşturulması için kullanışlıdır (ara sıra kullanımdan daha fazla kullanmak için Starlark kural sınıfı uygulamak ve cc_common API'sini 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 ön işlemcili 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 kuralına uygun olarak farklı programlama dillerini gösterir.

data

Etiket 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'nin veri dosyalarına eklenir.

C++ kodunuz bu veri dosyalarına şu şekilde erişebilir:


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

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

Yalnızca C++ bağlayıcı komutuna sunulan bağımlılıklar.

deps hem derleme hem de bağlantı bağımlılıkları için tasarlanmışken additional_linker_inputs yalnızca bağlantı bağımlılıkları için tasarlanmıştır ve yalnızca bağlantı için gerekli olan bir bağımlılığı (örneğin, linkopts içinde referans verilen dosyalar) belirtir.

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

conlyopts

Dizelerin listesi; varsayılan değer []'dır.

Bu seçenekleri C derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu belirteçleştirme işlemine tabidir.
copts

Dizelerin listesi; varsayılan değer []'dır.

Bu seçenekleri C/C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu belirteçleştirme işlemine tabidir.

Bu özellikteki her dize, ikili hedef derlenmeden önce COPTS'ya belirtilen sırayla eklenir. Bu işaretler yalnızca bu hedefi derlerken geçerli olur, bağımlılıkları için geçerli olmaz. Bu nedenle, başka yerlerde bulunan başlık dosyaları konusunda dikkatli olun. 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.

Paket, özelliği no_copts_tokenization olarak bildiriyorsa Bourne kabuğu belirteçleştirme yalnızca tek bir "Make" değişkeninden oluşan dizeler için geçerlidir.

cxxopts

Dizelerin listesi; varsayılan değer []'dır.

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu belirteçleştirme işlemine tabidir.
defines

Dizelerin listesi; varsayılan değer []'dır.

Bu ve tüm bağımlı hedeflerin derleme satırına eklenecek tanımlar listesi. "Make" değişkeni değiştirme ve Bourne kabuğu belirteçleştirme işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dizeye -D önek eklenir ve bu hedefin derleme komut satırına, ayrıca kendisine bağlı olan her kurala eklenir. Bu işlem, geniş kapsamlı etkiler yaratabileceğinden çok dikkatli olun. Tanımlar, bu hedefe bağlı olan her hedefe eklenir. Şüpheye düştüğünüzde bunun yerine local_defines öğesine değer tanımlayın.
dynamic_deps

Etiket 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'nin farklı bir cc_shared_library tarafından sağlandığı için geçişli olarak bağlanmaması gerektiğine karar vermek için dynamic_deps listesini (geçişli olarak, yani mevcut hedefin dynamic_deps'si de) kullanır.dynamic_deps

hdrs_check

Dize; varsayılan değer ""

Kullanımdan kaldırıldı, işlemsiz.
includes

Dizelerin listesi; varsayılan değer []'dır.

Derleme satırına eklenecek include dizinlerinin listesi. "Değişken yap" yerine koyma işlemine tabidir. Her dizeye paket yolu eklenir ve "include_paths" CROSSTOOL özelliği aracılığıyla genişletilmek üzere C++ araç zincirine iletilir. Tipik özellik tanımlarıyla bir POSIX sisteminde çalışan bir araç zinciri -isystem path_to_package/include_entry oluşturur. Bu yalnızca #include ifadelerinin Google yazım stiline uymayan üçüncü taraf kitaplıkları için kullanılmalıdır. COPTS'tan farklı olarak, bu işaretler bu kural ve buna bağlı olan her kural için eklenir. (Not: bağlı olduğu kurallar değil!) Bu durumun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS'a "-I" işaretleri ekleyin.

Eklenen include yolları, oluşturulan dosyaların yanı sıra kaynak ağacındaki 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ı //tools/cpp:link_extra_lib ile bağlantılıdır ve bu da varsayılan olarak //tools/cpp:link_extra_libs etiket işaretine bağlıdır. Bu kitaplık, işaret ayarlanmadığı sürece varsayılan olarak boştur. Etiket işaretini ayarlamak, isteğe bağlı bağımlılıkların (ör. zayıf semboller için geçersiz kılmalar, paylaşılan kitaplık işlevleri için kesiciler veya özel çalışma zamanı kitaplıkları) bağlanmasına olanak tanır (malloc değiştirmeleri için malloc veya --custom_malloc tercih edilir). Bu özelliği None olarak ayarlamak bu davranışı devre dışı bırakır.

linkopts

Dizelerin listesi; varsayılan değer []'dır.

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Marka" değişkeni yerine koyma, Bourne kabuğu belirteçleştirme ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS'ya eklenir.

Bu listede $ veya - ile başlamayan her öğenin, deps içindeki bir hedefin etiketi olduğu varsayılır. Bu 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 değeri; varsayılan değer False'dır.

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

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

Hem linkopts=['-static'] hem de linkshared=True öğesini belirtirseniz tamamen bağımsız tek bir birim elde edersiniz. Hem linkstatic=True hem de linkshared=True öğesini belirtirseniz tek bir birim elde edersiniz. Bu birim çoğunlukla bağımsızdır.

linkstatic

Boole değeri; varsayılan değer True'dır.

cc_binary ve cc_test için: İkili dosyayı 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 etkin, diğerleri için devre dışıdır.

Etkinleştirilirse ve bu bir ikili veya test ise bu seçenek, mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a'ların bağlanması gerektiğini derleme aracına bildirir. libc gibi sistem kitaplıkları (ancak C/C++ çalışma zamanı kitaplıkları değil, aşağıya bakın) ve statik kitaplığı olmayan kitaplıklar dinamik olarak bağlanmaya devam eder. Bu nedenle, ortaya çıkan yürütülebilir dosya yine dinamik olarak bağlanır 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 birlikte 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 sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı moddur. Örneğin, "gcc foo.o libfoo.a libbaz.a -lm".
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • DYNAMIC: Tüm kitaplıkların dinamik olarak bağlandığı (dinamik sürüm varsa) moddur. Örneğin, "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False belirtilerek etkinleştirilir.

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

linkstatic özelliği, cc_library() kuralında kullanıldığında farklı bir anlam ifade eder. Bir C++ kitaplığı için linkstatic=True, yalnızca statik bağlantıya izin verildiğini gösterir. 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 tasarlanmıştır.

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

local_defines

Dizelerin listesi; varsayılan değer []'dır.

Derleme satırına eklenecek tanımların listesi. "Make" değişkeni değiştirme ve Bourne kabuğu belirteçleştirme işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dizeye -D öneki eklenir ve bu hedef için derleme komut satırına eklenir ancak bağımlılarına eklenmez. defines'dan farklı olarak tanımlar yalnızca bu hedef için derleme komut satırına eklenir.
malloc

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

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

Varsayılan olarak C++ ikilileri //tools/cpp:malloc'ya karşı bağlanır. Bu, boş bir kitaplık olduğundan ikili, libc malloc'u kullanır. Bu etiket, cc_library ile ilgili olmalıdır. Derleme, C++ dışındaki bir kural içinse bu seçeneğin etkisi olmaz. linkshared=True belirtilirse bu özelliğin değeri yoksayılır.

module_interfaces

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

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

C++ Standard'da modül arayüzü dosya uzantısıyla ilgili bir kısıtlama yoktur.

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

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

nocopts

Dize; varsayılan değer ""

Eşleşen seçenekleri C++ derleme komutundan kaldırın. "Marka" değişkeni yerine koyma işlemine tabidir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen tüm mevcut COPTS (kuralın copts özelliğinde açıkça belirtilen değerler dahil) bu kuralın derlenmesi amacıyla COPTS'dan kaldırılır. Bu özelliğin third_party dışında kullanılması veya gerekli olması beklenmez. Değerler, "Marka" değişkeni değiştirme dışında herhangi bir şekilde önceden işlenmez.
reexport_deps

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

stamp

Tam sayı; varsayılan değer -1

Derleme bilgilerinin ikili dosyaya kodlanıp kodlanmayacağı. Olası değerler:
  • stamp = 1: Derleme bilgilerini, --nostamp derlemelerinde bile her zaman ikiliye damgalayın. Bu ayardan kaçınılmalıdır. Bu ayar, ikili dosya ve buna bağlı tüm aşağı akış işlemleri için uzaktan önbelleğe almayı devre dışı bırakabilir.
  • 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şaretiyle kontrol edilir.

Damgalı 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ğlayıcıya iletilecek Windows DEF dosyası.

Bu özellik yalnızca hedef platform Windows olduğunda kullanılmalıdır. Paylaşılan bir kitaplık bağlanırken sembolleri 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, package_metadata, pic_objects, pic_static_library, restricted_to, shared_library, static_library, strip_include_prefix, 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 = True,
)
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ığıyla 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 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 = True,
)

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 = True,
)
5. Statik veya paylaşılan kitaplığa bağlama

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 kalanlar Unix ve Windows'da aynıdır:


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

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

cc_import, include ö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

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

Hedefin bağlı 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

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

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

Boole değeri; varsayılan değer False'dır.

1 ise bu C++ önceden derlenmiş kitaplığına (doğrudan veya dolaylı olarak) bağlı olan tüm ikililer, bazıları ikili tarafından referans verilen semboller içermese bile statik kitaplıkta arşivlenen tüm nesne dosyalarına bağlanır. Bu, kodunuz ikilideki kod tarafından açıkça çağrılmıyorsa (ör. kodunuz, bir hizmet tarafından sağlanan geri çağırmayı almak için kaydediliyorsa) kullanışlıdır.

Windows'da VS 2017 ile alwayslink çalışmıyorsa bu durum bilinen bir sorundan kaynaklanmaktadır. Lütfen VS 2017'nizi en son sürüme yükseltin.

includes

Dizelerin listesi; varsayılan değer []'dır.

Derleme satırına eklenecek include dizinlerinin listesi. "Değişken yap" yerine koyma işlemine tabidir. Her dizeye paket yolu eklenir ve "include_paths" CROSSTOOL özelliği aracılığıyla genişletilmek üzere C++ araç zincirine iletilir. Tipik özellik tanımlarıyla bir POSIX sisteminde çalışan bir araç zinciri -isystem path_to_package/include_entry oluşturur. Bu yalnızca #include ifadelerinin Google yazım stiline uymayan üçüncü taraf kitaplıkları için kullanılmalıdır. COPTS'tan farklı olarak, bu işaretler bu kural ve buna bağlı olan her kural için eklenir. (Not: bağlı olduğu kurallar değil!) Bu durumun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS'a "-I" işaretleri ekleyin.

Varsayılan include yolu, oluşturulan dosyaları içermez. Oluşturulan bir üstbilgi dosyasını #include etmeniz gerekiyorsa bunu 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

Dizelerin listesi; varsayılan değer []'dır.

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Marka" değişkeni yerine koyma, Bourne kabuğu belirteçleştirme ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS'ya eklenir.

Bu listede $ veya - ile başlamayan her öğenin, deps içindeki bir hedefin etiketi olduğu varsayılır. Bu 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.

objects

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

pic_objects

Etiket 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 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

strip_include_prefix

Dize; varsayılan değer ""

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

Bu kural ayarlandığında, hdrs özelliğindeki başlıklar, bu ön ek kesilmiş şekilde kendi yollarından erişilebilir.

Göreli yol ise paketle ilgili bir yol olarak kabul edilir. 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.

system_provided

Boole değeri; varsayılan değer False'dır.

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ş olmalı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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, package_metadata, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

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

Statik bağlantı ile cc_library öğesine bağlı bir şey oluşturursanız bağımlı kitaplık kuralının çıkışı .a dosyası olur. alwayslink=True belirtirseniz .lo dosyası elde edersiniz.

Paylaşılan kitaplık için gerçek çıkış dosyası adı libfoo.so'dır. Burada foo, kuralın adıdır. Diğer kitaplık türleri sırasıyla .lo ve .a ile biter. Örneğin, bir Python modülünü tanımlamak için belirli bir paylaşılan kitaplık adına ihtiyacınız varsa kitaplığı istediğiniz ada kopyalamak için genrule kullanın.

Üstbilgi ekleme kontrolü

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

cc_library kuralları için hdrs içindeki başlıklar, kitaplığın herkese açık arayüzünü oluşturur ve hem hdrs hem de srcs içindeki dosyalardan doğrudan eklenebilir. Ayrıca, kitaplığı deps içinde listeleyen cc_* kurallarının hdrs ve srcs içindeki dosyalarından da eklenebilir. srcs içindeki başlıklar yalnızca kitaplığın hdrs ve srcs bölümlerindeki dosyalardan doğrudan eklenmelidir. Bir başlığı hdrs veya srcs içine yerleştirip yerleştirmeyeceğinize karar verirken bu kitaplığın tüketicilerinin başlığı doğrudan ekleyebilmesini isteyip istemediğinizi göz önünde bulundurmalısınız. Bu, programlama dillerinde public ve private görünürlüğü arasındaki karara benzer.

cc_binary ve cc_test kurallarının dışa aktarılmış bir arayüzü olmadığı için hdrs özelliği de yoktur. Doğrudan ikiliye veya teste ait tüm başlıklar srcs içinde listelenmelidir.

Bu kuralları göstermek 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 eklemeler aşağıdaki tabloda listelenmiştir. Örneğin foo.cc, foo.h ve bar.h değerlerini doğrudan içerebilir ancak baz.h değerini içeremez.

Dosya dahilİzin verilen eklemeler
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 etmeler için geçerlidir. Yukarıdaki örnekte foo.cc, bar.h'yi içerebilir. bar.h, baz.h'yi içerebilir. baz.h ise baz-impl.h'ü içerebilir. Teknik olarak, bir .cc dosyasının derlenmesi, geçişli deps kapanışındaki herhangi bir cc_library içinde hdrs veya srcs'deki herhangi bir başlık dosyasını geçişli olarak içerebilir. Bu durumda derleyici, foo.cc derlenirken baz.h ve baz-impl.h değerlerini okuyabilir ancak foo.cc, #include "baz.h" değerini içermemelidir. Buna izin verilebilmesi için baz, foo adlı kullanıcının deps adlı kullanıcısına eklenmelidir.

Bazel, dahil etme kontrolü kurallarını uygulamak için araç zinciri desteğine bağlıdır. layering_check özelliği, araç zinciri tarafından desteklenmeli ve açıkça istenmelidir. Örneğin, --features=layering_check komut satırı işareti veya package işlevinin features parametresi aracılığıyla istenebilir. 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 = True,
)

Aşağıdaki örnek, third_party/python2_4_3/BUILD sitesinden alınmıştır. Kodun bir kısmı dl kitaplığını (başka bir dinamik kitaplığı yüklemek için) kullandığından 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 kaynağından alınmıştır. Önceden oluşturulmuş .so dosyalarını depoda sakları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 kaynağından alınmıştır. Üçüncü taraf kodu genellikle defines ve linkopts gerektirir.


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

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

Kitaplık hedefinin bağlı olduğu diğer kitaplıkların listesi.

Bunlar cc_library veya objc_library hedef olabilir.

deps hakkındaki 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 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ı veri bağımlılıkları data içinde yer alır. Diğer kurallar tarafından oluşturulan kaynak dosyalar srcs içinde yer alır.

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

Bu kitaplığa bağlamadan bir şeye bağlı olmak için bunun adını data yerine ekleyin.

srcs

Etiket 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 kodu) 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çinde yer alıyorsa bu cc_library otomatik olarak söz konusu diğer 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 oluşturulur.

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

Tüm #included dosyaları, bu veya referans verilen cc_library kurallarının hdrs özelliğinde belirtilmelidir ya da bu kitaplığa özelse srcs içinde listelenmelidir. Daha ayrıntılı açıklama için "Başlık dahil etme kontrolü" bölümüne bakın.

.so, .lo ve .a dosyaları önceden derlenmiş dosyalardır. Kitaplığınız, kaynak koduna sahip olmadığımız üçüncü taraf kodu kullanıyorsa bu hataları srcs olarak gösterebilir.

srcs özelliği başka bir kuralın etiketini içeriyorsa, cc_library, derlemek için bu kuralın çıkış dosyalarını kaynak dosya olarak kullanır. Bu, kaynak kodun tek seferlik oluşturulması için kullanışlıdır (ara sıra kullanımdan daha fazla kullanmak için Starlark kural sınıfı uygulamak ve cc_common API'sini 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 ön işlemcili 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 kuralına uygun olarak farklı programlama dillerini gösterir.

data

Etiket 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'nin veri dosyalarına eklenir.

C++ kodunuz bu veri dosyalarına şu şekilde erişebilir:


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

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

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

Bu, kitaplığın arayüzünü açıklayan başlık dosyalarını bildirmek için kesinlikle tercih edilen konumdur. Bu üstbilgiler, bu kuraldaki veya bağımlı kurallardaki kaynaklar tarafından dahil edilmek üzere kullanılabilir. Bu kitaplığın bir istemcisi tarafından dahil edilmesi amaçlanmayan üstbilgiler, yayınlanmış bir üstbilgi tarafından dahil edilmiş olsalar bile bunun yerine srcs özelliğinde listelenmelidir. Daha ayrıntılı açıklama için "Başlık ekleme kontrolü" bölümüne bakın.

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

additional_compiler_inputs

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

Derleyici komut satırına iletmek isteyebileceğiniz ek dosyalar (ör. temizleyici yok sayma listeleri). Burada belirtilen dosyalar daha sonra $(location) işleviyle copts'ta kullanılabilir.
additional_linker_inputs

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

Yalnızca C++ bağlayıcı komutuna sunulan bağımlılıklar.

deps hem derleme hem de bağlantı bağımlılıkları için tasarlanmışken additional_linker_inputs yalnızca bağlantı bağımlılıkları için tasarlanmıştır ve yalnızca bağlantı için gerekli olan bir bağımlılığı (örneğin, linkopts içinde referans verilen dosyalar) belirtir.

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

Boole değeri; varsayılan değer False'dır.

1 ise bu C++ kitaplığına (doğrudan veya dolaylı olarak) bağlı olan tüm ikili programlar, bazıları ikili program tarafından referans verilen semboller içermese bile srcs içinde listelenen dosyaların tüm nesne dosyalarında bağlantı oluşturur. Bu, kodunuz ikilideki kod tarafından açıkça çağrılmıyorsa (ör. kodunuz, bir hizmet tarafından sağlanan geri çağırmayı almak için kaydediliyorsa) kullanışlıdır.

Windows'da VS 2017 ile alwayslink çalışmıyorsa bu durum bilinen bir sorundan kaynaklanmaktadır. Lütfen VS 2017'nizi en son sürüme yükseltin.

conlyopts

Dizelerin listesi; varsayılan değer []'dır.

Bu seçenekleri C derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu belirteçleştirme işlemine tabidir.
copts

Dizelerin listesi; varsayılan değer []'dır.

Bu seçenekleri C/C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu belirteçleştirme işlemine tabidir.

Bu özellikteki her dize, ikili hedef derlenmeden önce COPTS'ya belirtilen sırayla eklenir. Bu işaretler yalnızca bu hedefi derlerken geçerli olur, bağımlılıkları için geçerli olmaz. Bu nedenle, başka yerlerde bulunan başlık dosyaları konusunda dikkatli olun. 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.

Paket, özelliği no_copts_tokenization olarak bildiriyorsa Bourne kabuğu belirteçleştirme yalnızca tek bir "Make" değişkeninden oluşan dizeler için geçerlidir.

cxxopts

Dizelerin listesi; varsayılan değer []'dır.

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu belirteçleştirme işlemine tabidir.
defines

Dizelerin listesi; varsayılan değer []'dır.

Bu ve tüm bağımlı hedeflerin derleme satırına eklenecek tanımlar listesi. "Make" değişkeni değiştirme ve Bourne kabuğu belirteçleştirme işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dizeye -D önek eklenir ve bu hedefin derleme komut satırına, ayrıca kendisine bağlı olan her kurala eklenir. Bu işlem, geniş kapsamlı etkiler yaratabileceğinden çok dikkatli olun. Tanımlar, bu hedefe bağlı olan her hedefe eklenir. Şüpheye düştüğünüzde bunun yerine local_defines öğesine değer tanımlayın.
hdrs_check

Dize; varsayılan değer ""

Kullanımdan kaldırıldı, işlemsiz.
implementation_deps

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

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

Dize; varsayılan değer ""

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

Ayarlanmışsa bu kuralın hdrs özelliğindeki başlıklar, bu özelliğin değerinin, depoya göre yollarına eklenmesiyle erişilebilir.

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

Dizelerin listesi; varsayılan değer []'dır.

Derleme satırına eklenecek include dizinlerinin listesi. "Değişken yap" yerine koyma işlemine tabidir. Her dizeye paket yolu eklenir ve "include_paths" CROSSTOOL özelliği aracılığıyla genişletilmek üzere C++ araç zincirine iletilir. Tipik özellik tanımlarıyla bir POSIX sisteminde çalışan bir araç zinciri -isystem path_to_package/include_entry oluşturur. Bu yalnızca #include ifadelerinin Google yazım stiline uymayan üçüncü taraf kitaplıkları için kullanılmalıdır. COPTS'tan farklı olarak, bu işaretler bu kural ve buna bağlı olan her kural için eklenir. (Not: bağlı olduğu kurallar değil!) Bu durumun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS'a "-I" işaretleri ekleyin.

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

linkopts

Dizelerin listesi; varsayılan değer []'dır.

cc_binary.linkopts sayfasına göz atın. linkopts özelliği, deps özellikleri (veya benzer şekilde işlenen diğer özellikler: cc_binary öğesinin malloc özelliği) aracılığıyla doğrudan veya dolaylı olarak bu kitaplığa bağlı olan tüm hedeflere de uygulanır. Bağımlılık linkopts'leri, bağımlı linkopts'lerden önceliklidir (yani bağımlılık linkopts'leri komut satırında daha sonra görünür). --linkopt içinde belirtilen Linkopts, kural linkopts'larına göre önceliklidir.

linkopts özelliğinin yalnızca .so dosyaları veya yürütülebilir dosyalar oluşturulurken geçerli olduğunu, .a veya .lo dosyaları oluşturulurken geçerli olmadığını unutmayın. Bu nedenle, linkstatic=True özelliği ayarlanırsa linkopts özelliği bu kitaplığın oluşturulmasını etkilemez, 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 de unutmayın.

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

linkstamp

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

Belirtilen C++ kaynak dosyasını aynı anda derleyip son ikili dosyaya bağlar. Bu hile, zaman damgası bilgilerini ikili dosyalara eklemek için gereklidir. Kaynak dosyayı normal şekilde bir nesne dosyasına derleseydik zaman damgası yanlış olurdu. Bağlantı zaman damgası derlemesi, belirli bir derleyici işaretleri grubunu içermeyebilir ve bu nedenle belirli bir başlığa, derleyici seçeneğine veya başka bir derleme değişkenine bağlı olmamalıdır. Bu seçeneğin yalnızca base paketinde kullanılması gerekir.
linkstatic

Boole değeri; varsayılan değer False'dır.

cc_binary ve cc_test için: İkili dosyayı 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 etkin, diğerleri için devre dışıdır.

Etkinleştirilirse ve bu bir ikili veya test ise bu seçenek, mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a'ların bağlanması gerektiğini derleme aracına bildirir. libc gibi sistem kitaplıkları (ancak C/C++ çalışma zamanı kitaplıkları değil, aşağıya bakın) ve statik kitaplığı olmayan kitaplıklar dinamik olarak bağlanmaya devam eder. Bu nedenle, ortaya çıkan yürütülebilir dosya yine dinamik olarak bağlanır 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 birlikte 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 sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı moddur. Örneğin, "gcc foo.o libfoo.a libbaz.a -lm".
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • DYNAMIC: Tüm kitaplıkların dinamik olarak bağlandığı (dinamik sürüm varsa) moddur. Örneğin, "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False belirtilerek etkinleştirilir.

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

linkstatic özelliği, cc_library() kuralında kullanıldığında farklı bir anlam ifade eder. Bir C++ kitaplığı için linkstatic=True, yalnızca statik bağlantıya izin verildiğini gösterir. 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 tasarlanmıştır.

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

local_defines

Dizelerin listesi; varsayılan değer []'dır.

Derleme satırına eklenecek tanımların listesi. "Make" değişkeni değiştirme ve Bourne kabuğu belirteçleştirme işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dizeye -D öneki eklenir ve bu hedef için derleme komut satırına eklenir ancak bağımlılarına eklenmez. defines'dan farklı olarak tanımlar yalnızca bu hedef için derleme komut satırına eklenir.
module_interfaces

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

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

C++ Standard'da modül arayüzü dosya uzantısıyla ilgili bir kısıtlama yoktur.

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

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

strip_include_prefix

Dize; varsayılan değer ""

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

Bu kural ayarlandığında, hdrs özelliğindeki başlıklar, bu ön ek kesilmiş şekilde kendi yollarından erişilebilir.

Göreli yol ise paketle ilgili bir yol olarak kabul edilir. 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

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

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

Bu konum, kendi başlarına derlenemeyen başlık dosyalarını bildirmek için kullanılır. Başka bir deyişle, geçerli kod oluşturmak için her zaman diğer kaynak dosyalar tarafından metin olarak dahil edilmeleri gerekir.

win_def_file

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

Bağlayıcıya iletilecek Windows DEF dosyası.

Bu özellik yalnızca hedef platform Windows olduğunda kullanılmalıdır. Paylaşılan bir kitaplık bağlanırken sembolleri 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, dynamic_deps, exec_compatible_with, exec_group_compatible_with, exec_properties, exports_filter, features, package_metadata, 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. bar, dynamic_dep bar_shared tarafından dinamik olarak sağlandığı için bağlantı oluşturulmaz.

foo_shared, hangi sembollerin dışa aktarılacağını kontrol etmek için bir bağlayıcı komut dosyası (*.lds) 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ıyorsa analiz aşamasında hata vermek için dışa aktarıldığı varsayılanı kullanır.

cc_shared_library öğesinin her doğrudan bağımlılığının dışa aktarıldığı varsayılır. Bu nedenle Bazel, analiz sırasında foo öğesinin foo_shared tarafından dışa aktarıldığını varsayar. baz öğesinin foo_shared tarafından dışa aktarıldığı varsayılmaz. exports_filter ile eşleşen her hedef de dışa aktarılmış olarak kabul edilir.

Örnekteki her bir cc_library en fazla bir cc_shared_library içinde görünmelidir. baz öğesini bar_shared öğesine de bağlamak istersek baz öğesine tags = ["LINKABLE_MORE_THAN_ONCE"] eklememiz gerekir.

shared_lib_name özelliği nedeniyle, bar_shared tarafından oluşturulan dosya, Linux'ta varsayılan olarak sahip olacağı libbar.so adı yerine bar.so adını alır.

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ıkla hedef oluşturduğunuzda meydana gelir. Bu sorunu düzeltmek için cc_shared_library bağımlılıklarından birinde kitaplıkların dışa aktarılmasını durdurmanız gerekir.

Bu durum, aynı hedefi statik olarak bağlayan iki farklı cc_shared_library bağımlılığıyla yeni bir cc_shared_library oluşturduğunuz her seferde meydana gelir. Dışa aktarma hatalarına benzer.

Bu sorunu düzeltmenin bir yolu, kitaplığın cc_shared_library bağımlılıklarından birine bağlanmasını durdurmaktır. Aynı zamanda, kitaplığı hâlâ bağlayan taraf, kitaplığı dışa aktarmalıdır. Böylece, kitaplığı bağlamayan taraf, sembollerin görünürlüğünü korur. Bir diğer yöntem ise hedefi dışa aktaran üçüncü bir kitaplığı kullanmaktır. Üçüncü bir yöntem ise 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ğlanmanın güvenli olduğundan kesinlikle emin olmalısınız.

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

Bu, deps öğenizin geçişli kapanımındaki bir kitaplığa cc_shared_library bağımlılıklarından birinden geçmeden ulaşılabildiği ancak bu kitaplığın dynamic_deps içinde farklı bir cc_shared_library öğesine zaten bağlandığı ve dışa aktarılmadığı anlamına gelir.

Çözüm, bağımlılıktan dışa aktarmak veya dışa aktaran üçüncü bir cc_shared_library çekmektir.cc_shared_library

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 hedefiyle statik olarak bağlanması gerekmez ve bağlanamaz. Bu nedenle, cc_shared_library'nın deps bölümünde yer almaz. Bu önceden derlenmiş dinamik kitaplık, cc_libraries öğelerinizden birinin bağımlılığıysa cc_library öğesinin 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ılmakta olan bir hedefi dışa aktardığınızı iddia ediyorsanız bu hatayı görürsünüz.

Bu sorunu düzeltmek için hedefi deps öğesinden kaldırın ve yalnızca dinamik bağımlılıktan yararlanın veya exports_filter öğesinin bu hedefi yakalamadığından emin olun.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

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

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

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

Kural uygulaması, analiz sırasında deps içinde listelenen tüm hedeflerin paylaşılan kitaplık tarafından dışa aktarıldığını varsayar. Böylece, birden fazla cc_shared_libraries aynı hedefleri dışa aktardığında hata verir. Kural uygulaması, bağlayıcıyı paylaşılan nesne tarafından hangi sembollerin dışa aktarılması gerektiği konusunda bilgilendirmeyi sağlamaz. Kullanıcı, bu durumu bağlayıcı komut dosyaları veya kaynak kodundaki görünürlük bildirimleri aracılığıyla düzeltmelidir.

Aynı kitaplık birden fazla cc_shared_library'ya statik olarak bağlandığında da uygulama hataları tetiklenir. Bu durum, cc_library.tags öğesine "LINKABLE_MORE_THAN_ONCE" eklenerek veya `cc_library` öğesi, paylaşılan kitaplıklardan birinin dışa aktarımı olarak listelenerek önlenebilir. Böylece, biri diğerinin dynamic_dep öğesi haline getirilebilir.

additional_linker_inputs

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

Bağlayıcıya iletmek isteyebileceğiniz ek dosyalar (ör. bağlayıcı komut dosyaları). Bağlayıcının bu dosyanın farkında olması için ihtiyaç duyduğu tüm bağlayıcı işaretlerini ayrı ayrı iletmeniz gerekir. Bu işlemi user_link_flags özelliği aracılığıyla yapabilirsiniz.
dynamic_deps

Etiket 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'nin farklı bir cc_shared_library tarafından sağlandığı için geçişli olarak bağlanmaması gerektiğine karar vermek için dynamic_deps listesini (geçişli olarak, yani mevcut hedefin dynamic_deps'si de) kullanır.dynamic_deps

exports_filter

Dizelerin listesi; varsayılan değer []'dır.

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

Herhangi bir hedef deps, paylaşılan kitaplık tarafından dışa aktarılmış olarak kabul edilir. Bu özellik, paylaşılan kitaplık tarafından dışa aktarılan ancak deps öğesinin geçişli bağımlılıkları olan tüm hedefleri listelemek için kullanılmalıdır.

Bu özelliğin, bu hedeflere aslında bir bağımlılık kenarı eklemediğini unutmayın. Bağımlılık kenarı bunun yerine deps tarafından oluşturulmalıdır. Bu özellikteki girişler yalnızca dizelerdir. Bu özelliğe hedef yerleştirirken, paylaşılan kitaplığın bu hedeften sembolleri dışa aktardığı iddiasında bulunulduğunu unutmayın. cc_shared_library mantığı, bağlayıcıya hangi sembollerin dışa aktarılması gerektiğini söyleme işlemini aslında gerçekleştirmez.

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

foo/BUILD'deki herhangi bir hedefi hesaba katmak için //foo:__pkg__

//foo:__subpackages__ foo/BUILD'deki veya foo/ bar/BUILD gibi foo/altındaki diğer paketlerdeki hedefleri hesaba katmak için

roots

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

shared_lib_name

Dize; varsayılan değer ""

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

Dizelerin listesi; varsayılan değer []'dır.

Dizelerin listesi; varsayılan değer []'dır.

Bağlayıcıya 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ı hakkında bilgilendirmek 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ğlayıcıya iletilecek Windows DEF dosyası.

Bu özellik yalnızca hedef platform Windows olduğunda kullanılmalıdır. Paylaşılan bir kitaplık bağlanırken sembolleri 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Hedeflerin ve 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. PIC nesnelerine öncelik verilir.

Çıkış grupları

linkdeps

deps içinde listelenen hedeflerin, statik kitaplığa herhangi bir nesne dosyası katkısında bulunmayan ancak en az bir statik, dinamik veya arayüz kitaplığı sağlayan geçişli bağımlılıklarının etiketlerini içeren bir metin dosyası. Elde edilen statik kitaplığın, bağlantı zamanında bu kitaplıkların kullanılabilir olmasını gerektirebilir.

linkopts

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

Yinelenen semboller

Varsayılan olarak, cc_static_library kuralı, ortaya çıkan statik kitaplığın yinelenen sembol içermediğini kontrol eder. Bu durumda, derleme başarısız olur ve yinelenen sembolleri ve bunları içeren nesne dosyalarını listeleyen bir hata mesajı gösterilir.

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

symbol_check için araç zinciri desteği

Bazel ile birlikte gönderilen otomatik olarak yapılandırılmış C++ araç zincirleri, tüm platformlarda symbol_check özelliğini destekler. Özel araç zincirleri, iki yöntemden birini kullanarak 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 sembollerin kontrol edileceği statik kitaplık ve kontrol başarılı olursa oluşturulması gereken bir dosyanın yolu.
  • symbol_check özelliğinin, statik kitaplık oluşturma işleminin yinelenen sembollerde başarısız olmasına neden olan arşivleyici işaretleri eklemesi.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

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

Geçişli bağımlılıkları da dahil olmak üzere statik kitaplıkta birleştirilecek hedeflerin listesi.

Herhangi bir 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, dynamic_deps, env, env_inherit, exec_compatible_with, exec_group_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, package_metadata, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

Bir cc_test() kuralı, testi derler. Burada test, bazı test kodlarının etrafındaki ikili sarmalayıcıdır.

Varsayılan olarak C++ testleri dinamik olarak bağlanır.
Bir birim testini statik olarak bağlamak için linkstatic=True değerini belirtin. Testinizin neden linkstatic'ye ihtiyacı olduğunu yorum olarak belirtmeniz iyi olabilir. Bu durum muhtemelen açıkça anlaşılmıyordur.

Örtülü çıkış hedefleri

  • name.stripped (yalnızca açıkça istendiğinde oluşturulur): İkili programın çıkarılmış sürümü. Hata ayıklama sembollerini kaldırmak için ikili programda strip -g ç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 oluşturulur): Fission etkinse: Uzaktan dağıtılan ikili dosyaların hata ayıklaması 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. Ancak stamp bağımsız değişkeni testler için varsayılan olarak 0'a ayarlanır ve cc_test, tüm test kuralları (*_test) için ortak olan ek özelliklere sahiptir.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

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

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

Bunlar cc_library veya objc_library hedef olabilir.

Bağlayıcı komut dosyalarını (.lds) deps'e yerleştirmek ve linkopts içinde bunlara referans vermek de mümkündür ancak bu kullanım alanı için lütfen additional_linker_inputs'ı göz önünde bulundurun.
srcs

Etiket 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 kodu) 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çinde yer alıyorsa bu cc_library otomatik olarak söz konusu diğer 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 oluşturulur.

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

Tüm #included dosyaları, bu veya referans verilen cc_library kurallarının hdrs özelliğinde belirtilmelidir ya da bu kitaplığa özelse srcs içinde listelenmelidir. Daha ayrıntılı açıklama için "Başlık dahil etme kontrolü" bölümüne bakın.

.so, .lo ve .a dosyaları önceden derlenmiş dosyalardır. Kitaplığınız, kaynak koduna sahip olmadığımız üçüncü taraf kodu kullanıyorsa bu hataları srcs olarak gösterebilir.

srcs özelliği başka bir kuralın etiketini içeriyorsa, cc_library, derlemek için bu kuralın çıkış dosyalarını kaynak dosya olarak kullanır. Bu, kaynak kodun tek seferlik oluşturulması için kullanışlıdır (ara sıra kullanımdan daha fazla kullanmak için Starlark kural sınıfı uygulamak ve cc_common API'sini 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 ön işlemcili 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 kuralına uygun olarak farklı programlama dillerini gösterir.

data

Etiket 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'nin veri dosyalarına eklenir.

C++ kodunuz bu veri dosyalarına şu şekilde erişebilir:


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

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

Yalnızca C++ bağlayıcı komutuna sunulan bağımlılıklar.

deps hem derleme hem de bağlantı bağımlılıkları için tasarlanmışken additional_linker_inputs yalnızca bağlantı bağımlılıkları için tasarlanmıştır ve yalnızca bağlantı için gerekli olan bir bağımlılığı (örneğin, linkopts içinde referans verilen dosyalar) belirtir.

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

conlyopts

Dizelerin listesi; varsayılan değer []'dır.

Bu seçenekleri C derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu belirteçleştirme işlemine tabidir.
copts

Dizelerin listesi; varsayılan değer []'dır.

Bu seçenekleri C/C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu belirteçleştirme işlemine tabidir.

Bu özellikteki her dize, ikili hedef derlenmeden önce COPTS'ya belirtilen sırayla eklenir. Bu işaretler yalnızca bu hedefi derlerken geçerli olur, bağımlılıkları için geçerli olmaz. Bu nedenle, başka yerlerde bulunan başlık dosyaları konusunda dikkatli olun. 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.

Paket, özelliği no_copts_tokenization olarak bildiriyorsa Bourne kabuğu belirteçleştirme yalnızca tek bir "Make" değişkeninden oluşan dizeler için geçerlidir.

cxxopts

Dizelerin listesi; varsayılan değer []'dır.

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken oluştur" yerine koyma ve Bourne kabuğu belirteçleştirme işlemine tabidir.
defines

Dizelerin listesi; varsayılan değer []'dır.

Bu ve tüm bağımlı hedeflerin derleme satırına eklenecek tanımlar listesi. "Make" değişkeni değiştirme ve Bourne kabuğu belirteçleştirme işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dizeye -D önek eklenir ve bu hedefin derleme komut satırına, ayrıca kendisine bağlı olan her kurala eklenir. Bu işlem, geniş kapsamlı etkiler yaratabileceğinden çok dikkatli olun. Tanımlar, bu hedefe bağlı olan her hedefe eklenir. Şüpheye düştüğünüzde bunun yerine local_defines öğesine değer tanımlayın.
dynamic_deps

Etiket 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'nin farklı bir cc_shared_library tarafından sağlandığı için geçişli olarak bağlanmaması gerektiğine karar vermek için dynamic_deps listesini (geçişli olarak, yani mevcut hedefin dynamic_deps'si de) kullanır.dynamic_deps

hdrs_check

Dize; varsayılan değer ""

Kullanımdan kaldırıldı, işlemsiz.
includes

Dizelerin listesi; varsayılan değer []'dır.

Derleme satırına eklenecek include dizinlerinin listesi. "Değişken yap" yerine koyma işlemine tabidir. Her dizeye paket yolu eklenir ve "include_paths" CROSSTOOL özelliği aracılığıyla genişletilmek üzere C++ araç zincirine iletilir. Tipik özellik tanımlarıyla bir POSIX sisteminde çalışan bir araç zinciri -isystem path_to_package/include_entry oluşturur. Bu yalnızca #include ifadelerinin Google yazım stiline uymayan üçüncü taraf kitaplıkları için kullanılmalıdır. COPTS'tan farklı olarak, bu işaretler bu kural ve buna bağlı olan her kural için eklenir. (Not: bağlı olduğu kurallar değil!) Bu durumun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS'a "-I" işaretleri ekleyin.

Eklenen include yolları, oluşturulan dosyaların yanı sıra kaynak ağacındaki 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ı //tools/cpp:link_extra_lib ile bağlantılıdır ve bu da varsayılan olarak //tools/cpp:link_extra_libs etiket işaretine bağlıdır. Bu kitaplık, işaret ayarlanmadığı sürece varsayılan olarak boştur. Etiket işaretini ayarlamak, isteğe bağlı bağımlılıkların (ör. zayıf semboller için geçersiz kılmalar, paylaşılan kitaplık işlevleri için kesiciler veya özel çalışma zamanı kitaplıkları) bağlanmasına olanak tanır (malloc değiştirmeleri için malloc veya --custom_malloc tercih edilir). Bu özelliği None olarak ayarlamak bu davranışı devre dışı bırakır.

linkopts

Dizelerin listesi; varsayılan değer []'dır.

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Marka" değişkeni yerine koyma, Bourne kabuğu belirteçleştirme ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS'ya eklenir.

Bu listede $ veya - ile başlamayan her öğenin, deps içindeki bir hedefin etiketi olduğu varsayılır. Bu 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 değeri; varsayılan değer False'dır.

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

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

Hem linkopts=['-static'] hem de linkshared=True öğesini belirtirseniz tamamen bağımsız tek bir birim elde edersiniz. Hem linkstatic=True hem de linkshared=True öğesini belirtirseniz tek bir birim elde edersiniz. Bu birim çoğunlukla bağımsızdır.

linkstatic

Boole değeri; varsayılan değer False'dır.

cc_binary ve cc_test için: İkili dosyayı 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 etkin, diğerleri için devre dışıdır.

Etkinleştirilirse ve bu bir ikili veya test ise bu seçenek, mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a'ların bağlanması gerektiğini derleme aracına bildirir. libc gibi sistem kitaplıkları (ancak C/C++ çalışma zamanı kitaplıkları değil, aşağıya bakın) ve statik kitaplığı olmayan kitaplıklar dinamik olarak bağlanmaya devam eder. Bu nedenle, ortaya çıkan yürütülebilir dosya yine dinamik olarak bağlanır 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 birlikte 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 sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı moddur. Örneğin, "gcc foo.o libfoo.a libbaz.a -lm".
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • DYNAMIC: Tüm kitaplıkların dinamik olarak bağlandığı (dinamik sürüm varsa) moddur. Örneğin, "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False belirtilerek etkinleştirilir.

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

linkstatic özelliği, cc_library() kuralında kullanıldığında farklı bir anlam ifade eder. Bir C++ kitaplığı için linkstatic=True, yalnızca statik bağlantıya izin verildiğini gösterir. 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 tasarlanmıştır.

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

local_defines

Dizelerin listesi; varsayılan değer []'dır.

Derleme satırına eklenecek tanımların listesi. "Make" değişkeni değiştirme ve Bourne kabuğu belirteçleştirme işlemine tabidir. Tek bir Bourne kabuğu jetonundan oluşması gereken her dizeye -D öneki eklenir ve bu hedef için derleme komut satırına eklenir ancak bağımlılarına eklenmez. defines'dan farklı olarak tanımlar yalnızca bu hedef için derleme komut satırına eklenir.
malloc

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

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

Varsayılan olarak C++ ikilileri //tools/cpp:malloc'ya karşı bağlanır. Bu, boş bir kitaplık olduğundan ikili, libc malloc'u kullanır. Bu etiket, cc_library ile ilgili olmalıdır. Derleme, C++ dışındaki bir kural içinse bu seçeneğin etkisi olmaz. linkshared=True belirtilirse bu özelliğin değeri yoksayılır.

module_interfaces

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

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

C++ Standard'da modül arayüzü dosya uzantısıyla ilgili bir kısıtlama yoktur.

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

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

nocopts

Dize; varsayılan değer ""

Eşleşen seçenekleri C++ derleme komutundan kaldırın. "Marka" değişkeni yerine koyma işlemine tabidir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen tüm mevcut COPTS (kuralın copts özelliğinde açıkça belirtilen değerler dahil) bu kuralın derlenmesi amacıyla COPTS'dan kaldırılır. Bu özelliğin third_party dışında kullanılması veya gerekli olması beklenmez. Değerler, "Marka" değişkeni değiştirme dışında herhangi bir şekilde önceden işlenmez.
reexport_deps

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

stamp

Tam sayı; varsayılan değer 0

Derleme bilgilerinin ikili dosyaya kodlanıp kodlanmayacağı. Olası değerler:
  • stamp = 1: Derleme bilgilerini, --nostamp derlemelerinde bile her zaman ikiliye damgalayın. Bu ayardan kaçınılmalıdır. Bu ayar, ikili dosya ve buna bağlı tüm aşağı akış işlemleri için uzaktan önbelleğe almayı devre dışı bırakabilir.
  • 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şaretiyle kontrol edilir.

Damgalı 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ğlayıcıya iletilecek Windows DEF dosyası.

Bu özellik yalnızca hedef platform Windows olduğunda kullanılmalıdır. Paylaşılan bir kitaplık bağlanırken sembolleri 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, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_group_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, package_metadata, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

Bir C++ araç zincirini temsil eder.

Bu kural aşağıdakilerden sorumludur:

  • C++ işlemlerinin çalışması için gereken tüm yapıları toplama. Bu işlem, all_files, compiler_files, linker_files veya _files ile biten diğer özellikler gibi özellikler kullanılarak yapılır. Bunlar, en yaygın olarak gerekli tüm dosyaları içeren dosya grubu glob'larıdır.
  • C++ işlemleri için doğru komut satırları 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çimi dokümanları için bu sayfaya da bakın.

bazel build //... çağrıldığında araç zincirlerinin gereksiz yere oluşturulup 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ı koleksiyonu. Bu yapılar, tüm rules_cc ile ilgili işlemlere giriş olarak eklenir (aşağıdaki özelliklerden daha kesin yapı kümelerini kullanan işlemler hariç). Bazel, all_files öğesinin diğer tüm yapıt sağlayan özelliklerin (ör. linkstamp derlemesi hem derleme hem de bağlantı dosyaları gerektirir, bu nedenle all_files alır) üst kümesi olduğunu varsayar.

Bu, cc_toolchain.files öğesinin içerdiği ve C++ araç zincirini kullanan tüm Starlark kuralları tarafından kullanılan öğedir.

ar_files

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

Arşivleme işlemleri için gereken tüm cc_toolchain yapıtlarının toplanması.
as_files

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

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

Etiket: zorunlu

Derleme işlemleri için gereken tüm cc_toolchain yapılarının toplanması.
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ın toplanması.
coverage_files

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

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

Etiket: zorunlu

dwp işlemleri için gereken tüm cc_toolchain yapıtlarının koleksiyonu.
dynamic_runtime_lib

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

C++ çalışma zamanı kitaplığı için dinamik kitaplık yapısı (ö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 değeri; varsayılan değer False'dır.

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

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

libc için derleme/bağlama işlemlerine giriş olarak iletilen bir eser koleksiyonu.
linker_files

Etiket: zorunlu

Bağlantı işlemleri için gereken tüm cc_toolchain yapılarının toplanması.
module_map

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

Modüler derlemelerde kullanılacak modül haritası yapısı.
objcopy_files

Etiket: zorunlu

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

Dizelerin listesi; varsayılan değer []'dır.

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

Şerit işlemleri için gereken tüm cc_toolchain yapılarının toplanması.
supports_header_parsing

Boole değeri; varsayılan değer False'dır.

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

Boole değeri; varsayılan değer True'dır.

cc_toolchain, bağlama işlemleri 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 ""

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

#5380 numaralı sorun düzeltilene kadar cc_toolchain ile CROSSTOOL.toolchain'ü ilişkilendirmenin önerilen yolu budur. Bu özelliğin yerini toolchain_config özelliği alacak (#5380).

cc_toolchain_suite

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

Desteği sonlandırıldı: Kural, işlem yapmaz ve kaldırılı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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Çalışma alanında bulunan bir FDO önceden 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ına da işaret edebilir.

fdo_profile

Kural kaynağını görüntüleme
fdo_profile(name, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, memprof_profile, package_metadata, 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ına (dizinlenmiş/sembolize edilmiş bir memprof profili için) veya memprof .profdata dosyası içeren bir zip dosyası için.zip uzantısına sahip olması gerekir.
profile

Etiket: zorunlu

FDO profilinin etiketi veya bunu oluşturan bir kural. FDO dosyasının şu uzantılardan biri olabilir: dizine eklenmemiş LLVM profili için .profraw, dizine eklenmiş 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Çalışma alanında bulunan 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ına (dizinlenmiş/sembolize edilmiş bir memprof profili için) veya memprof .profdata dosyası içeren bir zip dosyası için.zip uzantısına sahip 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, ld_profile, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Çalışma alanındaki 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 .txt uzantısı var.
ld_profile

Etiket: zorunlu

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