C / C++ Kuralları

Sorun bildirin Kaynağı göster

Kurallar

cc_binary

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

Dolaylı çıkış hedefleri

  • name.stripped (yalnızca açıkça talep edildiğinde oluşturulur): İkili programın sadeleştirilmiş bir sürümü. strip -g, hata ayıklama simgelerini kaldırmak için ikili programda çalıştırılır. --stripopt=-foo kullanılarak komut satırında ek şerit seçenekleri sağlanabilir. Bu çıkış yalnızca açıkça istendiğinde oluşturulur.
  • name.dwp (yalnızca açıkça talep edildiğinde oluşturulur): Fission etkinleştirilirse: Uzaktan dağıtılan ikili programlarda hata ayıklamaya uygun bir hata ayıklama bilgileri paketi dosyası. Diğer: Boş dosya.

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan []

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

Bunlar, cc_library veya objc_library hedef olabilir.

srcs

Etiket listesi; varsayılan []

Hedefi oluşturmak için işlenen C ve C++ dosyalarının listesi. Bunlar, oluşturulmamış (normal kaynak kodu) veya üretilmiş C/C++ kaynak ve başlık dosyalarıdır.

Tüm .cc, .c ve .cpp dosyaları derlenecek. Bunlar oluşturulmuş dosyalar olabilir: Adlandırılmış bir dosya başka bir kuralın outs içinde yer alıyorsa bu kural otomatik olarak diğer kurala bağlı olur.

.h dosyası derlenmez ancak bu kuraldaki kaynaklar tarafından dahil edilebilir. Hem .cc hem de .h dosyası doğrudan bu srcs içinde veya deps bağımsız değişkeninde listelenen herhangi bir kuralın hdrs öğesinde listelenen üst bilgileri içerebilir.

Tüm #included dosyaları, bu kuralın srcs özelliğinde veya referans verilen cc_library()'lerin hdrs özelliğinde belirtilmelidir. Önerilen stil, bir kitaplıkla ilişkilendirilmiş başlıkların söz konusu kitaplığın hdrs özelliğinde listelenmesi ve bu kuralın kaynaklarıyla ilişkili diğer tüm başlıkların srcs politikasında listelenmesi içindir. Daha ayrıntılı açıklama için "Üstbilgi dahil etme kontrolü" bölümüne bakın.

Bir kuralın adı srcs içindeyse bu kural otomatik olarak ona bağlıdır. Adlandırılmış kuralın outs'leri C veya C++ kaynak dosyalarıysa bu kuralda derlenirler. Kitaplık dosyalarıysa birbirine bağlanırlar.

İzin verilen srcs dosya türleri:

  • C ve C++ kaynak dosyaları: .c, .cc, .cpp, .cxx, .c++, .C
  • C ve C++ üstbilgi 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
  • Paylaşılan kitaplık, sürümü olan veya sürümü ayarlanmadı: .so, .so.version
  • Nesne dosyası: .o, .pic.o

...ve bu dosyaları oluşturan kurallar. Farklı uzantılar, gcc kurallarına uygun olarak farklı programlama dillerini belirtir.

additional_linker_inputs

Etiket listesi; varsayılan []

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

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

copts

Dize listesi; varsayılan değer: []

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken oluşturma" değişikliğine ve Bourne kabuk belirtkelemeye tabidir.

Bu özellikteki her dize, ikili hedef derlemeden önce COPTS sırasına belirtilen sırayla eklenir. İşaretler, bağımlılıklarını değil, yalnızca bu hedefi derlemek için geçerli olur. Bu nedenle, başka bir yere eklenen başlık dosyaları konusunda dikkatli olun. Tüm yollar mevcut paketle değil, çalışma alanına bağlı olmalıdır.

Paket, no_copts_tokenization özelliğini tanımlarsa Bourne kabuk belirtkeleme yalnızca tek bir "Make" değişkeni içeren dizeler için geçerlidir.

defines

Dize listesi; varsayılan değer: []

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeninin değiştirilmesine ve Bourne kabuk belirtkelenmesine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dizenin başına -D eklenir ve bu hedefin yanı sıra bu hedefe ve ona bağlı tüm kurallardaki derleme komut satırına eklenir. Geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine local_defines için değerleri tanımlayın.
includes

Dize listesi; varsayılan değer: []

Derleme satırına eklenecek dizin dosyalarının listesi.

"Değişken yap" değişikliğine tabidir. Her dizenin başına -isystem değeri eklenir ve dize COPTS öğesine eklenir. COPTS'nin aksine, bu işaretler bu kural ve ona bağlı her kural için eklenir. (Not: Bu kuralların bağlı olduğu kurallar değildir.) Geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS öğesine "-I" işaretleri ekleyin.

Başlıklar, src'lere veya hdrs'lara eklenmelidir. Aksi takdirde, derleme korumalı alana alındığında (varsayılan) bağımlı kurallar kullanılamaz.

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

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

Varsayılan olarak, C++ ikili programları //tools/cpp:link_extra_lib ile bağlantılıdır. Bu varsayılan olarak etiket işaretine (//tools/cpp:link_extra_libs) bağlıdır. İşaret ayarlanmadığında bu kitaplık varsayılan olarak boş olur. Etiket işaretinin ayarlanması, zayıf simgeler için geçersiz kılmalar, paylaşılan kitaplık işlevleri için önleyiciler veya özel çalışma zamanı kitaplıkları gibi isteğe bağlı bağımlılıkların bağlanmasına olanak tanır (maloc değişimleri için malloc veya --custom_malloc tercih edilir). Bu özelliğin None olarak ayarlanması bu davranışı devre dışı bırakır.

linkopts

Dize listesi; varsayılan değer: []

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Yap" değişkeni değişikliğine, Bourne kabuk belirteçleştirmesine ve etiket genişletmesine tabi. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS bölümüne eklenir.

Bu listenin $ veya - ile başlamayan her bir öğesinin, deps bölgesindeki 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 bildirilmezse hata bildirilir.

linkshared

Boole; yapılandırılmamış; varsayılan değer False

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

Bu işaretin varlığı, bağlantı işleminin -shared işaretiyle gcc öğesine gerçekleştirileceği ve ortaya çıkan paylaşılan kitaplığın, örneğin bir Java programına yüklenmeye uygun olduğu anlamına gelir. Bununla birlikte, 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 geçmemelidir. Ölçeklenebilirlik açısından bu yaklaşımdan tamamen kaçınmanızı ve java_library ürününün bunun yerine cc_library kurallarına bağlı olmasına izin vermenizi öneririz.

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

linkstatic

Boole; varsayılan değer True

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

Bu seçenek cc_binary için varsayılan olarak etkin, geri kalanı için devre dışıdır.

Etkinleştirilirse ve bu bir ikili program veya test ise bu seçenek, derleme aracına mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a içinde bağlantı vermesini bildirir. Bazı sistem kitaplıkları ve statik kitaplık bulunmayan kitaplıklar da dinamik olarak bağlanabilir. Böylece, oluşturulan yürütülebilir dosya dinamik olarak bağlanmaya devam eder ve bu nedenle yalnızca çoğunlukla statiktir.

Yürütülebilir bir dosyayı bağlamanın üç farklı yolu vardır:

  • Her şeyin statik olarak bağlandığı full_static_link özelliğine sahip STATIC; ör. "gcc -static foo.o libbar.a libbaz.a -lm".
    Bu mod, features özelliğinde fully_static_link değeri belirtilerek etkinleştirilir.
  • 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ığı STATIC.Ör. "gcc foo.o libfoo.a libbaz.a -lm".
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DYNAMIC (dinamik sürüm mevcutsa), ör. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod linkstatic=False belirtilerek etkinleştirilir.

linkstatic özelliği, cc_library() kuralında kullanıldığında farklı bir anlama gelir. Bir C++ kitaplığı için linkstatic=True yalnızca statik bağlantıya izin verildiğini, bu nedenle hiçbir .so oluşturulmayacağını belirtir. linkstatic=False, statik kitaplıkların oluşturulmasını engellemez. Bu özelliğin amacı, dinamik kitaplıkların oluşturulmasını kontrol etmektir.

linkstatic=False ise derleme aracı, *.runfiles alanındaki bağımlı paylaşılan kitaplıklara sembol bağlantıları oluşturur.

local_defines

Dize listesi; varsayılan değer: []

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeninin değiştirilmesine ve Bourne kabuk belirtkelenmesine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dizenin başına -D eklenir ve bu dizenin bağımlılarına değil, bu hedef için derleme komut satırına eklenir.
malloc

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

Malloc'daki varsayılan bağımlılığı geçersiz kılın.

Varsayılan olarak, C++ ikili programları boş bir kitaplık olan //tools/cpp:malloc ile bağlantılıdır. Böylece ikili program, libc Malloc yöntemini kullanır. Bu etiket bir cc_library değerine başvuruda bulunmalıdır. Derleme, C++ dışı bir kural için yapılmışsa bu seçeneğin hiçbir etkisi olmaz. linkshared=True belirtilirse bu özelliğin değeri yoksayılır.

nocopts

Dize; varsayılan değer ""

C++ derleme komutundan eşleşme seçeneklerini kaldırın. "Yap" değişkeni değişikliğine tabidir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden mevcut tüm COPTS (kuralın copts özelliğinde açıkça belirtilen değerler dahil), bu kuralı derlemek için COPTS öğesinden kaldırılacak. Bu özelliğe nadiren ihtiyaç duyulur.
stamp

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

Derleme bilgilerinin ikili programda kodlanıp kodlanmayacağını belirler. Olası değerler:
  • stamp = 1: --nostamp derlemelerinde bile, derleme bilgilerini her zaman ikili programda damgalayın. Potansiyel olarak ikili program ve buna bağlı tüm aşağı akış işlemleri için uzaktan önbelleğe almayı sonlandıracağından bu ayardan kaçınılmalıdır.
  • stamp = 0: Derleme bilgilerini her zaman sabit değerlerle değiştirin. Bu yöntem, derleme sonucunu önbelleğe alma konusunda iyi bir sonuç verir.
  • stamp = -1: Derleme bilgilerinin yerleştirilmesi --[no]stamp işaretiyle kontrol edilir.

Bağımlılıkları değişmediği sürece damgalı ikili programlar yeniden oluşturulmaz.

win_def_file

Etiket; varsayılan değer None

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ığı bağlarken simgeleri dışa aktarmak için kullanılabilir.

cc_import

Kural kaynağını göster
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, 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 bir kitaplığı bağlama (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Paylaşılan bir kitaplığı arayüz kitaplığına bağlama (Windows)
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 (Windows) ile bağlama
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ğlama
Unix'te:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

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

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
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",
)

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

# second will link to mylib.dll through mylib.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; gerekli

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan []

Hedefin bağımlı olduğu diğer kitaplıkların listesi. Çoğu derleme kuralı tarafından tanımlanan tipik özellikler sayfasında deps ile ilgili genel yorumlara göz atın.
hdrs

Etiket listesi; varsayılan []

Bağımlı kurallardaki kaynaklar tarafından doğrudan eklenecek olan bu önceden derlenmiş kitaplık tarafından yayınlanan başlık dosyalarının listesi.

Boole; varsayılan değer False

1 ise bu C++ önceden derlenmiş kitaplığına bağlı olan (doğrudan veya dolaylı olarak) herhangi bir ikili program, statik kitaplıkta arşivlenen tüm nesne dosyalarına, bazıları ikili program tarafından başvurulan hiçbir simge içermese bile bağlantı verir. Bu, kodunuz ikili programda kod tarafından açıkça çağrılmadığında (ör. kodunuz bir hizmet tarafından sağlanan bir geri çağırmayı almak için kaydedildiyse) yararlıdır.

Her zamanlink, Windows'da bilinen bir sorun nedeniyle VS 2017 ile çalışmıyorsa lütfen 2017 sürümünüzü en son sürüme yükseltin.

interface_library

Etiket; varsayılan değer None

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

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

shared_library

Etiket; varsayılan değer None

Önceden derlenmiş tek bir paylaşılan kitaplık. Bazel, çalışma zamanı boyunca ona bağlı olan ikili program için kullanılabilir olmasını sağlar.

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

static_library

Etiket; varsayılan değer None

Önceden derlenmiş tek bir statik kitaplık.

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

system_provided

Boole; varsayılan değer False

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

cc_library

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

Üstbilgi dahil etme kontrolü

Derlemede kullanılan tüm üst bilgi dosyaları, cc_* kurallarının hdrs veya srcs kurallarına göre tanımlanmalıdır. Zorunlu kılınır.

cc_library kuralları için hdrs içindeki başlıklar, kitaplığın herkese açık arayüzünü oluşturur ve hem kitaplığın hdrs hem de srcs alanındaki dosyalardan ve ayrıca kitaplığı deps öğelerinde listeleyen cc_* kuralının hdrs ve srcs konumundaki dosyalardan doğrudan eklenebilir. srcs içindeki başlıklar yalnızca kitaplığın hdrs ve srcs alanındaki dosyalardan doğrudan eklenmelidir. hdrs bölümüne mi yoksa srcs öğesine mi başlık yerleştireceğinize karar verirken bu kitaplıktaki tüketicilerin bunu doğrudan dahil etmelerini isteyip istemediğinizi sormanız gerekir. Bu, programlama dillerinde public ve private görünürlüğü arasındaki kararla hemen hemen aynıdır.

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

Bu kuralları görmek 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 etmeler aşağıdaki tabloda listelenmiştir. Örneğin, foo.cc öğesinin foo.h ve bar.h öğelerini doğrudan içermesine izin verilir ancak baz.h parametresi eklenemez.

Dosya dahilİzin verilen dahil etmeler
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
çubuk-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 kontrolü kuralları yalnızca doğrudan dahil etmeler için geçerlidir. Yukarıdaki örnekte foo.cc öğesinin, baz.h değerini de içerebilen bar.h öğesini içermesine izin verilir. Buna karşılık, baz-impl.h öğesini de içermesine izin verilir. Teknik olarak, .cc dosyası derlenen işlemi, geçişli deps kapatma işlemindeki herhangi bir cc_library içindeki hdrs veya srcs içindeki başlık dosyalarını geçişli olarak içerebilir. Bu durumda, derleyici foo.cc derlerken baz.h ve baz-impl.h okuyabilir ancak foo.cc, #include "baz.h" içermemelidir. Buna izin verilmesi için baz öğesinin, foo öğesinin deps öğesine eklenmesi gerekir.

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

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan []

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

Bunlar, cc_library veya objc_library hedef olabilir.

srcs

Etiket listesi; varsayılan []

Hedefi oluşturmak için işlenen C ve C++ dosyalarının listesi. Bunlar, oluşturulmamış (normal kaynak kodu) veya üretilmiş C/C++ kaynak ve başlık dosyalarıdır.

Tüm .cc, .c ve .cpp dosyaları derlenecek. Bunlar oluşturulmuş dosyalar olabilir: Adlandırılmış bir dosya başka bir kuralın outs içinde yer alıyorsa bu kural otomatik olarak diğer kurala bağlı olur.

.h dosyası derlenmez ancak bu kuraldaki kaynaklar tarafından dahil edilebilir. Hem .cc hem de .h dosyası doğrudan bu srcs içinde veya deps bağımsız değişkeninde listelenen herhangi bir kuralın hdrs öğesinde listelenen üst bilgileri içerebilir.

Tüm #included dosyaları, bu kuralın srcs özelliğinde veya referans verilen cc_library()'lerin hdrs özelliğinde belirtilmelidir. Önerilen stil, bir kitaplıkla ilişkilendirilmiş başlıkların söz konusu kitaplığın hdrs özelliğinde listelenmesi ve bu kuralın kaynaklarıyla ilişkili diğer tüm başlıkların srcs politikasında listelenmesi içindir. Daha ayrıntılı açıklama için "Üstbilgi dahil etme kontrolü" bölümüne bakın.

Bir kuralın adı srcs içindeyse bu kural otomatik olarak ona bağlıdır. Adlandırılmış kuralın outs'leri C veya C++ kaynak dosyalarıysa bu kuralda derlenirler. Kitaplık dosyalarıysa birbirine bağlanırlar.

İzin verilen srcs dosya türleri:

  • C ve C++ kaynak dosyaları: .c, .cc, .cpp, .cxx, .c++, .C
  • C ve C++ üstbilgi 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
  • Paylaşılan kitaplık, sürümü olan veya sürümü ayarlanmadı: .so, .so.version
  • Nesne dosyası: .o, .pic.o

...ve bu dosyaları oluşturan kurallar. Farklı uzantılar, gcc kurallarına uygun olarak farklı programlama dillerini belirtir.

hdrs

Etiket listesi; varsayılan []

Bağımlı kurallardaki kaynaklar tarafından doğrudan eklenecek bu kitaplık tarafından yayınlanan başlık dosyalarının listesi.

Bu, kitaplığın arayüzünü açıklayan başlık dosyalarını tanımlamak için kesinlikle tercih edilen konumdur. Bu üst bilgiler, kaynaklar tarafından bu kurala veya bağımlı kurallara dahil edilmek üzere kullanıma sunulur. Bu kitaplığın bir istemcisi tarafından eklenmesi amaçlanmayan başlıklar, yayınlanan bir üstbilgide yer alıyor olsalar bile srcs özelliğinde listelenmelidir. Daha ayrıntılı açıklama için "Üstbilgi dahil etme kontrolü" bölümüne bakın.

additional_compiler_inputs

Etiket listesi; varsayılan []

Örneğin, temizleyici yoksayılanlar listeleri gibi derleyici komut satırına iletmek isteyebileceğiniz tüm ek dosyalar. Burada belirtilen dosyalar daha sonra $(location) işleviyle copt'lerde kullanılabilir.
additional_linker_inputs

Etiket listesi; varsayılan []

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

1 ise bu C++ kitaplığına (doğrudan veya dolaylı olarak) bağlı olan herhangi bir ikili program, bazıları ikili program tarafından başvurulan semboller içermese bile srcs içinde listelenen dosyaların tüm nesne dosyalarına bağlantı verir. Bu, kodunuz ikili programda kod tarafından açıkça çağrılmadığında (ör. kodunuz bir hizmet tarafından sağlanan bir geri çağırmayı almak için kaydedildiyse) yararlıdır.

Her zamanlink, Windows'da bilinen bir sorun nedeniyle VS 2017 ile çalışmıyorsa lütfen 2017 sürümünüzü en son sürüme yükseltin.

copts

Dize listesi; varsayılan değer: []

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken oluşturma" değişikliğine ve Bourne kabuk belirtkelemeye tabidir.

Bu özellikteki her dize, ikili hedef derlemeden önce COPTS sırasına belirtilen sırayla eklenir. İşaretler, bağımlılıklarını değil, yalnızca bu hedefi derlemek için geçerli olur. Bu nedenle, başka bir yere eklenen başlık dosyaları konusunda dikkatli olun. Tüm yollar mevcut paketle değil, çalışma alanına bağlı olmalıdır.

Paket, no_copts_tokenization özelliğini tanımlarsa Bourne kabuk belirtkeleme yalnızca tek bir "Make" değişkeni içeren dizeler için geçerlidir.

defines

Dize listesi; varsayılan değer: []

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeninin değiştirilmesine ve Bourne kabuk belirtkelenmesine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dizenin başına -D eklenir ve bu hedefin yanı sıra bu hedefe ve ona bağlı tüm kurallardaki derleme komut satırına eklenir. Geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine local_defines için değerleri tanımlayın.
implementation_deps

Etiket listesi; varsayılan []

Kitaplığın hedeflediği diğer kitaplıkların listesi. deps işlevinin aksine, bu kitaplıkların başlıkları ve yolları (ve tüm geçişli depoları) yalnızca bu kitaplığın derlenmesi için kullanılır, ona bağlı kitaplıklar için kullanılmaz. implementation_deps ile belirtilen kitaplıklar, bu kitaplığa dayanan ikili hedeflerde bağlı kalmaya devam eder.

Kullanım şimdilik cc_libraries ile sınırlıdır ve --experimental_cc_implementation_deps bayrağıyla korunur.

include_prefix

Dize; varsayılan değer ""

Bu kuralın başlıklarının yollarına eklenecek ön ek.

Ayarlandığında bu kuralın hdrs özelliğindeki başlıklara, bu özelliğin depoyla göreli yolunun başına eklenen değeri üzerinden erişilebilir.

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

includes

Dize listesi; varsayılan değer: []

Derleme satırına eklenecek dizin dosyalarının listesi.

"Değişken yap" değişikliğine tabidir. Her dizenin başına -isystem değeri eklenir ve dize COPTS öğesine eklenir. COPTS'nin aksine, bu işaretler bu kural ve ona bağlı her kural için eklenir. (Not: Bu kuralların bağlı olduğu kurallar değildir.) Geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS öğesine "-I" işaretleri ekleyin.

Başlıklar, src'lere veya hdrs'lara eklenmelidir. Aksi takdirde, derleme korumalı alana alındığında (varsayılan) bağımlı kurallar kullanılamaz.

linkopts

Dize listesi; varsayılan değer: []

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Yap" değişkeni değişikliğine, Bourne kabuk belirteçleştirmesine ve etiket genişletmesine tabi. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS bölümüne eklenir.

Bu listenin $ veya - ile başlamayan her bir öğesinin, deps bölgesindeki 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 bildirilmezse hata bildirilir.

linkstamp

Etiket; varsayılan değer None

Belirtilen C++ kaynak dosyasını aynı anda derler ve nihai ikili programa bağlar. Bu hileli yaklaşım, zaman damgası bilgilerini ikili programlara dahil etmek için gereklidir. Kaynak dosyayı normalde olduğu gibi bir nesne dosyasında derlersek zaman damgası yanlış olur. Bir linkstamp derlemesi, belirli bir derleyici işareti grubunu içeremez. 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çenek yalnızca base paketinde gerekli olmalıdır.
linkstatic

Boole; varsayılan değer False

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

Bu seçenek cc_binary için varsayılan olarak etkin, geri kalanı için devre dışıdır.

Etkinleştirilirse ve bu bir ikili program veya test ise bu seçenek, derleme aracına mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a içinde bağlantı vermesini bildirir. Bazı sistem kitaplıkları ve statik kitaplık bulunmayan kitaplıklar da dinamik olarak bağlanabilir. Böylece, oluşturulan yürütülebilir dosya dinamik olarak bağlanmaya devam eder ve bu nedenle yalnızca çoğunlukla statiktir.

Yürütülebilir bir dosyayı bağlamanın üç farklı yolu vardır:

  • Her şeyin statik olarak bağlandığı full_static_link özelliğine sahip STATIC; ör. "gcc -static foo.o libbar.a libbaz.a -lm".
    Bu mod, features özelliğinde fully_static_link değeri belirtilerek etkinleştirilir.
  • 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ığı STATIC.Ör. "gcc foo.o libfoo.a libbaz.a -lm".
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DYNAMIC (dinamik sürüm mevcutsa), ör. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod linkstatic=False belirtilerek etkinleştirilir.

linkstatic özelliği, cc_library() kuralında kullanıldığında farklı bir anlama gelir. Bir C++ kitaplığı için linkstatic=True yalnızca statik bağlantıya izin verildiğini, bu nedenle hiçbir .so oluşturulmayacağını belirtir. linkstatic=False, statik kitaplıkların oluşturulmasını engellemez. Bu özelliğin amacı, dinamik kitaplıkların oluşturulmasını kontrol etmektir.

linkstatic=False ise derleme aracı, *.runfiles alanındaki bağımlı paylaşılan kitaplıklara sembol bağlantıları oluşturur.

local_defines

Dize listesi; varsayılan değer: []

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeninin değiştirilmesine ve Bourne kabuk belirtkelenmesine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dizenin başına -D eklenir ve bu dizenin bağımlılarına değil, bu hedef için derleme komut satırına eklenir.
nocopts

Dize; varsayılan değer ""

C++ derleme komutundan eşleşme seçeneklerini kaldırın. "Yap" değişkeni değişikliğine tabidir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden mevcut tüm COPTS (kuralın copts özelliğinde açıkça belirtilen değerler dahil), bu kuralı derlemek için COPTS öğesinden kaldırılacak. Bu özelliğe nadiren ihtiyaç duyulur.
strip_include_prefix

Dize; varsayılan değer ""

Bu kuralın üstbilgilerinin yollarından çıkarılacak ön ek.

Ayarlandığında, bu kuralın hdrs özelliğindeki başlıklara, bu önek kesilerek kendi yollarında erişilebilir.

Göreli bir yolsa, pakete bağlı bir yol olarak alınır. Mutlaksa depoya bağlı bir yol olarak kabul edilir.

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

textual_hdrs

Etiket listesi; varsayılan []

Bağımlı kurallardaki kaynaklar tarafından metin olarak eklenecek bu kitaplık tarafından yayınlanan başlık dosyalarının listesi.

Bu, kendi başına derlanamayan üst bilgi dosyalarının bildirildiği konumdur. Diğer bir deyişle, geçerli bir kod oluşturmak için bunların her zaman diğer kaynak dosyalar tarafından metin olarak eklenmesi gerekir.

win_def_file

Etiket; varsayılan değer None

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ığı bağlarken simgeleri dışa aktarmak için kullanılabilir.

cc_proto_library

Kural kaynağını göster
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

cc_proto_library, .proto dosyadan C++ kodu oluşturur.

deps, proto_library kuralına işaret etmelidir.

Örnek:

cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan []

C++ kodu oluşturulacak proto_library kurallarının listesi.

cc_shared_library

Kural kaynağını göster
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)

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

Ö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 arasında statik bağlantı oluşturur. İkincisi ise geçişli bağımlılıktır. Zaten dynamic_dep bar_shared tarafından dinamik olarak sağlandığı için bar ile bağlantı oluşturmaz.

foo_shared, hangi sembollerin dışa aktarılması gerektiğini kontrol etmek için bağlayıcı komut dosyası *.lds dosyası kullanır. cc_shared_library kural mantığı, hangi simgelerin dışa aktarılacağını kontrol etmez. Yalnızca iki paylaşılan kitaplığın aynı hedefleri dışa aktarması durumunda analiz aşamasında hata vermek için dışa aktarılacağı varsayılan öğeler kullanılır.

cc_shared_library ürününün 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ılacağı 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. baz öğesini de bar_shared alanına bağlamak isteseydik tags = ["LINKABLE_MORE_THAN_ONCE"] öğesini baz öğesine eklememiz gerekirdi.

shared_lib_name özelliği nedeniyle, bar_shared tarafından oluşturulan dosya, Linux'ta varsayılan olarak sahip olacağı libbar.so adının aksine bar.so adına sahip 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ığıyla hedef oluşturduğunuzda ortaya çıkar. Bu sorunu düzeltmek için cc_shared_library bağımlılarından birinde kitaplıkların dışa aktarılmasını durdurmanız gerekir.

Bu durum, aynı hedefi statik olarak birbirine bağlayan iki farklı cc_shared_library bağımlılığıyla yeni bir cc_shared_library oluşturduğunuzda gerçekleşir. Dışa aktarmalardaki hataya benzer.

Bu sorunu düzeltmenin bir yolu, kitaplığı cc_shared_library bağımlılıklarından birine bağlamayı durdurmaktır. Aynı zamanda, hâlâ bağlantı verenin kitaplığı dışa aktarması gerekir. Böylece, kitaplığı bağlamayan kullanıcının simgeleri görebilir. Diğer bir yöntem de hedefi dışa aktaran üçüncü bir kitaplık kullanmaktır. Üçüncü bir yöntem de suçlu cc_library öğesini LINKABLE_MORE_THAN_ONCE ile etiketlemektir. Ancak bu düzeltme nadiren uygulanır ve cc_library öğesini birden çok kez bağlamanın güvenli olduğundan kesinlikle emin olmanız gerekir.

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

Bu, deps öğenizin geçişli olarak kapatılmasındaki bir kitaplığa, cc_shared_library bağımlılıklarından biri olmadan ulaşılabileceği ancak dynamic_deps içindeki farklı bir cc_shared_library öğesine zaten bağlı olduğu ve dışa aktarılmadığı anlamına gelir.

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

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

Önceden derlenmiş bir dinamik kitaplığınız varsa bunun şu anda oluşturduğunuz geçerli cc_shared_library hedefine statik olarak bağlanması gerekmez ve bağlanamaz. Bu nedenle, cc_shared_library öğesinin deps içine ait değil. Bu önceden derlenmiş dinamik kitaplık cc_libraries uygulamanızdan birinin bağımlılığıysa cc_library öğesinin doğrudan buna bağımlı olması gerekir.

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

Geçerli kuralda dinamik bağımlılıklarınızdan biri tarafından dışa aktarılmakta olan bir hedefi dışa aktarmayı iddia ediyorsanız bu hatayı görürsünüz.

Bunu düzeltmek için hedefi deps öğesinden kaldırın ve dinamik bağımlılıkta hedefi kullanın veya exports_filter öğesinin bu hedefi yakalamadığından emin olun.

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan []

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

Bu doğrudan sunumların geçişli kitaplık bağımlılıkları, dynamic_deps içinde bir cc_shared_library ile önceden 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 herhangi bir hedefin paylaşılan kitaplık tarafından dışa aktarıldığını varsayar. Kural uygulaması, paylaşılan nesne tarafından hangi simgelerin dışa aktarılması gerektiği konusunda bağlayıcının bilgilendirilmesini sağlamaz. Kullanıcı bu işlemi, bağlayıcı komut dosyaları veya kaynak koddaki görünürlük bildirimleri aracılığıyla yapmalıdır.

Uygulama, aynı kitaplık birden fazla cc_shared_library öğesine statik olarak bağlandığında da hataları tetikler. Bu durumdan kaçınmak için cc_library.tags öğesine "LINKABLE_MORE_THAN_ONCE" eklemeniz veya "cc_library" öğesini paylaşılan kitaplıklardan birinin dışa aktarması olarak listeleyerek birinin diğerinin dynamic_dep işlemi yapması için bunu yapmanız gerekir.

additional_linker_inputs

Etiket listesi; varsayılan []

Bağlayıcıya iletmek isteyebileceğiniz tüm ek dosyalar (ör. bağlayıcı komut dosyaları). Bu dosya hakkında bilgi sahibi olmak için bağlayıcının ihtiyaç duyduğu bağlayıcı işaretlerini ayrı olarak iletmeniz gerekir. Bu işlemi user_link_flags özelliği ile yapabilirsiniz.
dynamic_deps

Etiket listesi; varsayılan []

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

cc_shared_library uygulaması, zaten farklı bir cc_shared_library tarafından sağlandığı için geçişli deps içindeki hangi cc_libraries öğesinin bağlanmaması gerektiğine karar vermek için dynamic_deps listesini (geçişli olarak, yani geçerli hedefin dynamic_deps öğesinin dynamic_deps) kullanır.

exports_filter

Dize listesi; varsayılan değer: []

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

Herhangi bir deps hedefinin paylaşılan kitaplık tarafından zaten dışa aktarıldığı anlaşılıyor. Bu özellik, paylaşılan kitaplık tarafından dışa aktarılan ancak deps öğesinin geçişli bağımlılığı olan tüm hedefleri listelemek için kullanılmalıdır.

Bu özelliğin bu hedeflere 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 dizedir. Bu özelliğe bir hedef yerleştirilirken bunun, paylaşılan kitaplığın ilgili hedefteki simgeleri dışa aktardığı iddiası olarak kabul edildiğini unutmayın. cc_shared_library mantığı, bağlayıcıya hangi sembollerin dışa aktarılması gerektiğini söylemez.

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

foo/BUILD içindeki herhangi bir hedefi hesaba katmak için //foo:__package__

foo/BUILD içindeki herhangi bir hedefi veya foo/ bar/BUILD gibi foo/altındaki başka bir paketi hesaba katmak için //foo:__subpackages__

shared_lib_name

Dize; varsayılan değer ""

cc_shared_library, paylaşılan kitaplık çıkış dosyası için varsayılan olarak hedefin ve platformun adına göre bir ad kullanır. Buna bir uzantı ve bazen bir ön ek 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.

Dize listesi; varsayılan değer: []

Bağlayıcıya iletmek isteyebileceğiniz tüm ek işaretler. Örneğin, bağlayıcının additional_linker_inputs aracılığıyla iletilen bir bağlayıcı komut dosyasını bilmesi için şunu 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

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ığı bağlarken simgeleri dışa aktarmak için kullanılabilir.

fdo_prefetch_hints

Kural kaynağını göster
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Çalışma alanında veya belirtilen bir mutlak yoldaki FDO önceden getirme ipucu profilini temsil eder. Örnekler:

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

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

profile

Etiket; varsayılan değer None

İpuçları profilinin etiketi. İpucu dosyasının .afdo uzantısı vardır Etiket ayrıca bir fdo_Mutlak_path_profile kuralına işaret edebilir.

fdo_profile

Kural kaynağını göster
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Çalışma alanında veya belirtilen mutlak yoldaki bir FDO profilini temsil eder. Örnekler:

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

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

absolute_path_profile

Dize; varsayılan değer ""

FDO profilinin mutlak yolu. FDO dosyası yalnızca .afdo uzantısına sahip olabilir.
profile

Etiket; varsayılan değer None

FDO profilinin veya onu oluşturan kuralın etiketi. FDO dosyası şu uzantılardan birine sahip olabilir: dizine eklenmemiş LLVM profili için .profraw, dizine eklenmiş LLVM profili için .profdata, LLVM profraw profiline sahip .zip, AutoFDO profili için .afdo, XBinary profili için .xfdo. Etiket ayrıca bir fdo_Mutlak_path_profile kuralına da işaret edebilir.
proto_profile

Etiket; varsayılan değer None

Protobuf profilinin etiketi.

memprof_profile

Kural kaynağını göster
memprof_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Çalışma alanında veya belirtilen mutlak yoldaki bir MEMPROF profilini temsil eder. Örnekler:

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

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

absolute_path_profile

Dize; varsayılan değer ""

MEMPROF profilinin mutlak yolu. Dosya yalnızca .profdata veya .zip uzantısına sahip olabilir (zip dosyasının bir memprof.profdata dosyası içermesi gerekir).
profile

Etiket; varsayılan değer None

MEMPROF profilinin etiketi. Profilin .profdata uzantısına (dizine eklenmiş/sembolize memprof profili için) veya memprof .profdata dosyası içeren bir zipfile için.zip uzantısına sahip olması beklenir. Etiket ayrıca bir fdo_Mutlak_path_profile kuralına da işaret edebilir.

propeller_optimize

Kural kaynağını göster
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

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

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

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

ld_profile

Etiket; varsayılan değer None

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

cc_test

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

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan []

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

Bunlar, cc_library veya objc_library hedef olabilir.

srcs

Etiket listesi; varsayılan []

Hedefi oluşturmak için işlenen C ve C++ dosyalarının listesi. Bunlar, oluşturulmamış (normal kaynak kodu) veya üretilmiş C/C++ kaynak ve başlık dosyalarıdır.

Tüm .cc, .c ve .cpp dosyaları derlenecek. Bunlar oluşturulmuş dosyalar olabilir: Adlandırılmış bir dosya başka bir kuralın outs içinde yer alıyorsa bu kural otomatik olarak diğer kurala bağlı olur.

.h dosyası derlenmez ancak bu kuraldaki kaynaklar tarafından dahil edilebilir. Hem .cc hem de .h dosyası doğrudan bu srcs içinde veya deps bağımsız değişkeninde listelenen herhangi bir kuralın hdrs öğesinde listelenen üst bilgileri içerebilir.

Tüm #included dosyaları, bu kuralın srcs özelliğinde veya referans verilen cc_library()'lerin hdrs özelliğinde belirtilmelidir. Önerilen stil, bir kitaplıkla ilişkilendirilmiş başlıkların söz konusu kitaplığın hdrs özelliğinde listelenmesi ve bu kuralın kaynaklarıyla ilişkili diğer tüm başlıkların srcs politikasında listelenmesi içindir. Daha ayrıntılı açıklama için "Üstbilgi dahil etme kontrolü" bölümüne bakın.

Bir kuralın adı srcs içindeyse bu kural otomatik olarak ona bağlıdır. Adlandırılmış kuralın outs'leri C veya C++ kaynak dosyalarıysa bu kuralda derlenirler. Kitaplık dosyalarıysa birbirine bağlanırlar.

İzin verilen srcs dosya türleri:

  • C ve C++ kaynak dosyaları: .c, .cc, .cpp, .cxx, .c++, .C
  • C ve C++ üstbilgi 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
  • Paylaşılan kitaplık, sürümü olan veya sürümü ayarlanmadı: .so, .so.version
  • Nesne dosyası: .o, .pic.o

...ve bu dosyaları oluşturan kurallar. Farklı uzantılar, gcc kurallarına uygun olarak farklı programlama dillerini belirtir.

additional_linker_inputs

Etiket listesi; varsayılan []

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

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

copts

Dize listesi; varsayılan değer: []

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken oluşturma" değişikliğine ve Bourne kabuk belirtkelemeye tabidir.

Bu özellikteki her dize, ikili hedef derlemeden önce COPTS sırasına belirtilen sırayla eklenir. İşaretler, bağımlılıklarını değil, yalnızca bu hedefi derlemek için geçerli olur. Bu nedenle, başka bir yere eklenen başlık dosyaları konusunda dikkatli olun. Tüm yollar mevcut paketle değil, çalışma alanına bağlı olmalıdır.

Paket, no_copts_tokenization özelliğini tanımlarsa Bourne kabuk belirtkeleme yalnızca tek bir "Make" değişkeni içeren dizeler için geçerlidir.

defines

Dize listesi; varsayılan değer: []

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeninin değiştirilmesine ve Bourne kabuk belirtkelenmesine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dizenin başına -D eklenir ve bu hedefin yanı sıra bu hedefe ve ona bağlı tüm kurallardaki derleme komut satırına eklenir. Geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine local_defines için değerleri tanımlayın.
includes

Dize listesi; varsayılan değer: []

Derleme satırına eklenecek dizin dosyalarının listesi.

"Değişken yap" değişikliğine tabidir. Her dizenin başına -isystem değeri eklenir ve dize COPTS öğesine eklenir. COPTS'nin aksine, bu işaretler bu kural ve ona bağlı her kural için eklenir. (Not: Bu kuralların bağlı olduğu kurallar değildir.) Geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS öğesine "-I" işaretleri ekleyin.

Başlıklar, src'lere veya hdrs'lara eklenmelidir. Aksi takdirde, derleme korumalı alana alındığında (varsayılan) bağımlı kurallar kullanılamaz.

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

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

Varsayılan olarak, C++ ikili programları //tools/cpp:link_extra_lib ile bağlantılıdır. Bu varsayılan olarak etiket işaretine (//tools/cpp:link_extra_libs) bağlıdır. İşaret ayarlanmadığında bu kitaplık varsayılan olarak boş olur. Etiket işaretinin ayarlanması, zayıf simgeler için geçersiz kılmalar, paylaşılan kitaplık işlevleri için önleyiciler veya özel çalışma zamanı kitaplıkları gibi isteğe bağlı bağımlılıkların bağlanmasına olanak tanır (maloc değişimleri için malloc veya --custom_malloc tercih edilir). Bu özelliğin None olarak ayarlanması bu davranışı devre dışı bırakır.

linkopts

Dize listesi; varsayılan değer: []

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Yap" değişkeni değişikliğine, Bourne kabuk belirteçleştirmesine ve etiket genişletmesine tabi. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS bölümüne eklenir.

Bu listenin $ veya - ile başlamayan her bir öğesinin, deps bölgesindeki 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 bildirilmezse hata bildirilir.

linkstatic

Boole; varsayılan değer False

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

Bu seçenek cc_binary için varsayılan olarak etkin, geri kalanı için devre dışıdır.

Etkinleştirilirse ve bu bir ikili program veya test ise bu seçenek, derleme aracına mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a içinde bağlantı vermesini bildirir. Bazı sistem kitaplıkları ve statik kitaplık bulunmayan kitaplıklar da dinamik olarak bağlanabilir. Böylece, oluşturulan yürütülebilir dosya dinamik olarak bağlanmaya devam eder ve bu nedenle yalnızca çoğunlukla statiktir.

Yürütülebilir bir dosyayı bağlamanın üç farklı yolu vardır:

  • Her şeyin statik olarak bağlandığı full_static_link özelliğine sahip STATIC; ör. "gcc -static foo.o libbar.a libbaz.a -lm".
    Bu mod, features özelliğinde fully_static_link değeri belirtilerek etkinleştirilir.
  • 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ığı STATIC.Ör. "gcc foo.o libfoo.a libbaz.a -lm".
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DYNAMIC (dinamik sürüm mevcutsa), ör. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod linkstatic=False belirtilerek etkinleştirilir.

linkstatic özelliği, cc_library() kuralında kullanıldığında farklı bir anlama gelir. Bir C++ kitaplığı için linkstatic=True yalnızca statik bağlantıya izin verildiğini, bu nedenle hiçbir .so oluşturulmayacağını belirtir. linkstatic=False, statik kitaplıkların oluşturulmasını engellemez. Bu özelliğin amacı, dinamik kitaplıkların oluşturulmasını kontrol etmektir.

linkstatic=False ise derleme aracı, *.runfiles alanındaki bağımlı paylaşılan kitaplıklara sembol bağlantıları oluşturur.

local_defines

Dize listesi; varsayılan değer: []

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeninin değiştirilmesine ve Bourne kabuk belirtkelenmesine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dizenin başına -D eklenir ve bu dizenin bağımlılarına değil, bu hedef için derleme komut satırına eklenir.
malloc

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

Malloc'daki varsayılan bağımlılığı geçersiz kılın.

Varsayılan olarak, C++ ikili programları boş bir kitaplık olan //tools/cpp:malloc ile bağlantılıdır. Böylece ikili program, libc Malloc yöntemini kullanır. Bu etiket bir cc_library değerine başvuruda bulunmalıdır. Derleme, C++ dışı bir kural için yapılmışsa bu seçeneğin hiçbir etkisi olmaz. linkshared=True belirtilirse bu özelliğin değeri yoksayılır.

nocopts

Dize; varsayılan değer ""

C++ derleme komutundan eşleşme seçeneklerini kaldırın. "Yap" değişkeni değişikliğine tabidir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden mevcut tüm COPTS (kuralın copts özelliğinde açıkça belirtilen değerler dahil), bu kuralı derlemek için COPTS öğesinden kaldırılacak. Bu özelliğe nadiren ihtiyaç duyulur.
stamp

Tam sayı; varsayılan değer 0

Derleme bilgilerinin ikili programda kodlanıp kodlanmayacağını belirler. Olası değerler:
  • stamp = 1: --nostamp derlemelerinde bile, derleme bilgilerini her zaman ikili programda damgalayın. Potansiyel olarak ikili program ve buna bağlı tüm aşağı akış işlemleri için uzaktan önbelleğe almayı sonlandıracağından bu ayardan kaçınılmalıdır.
  • stamp = 0: Derleme bilgilerini her zaman sabit değerlerle değiştirin. Bu yöntem, derleme sonucunu önbelleğe alma konusunda iyi bir sonuç verir.
  • stamp = -1: Derleme bilgilerinin yerleştirilmesi --[no]stamp işaretiyle kontrol edilir.

Bağımlılıkları değişmediği sürece damgalı ikili programlar yeniden oluşturulmaz.

win_def_file

Etiket; varsayılan değer None

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ığı bağlarken simgeleri dışa aktarmak için kullanılabilir.

cc_toolchain

Kural kaynağını göster
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_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)

C++ araç zincirini temsil eder.

Bu kural şunlardan sorumludur:

  • C++ işlemlerinin çalışması için gereken tüm yapılar toplanıyor. Bu işlem all_files, compiler_files, linker_files gibi özellikler veya _files ile biten diğer özellikler tarafından yapılır. Bunlar, gerekli tüm dosyaları globbing için en yaygın dosya gruplarıdır.
  • C++ işlemleri için doğru komut satırları oluşturma. Bu işlem, CcToolchainConfigInfo sağlayıcısı kullanılarak gerçekleştirilir (ayrıntılar aşağıdadır).

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 belgeleri için de bu sayfaya bakın.

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

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

all_files

Label; zorunlu

Tüm cc_toolchain yapılarının koleksiyonu. Bu yapılar, rules_cc ile ilgili tüm işlemlere giriş olarak eklenir (aşağıdaki özelliklerden daha hassas yapı grupları kullanan işlemler hariç). Bazel, all_files öğesinin yapı sağlayan diğer tüm özelliklerin üst kümesi olduğunu varsayar (ör. linkstamp derlemesi, hem derleme hem de bağlantı dosyaları gerektirdiğinden all_files gerekir).

cc_toolchain.files bunu içerir ve C++ araç zincirini kullanan tüm Starlark kuralları tarafından kullanılır.

ar_files

Etiket; varsayılan değer None

Arşivleme işlemleri için gereken tüm cc_toolchain yapılarının koleksiyonu.

as_files

Etiket; varsayılan değer None

Montaj işlemleri için gereken tüm cc_toolchain yapılarının koleksiyonu.

compiler_files

Label; zorunlu

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

Etiket; varsayılan değer None

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

Etiket; varsayılan değer None

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

Label; zorunlu

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

Etiket; varsayılan değer None

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

Bu anahtar, "static_link_cpp_runtimes" özelliği etkinleştirildiğinde kullanılır ve bağımlılıkları dinamik olarak bağlarız.

exec_transition_for_inputs

Boole; varsayılan değer True

Geçiş olmaması (yani varsayılan olarak hedef platform) yerine tüm dosya girişlerini yönetici platformu için cc_toolchain biçiminde derlemek için bu değeri True olarak ayarlayın.
libc_top

Etiket; varsayılan değer None

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

Label; zorunlu

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

Etiket; varsayılan değer None

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

Label; zorunlu

Objcopy işlemleri için gereken tüm cc_toolchain yapılarının koleksiyonu.
static_runtime_lib

Etiket; varsayılan değer None

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 kullanılır ve bağımlılıkları statik olarak bağlarız.

strip_files

Label; zorunlu

Banner işlemleri için gereken tüm cc_toolchain yapılarının koleksiyonu.
supports_header_parsing

Boole; varsayılan değer False

cc_toolchain, başlık ayrıştırma işlemlerini destekliyorsa Doğru değerine ayarlayın.
supports_param_files

Boole; varsayılan değer True

cc_toolchain, bağlantı işlemleri için param dosyalarının kullanılmasını desteklediğinde bu değeri True olarak ayarlayın.
toolchain_config

Label; zorunlu

cc_toolchain_config_info özelliğini sağlayan kuralın etiketi.
toolchain_identifier

Dize; yapılandırılmamış; 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, CROSSTOOL.toolchain ile ilişkilendirmek için önerilen yöntem budur. Bu değer, toolchain_config özelliğiyle değiştirilecek (#5380).

cc_toolchain_suite

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

C++ araç zinciri koleksiyonlarını temsil eder.

Bu kural şunlardan sorumludur:

  • Alakalı tüm C++ araç zincirleri toplanıyor.
  • Bazel'a iletilen --cpu ve --compiler seçeneklerine bağlı olarak bir araç zinciri belirlemek.

Ayrıntılı C++ araç zinciri yapılandırması ve araç zinciri seçim belgeleri için de bu sayfaya bakın.

Bağımsız değişkenler

Özellikler
name

Ad; gerekli

Bu hedef için benzersiz bir ad.

toolchains

Sözlük dizelerini etiketlere eşleme; nonconfigured; gerekli

"<cpu>" veya "<cpu>|<derleyici>" dizelerinden bir cc_toolchain etiketine sahip harita. "<cpu>", Bazel'a yalnızca --cpu iletildiğinde ve "<cpu>|<derleyici>", Bazel'a hem --cpu hem de --compiler geçirildiğinde kullanılır. Örnek:

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )