C / C++ Kuralları

Sorun bildir Kaynağı göster Gece · 7,4 , 7.3 · 7,2 · 7,1 · 7.0 · 6,5

Kurallar

cc_binary

Kural kaynağını görüntüle
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)

Örtülü çıkış hedefleri

  • name.stripped (yalnızca açıkça istendiğinde oluşturulur): Sadeleştirilmiş sürümü de vardır. strip -g, hata ayıklamayı kaldırmak için ikili programda çalıştırılıyor anlamına gelir. Komut satırında --stripopt=-foo kullanılarak ek şerit seçenekleri sağlanabilir. Bu çıkış yalnızca açıkça istendiğinde oluşturulur.
  • name.dwp (yalnızca açıkça istendiğinde oluşturulur): Eğer Fission etkin: hata ayıklama Uzaktan dağıtılan ikili programlarda hata ayıklamaya uygun bilgi paketi dosyası. Aksi takdirde: Boş bir dosya.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

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

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

Bunlar cc_library veya objc_library hedefleri olabilir.

srcs

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

Hedefi oluşturmak için işlenen C ve C++ dosyalarının listesi. Bunlar, oluşturulmamış (normal kaynak kod) veya oluşturulmuş C/C++ kaynak ve başlık dosyalardı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 bölümündeyse bu kural otomatik olarak diğer kurala bağlı olur.

.h dosyası derlenmese de aşağıda belirtilenler için kullanılabilir: bu kurala kaynaklara göre dahil edeceğim. Hem .cc hem de .h dosyaları, bu srcs dosyalarında veya deps bağımsız değişkeninde listelenen herhangi bir kuralın hdrs dosyasında listelenen üstbilgileri doğrudan içerebilir.

Tüm #included dosyalarından bu kuralın srcs özelliğinde veya referans verilen cc_library() dosyalarının hdrs özelliğinde bahsedilmelidir. Önerilen stil, bir kütüphaneyle ilişkili üstbilgilerin söz konusu kütüphanenin hdrs özelliğinde, bu kuralın kaynaklarıyla ilişkili diğer üstbilgilerin ise srcs özelliğinde listelenmesini içerir. Daha ayrıntılı bilgi için "Başlık 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++ ise bu kural kapsamında derlenirler; kitaplık dosyaları ise birbirine bağlanır.

İ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ık: .lo, .pic.lo
  • Paylaşılan kitaplık, sürümü olan veya sürümü değiştirilmiş: .so, .so.version
  • Nesne dosyası: .o, .pic.o

...ve bu dosyaları oluşturan tüm kurallar. Farklı uzantılar, farklı programlama dillerini belirtmek için olduğunu unutmayın.

additional_linker_inputs

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

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

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

copts

Dize listesi; varsayılan değer []

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken yap" değişikliğine tabi ve Bourne kabuk belirteçleme.

Bu özellikteki her dize, ikili hedef derlenmeden önce COPTS alanına belirtilen sırada eklenir. İşaretler yalnızca bu hedefin derlenmesi için geçerlidir, bağımlılıklarının derlenmesi için geçerli değildir. Bu nedenle, başka bir yere dahil edilen başlık dosyalarına dikkat edin. Tüm yollar geçerli paketle değil, çalışma alanıyla ilişkili olmasını sağlar.

Pakette özellik belirtilmişse no_copts_tokenization, Bourne kabuk belirteçlemesi yalnızca dizeler için geçerlidir tek bir "Marka"dan oluşan değişkenine eklenmelidir.

defines

Dize listesi; varsayılan değer []

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

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

Derleme satırına eklenecek dahil dizinlerinin 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 için eklenir ona bağlı tüm kuralları görebiliriz. (Not: Bu kuralların bağlı olduğu kurallar değildir.) Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde "-I" COPTS olarak işaretler.

Üstbilgiler srcs veya hdrs'ye eklenmelidir. Aksi takdirde, derleme korumalı alana alındığında (varsayılan) bağımlı kurallar tarafından 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 dosyaları //tools/cpp:link_extra_lib ile bağlanır. Bu, varsayılan olarak etiket işaretçisi //tools/cpp:link_extra_libs'a bağlıdır. İşaret ayarlanmadığında bu kitaplık varsayılan olarak boş olur. Etiket işaretini ayarlama zayıf simgeler ve önleyiciler için geçersiz kılmalar gibi isteğe bağlı bağımlılıkların bağlanmasına izin verir paylaşılan kitaplık işlevleri veya özel çalışma zamanı kitaplıkları için (alkoç değişiklikleri için, malloc veya --custom_malloc tercih edilir). Bu özelliğin None bu davranışı devre dışı bırakır.

linkopts

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

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Yap" konusuyla ilgili değişken yerine Bourne kabuk belirtkeleme ve etiket genişletme. Bu özellikteki her dize LINKOPTS öğesine, önüne çok önemlidir.

Bu listede $ veya - ile başlamayan her öğe deps bölgesindeki bir hedefin etiketi olduğu varsayılmıştır. İlgili içeriği oluşturmak için kullanılan söz konusu hedef tarafından oluşturulan dosyaların listesi bağlayıcıya eklenir seçenekleri vardır. Etiket geçersizse veya deps içinde beyan edilmemişse hata bildirilir.

linkshared

Boole; nonconfig; varsayılan değer False

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 kapalıdır.

Bu işaretin varlığı, bağlantı işleminin -shared işaretiyle gerçekleştiği anlamına gelir gcc değerine oluşturulur ve ortaya çıkan paylaşılan kitaplık, bir örneği düşünün. Ancak, oluşturma amacıyla hiçbir zaman birlikte kullanıldığında, paylaşılan kitaplıkların cc_binary kuralı yalnızca diğer programlar tarafından manuel olarak yüklenir. Bu nedenle cc_library parametresinin yerine geçmemelidir tıklayın. Ölçeklenebilirlik açısından bu yaklaşımdan hiç kaçınmanızı ve java_library, cc_library kurallarına bağlı olsun .

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

linkstatic

Boole; varsayılan değer True

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

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

Etkinleştirilirse ve bu bir ikili dosya veya testse bu seçenek, derleme aracına mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a bağlamasını söyler. Statik kitaplığı olmayan kitaplıklar gibi bazı sistem kitaplıkları da dinamik olarak bağlanmaya devam edebilir. Bu nedenle, ortaya çıkan yürütülebilir dosya dinamik olarak bağlantılı, 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ığı fully_static_link özelliğiyle STATIC (ör. "gcc -static foo.o libbar.a libbaz.a -lm").
    Bu mod, features özelliğinde fully_static_link belirtilerek etkinleştirilir.
  • STATIC: Tüm kullanıcı kitaplıklarının statik olarak bağlandığı (statik bir sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı (ör. "gcc foo.o libfoo.a libbaz.a -lm") moddur.
    Bu mod, linkstatic=True belirtilerek etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DYNAMIC (dinamik sürüm kullanılabilir), ör. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False belirtilerek etkinleştirilir.

linkstatic özelliği, cc_library() kuralı. C++ kitaplıklarında 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.

linkstatic=False ise derleme aracı, *.runfiles alanındaki bağımlılık oluşturulan paylaşılan kitaplıklar için sembolik bağlantılar oluşturur.

local_defines

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

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeni yerine koyma ve Bourne kabuğu dize oluşturma işlemine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken dizeler başa -D eklenir ve bu hedef için derleme komut satırına eklenir, ancak muhteliflerine değil.
malloc

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

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

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

nocopts

String; varsayılan değer ""

Eşleşen seçenekleri C++ derleme komutundan kaldırın. "Yap" konusuyla ilgili değişkeni ikame değerleridir. 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 olmak üzere), COPTS. Bu özelliğe nadiren ihtiyaç duyulur.
stamp

Integer; 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 dosyaya damgalayın. İkili dosyanın ve ona bağlı tüm yayın sonrası işlemlerin uzaktan önbelleğe alınmasını engelleyebileceği için bu ayardan kaçınılmalıdır.
  • stamp = 0: Derleme bilgilerini her zaman sabit değerlerle değiştirin. Bu iyi bir derleme sonucu önbelleğe alma sağlar.
  • stamp = -1: Derleme bilgilerinin yerleştirilmesi --[no]stamp işaretidir.

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

cc_import

Kural kaynağını görüntüle
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 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 ile 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 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'ta:
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. Örnek:
  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 []

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

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

tarafından yayınlanan üstbilgi dosyalarının listesi bu önceden derlenmiş kitaplığın bağımlı kurallardaki kaynaklar tarafından doğrudan dahil edilmesini sağlar.

Boole; varsayılan değer False'tir

1 ise, bu C++ değerine (doğrudan veya dolaylı olarak) bağlı herhangi bir ikili program önceden derlenmiş kitaplık, statik kitaplıkta arşivlenen tüm nesne dosyalarına bağlantı verir. hatta bazıları ikili program tarafından başvurulan semboller içermese bile kullanılabilir. Bu, kodunuz ikili programdaki kod tarafından açıkça çağrılmıyorsa (ör. kodunuz bir hizmet tarafından sağlanan geri çağırma işlevini almak için kaydediyorsa) kullanışlıdır.

Windows'da her zamanlink özelliği 2017 sürümüne göre çalışmıyorsa bunun nedeni bilinen bir sorun yoksa lütfen 2017 ile sürümünüzü en son sürüme yükseltin.

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

shared_library

Etiket; varsayılan değer None

Tek bir önceden derlenmiş paylaşılan kitaplık. Bazel, dosyanın ona bağımlı bir ikili programdır.

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

static_library

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

Tek bir önceden derlenmiş statik kitaplık.

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

system_provided

Boole; varsayılan değer False'tir

1 ise, çalışma zamanında gerekli olan paylaşılan kitaplığın sistem tarafından sağlandığını belirtir. İçinde bu örnekte, interface_library belirtilmeli ve shared_library boş olmalıdır.

cc_library

Kural kaynağını görüntüle
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 başlık dosyaları, cc_* kurallarının hdrs veya srcs bölümünde bildirilmelidir. Zorunlu kılınır.

cc_library kurallarında, hdrs içindeki başlıklar kitaplığın herkese açık arayüzünü oluşturur ve hem kitaplığın hdrs ve srcs içindeki dosyalarından hem de cc_* kurallarının deps içindeki dosyalarından ve srcs içindeki kitaplığı listeleyen dosyalardan doğrudan eklenebilir. srcs öğesindeki başlıklar yalnızca hdrs klasöründeki dosyalardan doğrudan eklenmelidir ve kitaplığın srcs kadarına yer veriliyor. Bir başlığın web sayfasının hdrs veya srcs için bu kitaplığın tüketicilerini isteyip istemediğinizi sormalısınız. bunu doğrudan dahil edebilirsiniz. Bu, programlama dillerinde public ve private görünürlüğü arasında karar vermekle yaklaşık olarak aynıdır.

cc_binary ve cc_test kurallarının dışa aktarılan bir arayüzü olmadığı için hdrs özellikleri de yoktur. İkili sisteme veya teste ait tüm başlıklar doğrudan srcs içinde listelenmelidir.

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

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

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

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

Bu örnekte izin verilen doğrudan dahil etme işlemleri aşağıdaki tabloda listelenmiştir. Örneğin: foo.cc öğesinin, foo.h ve bar.h öğelerini doğrudan içermesine izin verilir, ancak baz.h değil.

Dosya dahilİzin verilen dahil etmeler
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

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

Bazel, dahil etme kontrol kurallarını uygulamak için araç zinciri desteğine ihtiyaç duyar. layering_check özelliğinin araç zinciri tarafından desteklenmesi gerekir ve örneğin --features=layering_check komut satırı işareti veya features package işlevini kullanın. Araç zincirleri bu özelliği yalnızca Unix ve macOS'te clang ile destekler.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

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

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

Bunlar cc_library veya objc_library hedefleri olabilir.

srcs

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

Hedefi oluşturmak için işlenen C ve C++ dosyalarının listesi. Bunlar, oluşturulmamış (normal kaynak kod) veya oluşturulmuş C/C++ kaynak ve başlık dosyalardı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 bölümündeyse bu kural otomatik olarak diğer kurala bağlı olur.

.h dosyası derlenmese de aşağıda belirtilenler için kullanılabilir: bu kurala kaynaklara göre dahil edeceğim. Hem .cc hem de .h dosyaları, bu srcs dosyalarında veya deps bağımsız değişkeninde listelenen herhangi bir kuralın hdrs dosyasında listelenen üstbilgileri doğrudan içerebilir.

#included dosyanın tümünden bahsedilmelidir srcs özelliğinde veya Referans verilen cc_library() öğelerinin hdrs özelliği. Önerilen stil, bir kütüphaneyle ilişkili üstbilgilerin söz konusu kütüphanenin hdrs özelliğinde, bu kuralın kaynaklarıyla ilişkili diğer üstbilgilerin ise srcs özelliğinde listelenmesini içerir. Bkz. "Üstbilgi dahil etme kontrolü" ziyaret edin.

Bir kuralın adı srcs içindeyse bu kural otomatik olarak söz konusu kurala bağlıdır. Adlandırılmış kuralın outs C veya C++ kaynak dosyalarıysa bu kuralda derlenir; kitaplık dosyalarıysa bağlanır.

İ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ık: .lo, .pic.lo
  • Paylaşılan kitaplık, sürümü olan veya sürümü değiştirilmiş: .so, .so.version
  • Nesne dosyası: .o, .pic.o

...ve bu dosyaları oluşturan kurallar. Farklı uzantılar, farklı programlama dillerini belirtmek için olduğunu unutmayın.

hdrs

Etiket listesi; varsayılan değer []

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

Bu, şuna benzeyen başlık dosyalarını bildirmek için kesinlikle tercih edilen konumdur: kitaplığın arayüzünü tarif eder. Bu üstbilgiler, bu kuraldaki veya bağımlı kurallardaki kaynaklar tarafından dahil edilmek üzere kullanıma sunulur. Bu kitaplığın bir istemcisi tarafından eklenmesi amaçlanmayan başlıklar srcs özelliğinde listelenmiş olsa bile yayınlanan bir üstbilgi tarafından dahil edilir. Daha ayrıntılı bilgi için "Başlık dahil etme kontrolünü

additional_compiler_inputs

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

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

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

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

Örneğin, derlenmiş Windows .res dosyaları buraya yerleştirilmek üzere değerini döndürür.

Boole; varsayılan değer False

1 ise, bu C++ değerine (doğrudan veya dolaylı olarak) bağlı herhangi bir ikili program kitaplığının, listelenen dosyalar için tüm nesne dosyalarına srcs (bazıları ikili program tarafından başvurulan semboller içermese bile). Bu, kodunuz yalnızca dil tercihinde kod tarafından kodu alır. Örneğin, kodunuz bir geri çağırma işlemi almak için kaydedilir bir hizmet tarafından sağlanır.

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

copts

Dize listesi; varsayılan değer []

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken yap" değişikliğine tabi ve Bourne kabuk belirteçleme.

Bu özellikteki her dize, ikili hedef derlenmeden önce COPTS alanına belirtilen sırada eklenir. İşaretler yalnızca bu hedefi derlemek için geçerli olur, geçerli değildir bağımlılıklarını, bu yüzden başka bir yerde bulunan başlık dosyalarına dikkat edin. Tüm yollar geçerli paketle değil, çalışma alanıyla ilişkili olmasını sağlar.

Pakette özellik belirtilmişse no_copts_tokenization, Bourne kabuk belirteçlemesi yalnızca dizeler için geçerlidir tek bir "Marka"dan oluşan değişkenine eklenmelidir.

defines

Dize listesi; varsayılan değer []

Derleme satırına eklenecek tanımlar listesi. "Yap" konusuyla ilgili değişken yerine koyma ve Bourne kabuk belirteçleme. Tek bir Bourne kabuk jetonundan oluşması gereken dizeler başa -D eklenir ve bu hedefe yönelik derleme komut satırına eklenir, kurala bağlı olarak değişiklik gösterir. Bu tür sorunlarda neden olabileceği için etkileridir. Şüpheye düştüğünüzde, Bunun yerine local_defines.
implementation_deps

Etiket listesi; varsayılan değer []

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

Kullanım şimdilik cc_libraries ile sınırlıdır ve bayrak ile korunur --experimental_cc_implementation_deps

include_prefix

String; 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ıklar erişilebilir olur , bu özelliğin depoya bağlı yolunun başına eklenen değeridir.

Bu ön ek eklenmeden önce strip_include_prefix özelliğindeki ön ek 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" yerine koyma işlemine tabidir. Her dizenin başına -isystem değeri eklenir ve dize COPTS öğesine eklenir. COPTS'tan farklı olarak bu işaretler bu kural ve bu kurala 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 dikkatli olun. Şüpheye düştüğünüzde bunun yerine COPTS alanına "-I" işaretleri ekleyin.

Üstbilgiler src'lere veya hdrs'lara eklenmelidir, aksi takdirde bağımlı kullanıcılar tarafından kullanılamaz belirli kurallara tabi olacaktır (varsayılan).

linkopts

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

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Yap" konusuyla ilgili değişken yerine Bourne kabuk belirtkeleme ve etiket genişletme. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS'e eklenir.

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

linkstamp

Etiket; varsayılan değer None

Belirtilen C++ kaynak dosyasını aynı anda derler ve ikilik. Bu hile, zaman damgası eklemek için gereklidir. bilgileri ikili programlara dönüştürme; kaynak dosyayı nesne dosyanız olursa zaman damgası yanlış olur. Bağlantı damgası derlemesi belirli bir derleyici işareti grubu 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ğe yalnızca base paketinde ihtiyaç duyulur.
linkstatic

Boole; varsayılan değer False'tir

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

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

Etkinleştirilirse ve bu bir ikili dosya veya testse bu seçenek, derleme aracına mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a bağlamasını söyler. Statik kitaplığı olmayan kitaplıklar gibi bazı sistem kitaplıkları da dinamik olarak bağlanmaya devam edebilir. Bu nedenle, ortaya çıkan yürütülebilir dosya dinamik olarak bağlantılı, 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ığı full_static_link özelliğiyle STATIC; ör. "gcc -static foo.o libbar.a libbaz.a -lm".
    Bu mod, fully_static_link features özelliği ile birlikte kullanılabilir.
  • Tüm kullanıcı kitaplıklarının statik olarak bağlandığı STATIC ( sürümü mevcut), ancak sistem kitaplıkları (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlanır, ö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 kullanılabilir), ör. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False belirtilerek etkinleştirilir.

linkstatic özelliği, cc_library() kuralı. C++ kitaplıklarında 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. Özelliğin amacı, oluşturmayı öğreneceksiniz.

linkstatic=False ise derleme aracı, *.runfiles alanındaki bağımlılık oluşturulan paylaşılan kitaplıklar için sembolik bağlantılar oluşturur.

local_defines

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

Derleme satırına eklenecek tanımlar listesi. "Make" değişkeni yerine koyma ve Bourne kabuğu dize oluşturma işlemine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken dizeler başa -D eklenir ve bu hedef için derleme komut satırına eklenir, ancak muhtaç kişilerle değil.
nocopts

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

C++ derleme komutundan eşleşme seçeneklerini kaldırın. "Yap" konusuyla ilgili değişkeni ikame değerleridir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden var olan tüm COPTS (kuralın copts özelliğinde açıkça belirtilen değerler dahil) bu kuralı derlemek amacıyla COPTS'ten kaldırılır. Bu özelliğe nadiren ihtiyaç duyulur.
strip_include_prefix

String; varsayılan değer ""

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

Ayarlandığında, bu kuralın hdrs özelliğindeki üstbilgilere, bu ön ek kaldırılmış şekildeki yollarında erişilebilir.

Göreli bir yolsa, pakete bağlı bir yol olarak alınır. Mutlak bir çözümse 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

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

Bağımlı kurallarda kaynaklar tarafından metinsel olarak dahil edilmek üzere bu kitaplık tarafından yayınlanan başlık dosyalarının listesi.

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

win_def_file

Etiket; varsayılan değer None

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

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

cc_proto_library

Kural kaynağını görüntüle
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 kurallarına yönlendirmelidir.

Ö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; zorunlu

Bu hedef için benzersiz bir ad.

deps

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

C++ kodu oluşturmak için proto_library kurallarının listesi.

cc_shared_library

Kural kaynağını görüntüle
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'yi statik olarak bağlar. baz, geçişli bir bağımlılıktır. Gelmiyor tarafından dinamik olarak sağlandığından bar bağlantısını bar_shared dynamic_dep.

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

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

Örnekteki her cc_library en fazla bir cc_shared_library içinde görünmelidir. baz bağlantısını da bar_shared ve daha fazla tags = ["LINKABLE_MORE_THAN_ONCE"] - baz.

shared_lib_name özelliği nedeniyle, bar_shared alanının adı bar.so olacak varsayılan olarak Linux'ta olan libbar.so adına ekleyeceğiz.

Hatalar

Two shared libraries in dependencies export the same symbols.

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

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

Bunu düzeltmenin bir yolu, kitaplığı cc_shared_library bağımlılık. Aynı zamanda, hâlâ ona bağlanan kullanıcı bağlamayan kullanıcının görünürlüğü koruyabilmesi için kitaplığı dışa aktarması gerekir. anlamına gelir. Hedefi dışa aktaran üçüncü bir kitaplık da kullanabilirsiniz. Üçüncü bir yöntem de suçlu cc_library öğesini LINKABLE_MORE_THAN_ONCE ile etiketlemektir. ancak bu düzeltme nadiren yapılır ve mutlaka cc_library bağlantısını birden çok kez güvenle bağlayabilirsiniz.

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

Bu, deps'ün geçişli kapatma kapsamındaki bir kitaplığa cc_shared_library bağımlılıkları kullanmadan erişilebildiği ancak dynamic_deps'de farklı bir cc_shared_library'ye 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 aktarmaktır. dışa aktaran üçüncü bir cc_shared_library.

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

Önceden derlenmiş bir dinamik kitaplığınız varsa buna gerek yoktur ve şu anki cc_shared_library hedefine statik olarak bağlı oluşturun. Bu nedenle, cc_shared_library'daki deps bölümüne ait değildir. Önceden derlenmiş bu dinamik kitaplık cc_libraries için cc_library doğrudan ekleyebilirsiniz.

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

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

Bunu düzeltmek için hedefi deps öğesinden kaldırın ve dinamik bağımlılığı 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 []

Paylaşılan kitaplığa koşulsuz olarak statik olarak bağlanacak üst düzey kitaplıklar elde edilebilir.

Bu doğrudan sunumların geçişli kitaplık bağımlılıkları, bu paylaşılan bir cc_shared_library aracılığıyla bağlanmamış olmaları koşuluyla kitaplığı dynamic_deps içinde.

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

Uygulama, aynı kitaplık statik olarak bağlandığında da hataları tetikler. birden fazla cc_shared_library birimine dönüştürülebilir. Bu durumu önlemek için cc_library.tags için veya listelemeye göre "LINKABLE_MORE_THAN_ONCE" paylaşılan kitaplıklardan birinin dışa aktarımı olarak "cc_library" öğesini dynamic_dep/diğeri.

additional_linker_inputs

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

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

Etiket listesi; varsayılan değer []

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

cc_shared_library uygulaması, dynamic_deps (geçişli olarak, ör. aynı zamandadynamic_deps mevcut hedefin dynamic_deps) hangi cc_libraries değerindeki zaten sağlandığı için geçişli deps buna bağlanmamalıdır başka bir cc_shared_library tarafından.

exports_filter

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

Bu özellik, mevcut koordineli olacaklardır.

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

Bu özelliğin aslında bu hedeflere bir bağımlılık kenarı eklemediğini, bunun yerine bağımlılık kenarının deps tarafından oluşturulması gerektiğini unutmayın. Bu özellikteki girişler yalnızca dizelerdir. Bu özelliğe hedef belirlerken Bu durum, paylaşılan kitaplığın ilgili hedefteki sembolleri dışa aktardığı iddiası olarak kabul edilir. cc_shared_library mantığı, aslında bağlayıcıya hangi simgelerin dışa aktarılması gerektiğini bildirmez.

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

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

foo/BUILD veya diğer herhangi bir hedefi hesaba katmak için //foo:__subpackages__ foo/ like foo/bar/BUILD altındaki paket

shared_lib_name

String; varsayılan değer ""

Varsayılan olarak cc_shared_library, paylaşılan kitaplık çıkış dosyası için hedefin adı ve platform. Buna uzantı ve bazen de önek dahildir. Bazen varsayılan adı kullanmak istemeyebilirsiniz. Örneğin, C++ paylaşılan kitaplıklarını yüklerken Python için varsayılan lib* öneki genellikle istenmez. Bu durumda, özelliğini kullanın.

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

Bağlantı oluşturucuya iletmek isteyebileceğiniz ek işaretler. Örneğin, bağlayıcıyı additional_linker_inputs aracılığıyla iletilen bir bağlayıcı komut dosyasından haberdar etmek için şunları 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örüntüle
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 mutlak bir yolda bulunan bir FDO ön 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; zorunlu

Bu hedef için benzersiz bir ad.

profile

Etiket; varsayılan değer None

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

fdo_profile

Kural kaynağını görüntüle
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; zorunlu

Bu hedef için benzersiz bir ad.

absolute_path_profile

String; varsayılan değer ""

FDO profilinin mutlak yolu. FDO dosyasının uzantısı aşağıdakilerden biri olabilir: Dizinlenmemiş LLVM profili için .profraw, dizine eklenen LLVM profili için .profdata, LLVM profraw profili barındıran .zip veya AutoFDO profili için .afdo.
profile

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

FDO profilinin etiketi veya bu etiketi oluşturan bir kural. FDO dosyasında şu uzantılardan yararlanabilirsiniz: dizine eklenmemiş LLVM profili için .profraw, dizine eklenmiş LLVM için .profdata profil, LLVM profraw profiline sahip .zip, AutoFDO profili için .afdo, için .xfdo XBinary profili. Etiket, fdo_absolute_path_profile kuralını da işaret edebilir.
proto_profile

Etiket; varsayılan değer None

Protobuf profilinin etiketi.

memprof_profile

Kural kaynağını görüntüle
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 bir MEMPROF profilini temsil eder mutlak yol. Ö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; zorunlu

Bu hedef için benzersiz bir ad.

absolute_path_profile

String; varsayılan değer ""

MEMPROF profilinin mutlak yolu. Dosyanın uzantısı yalnızca .profdata veya .zip olabilir (zip dosyasında memprof.profdata dosyası bulunmalıdır).
profile

Etiket; varsayılan değer None

MEMPROF profilinin etiketi. Profilin .profdata uzantısı (dizine eklenmiş/simgeselleştirilmiş memprof için profili) veya memprof .profdata içeren bir zip dosyasının.zip uzantısına dosyası olarak kaydedebilirsiniz. Etiket ayrıca bir fdo_Mutlak_path_profile kuralına da işaret edebilir.

propeller_optimize

Kural kaynağını görüntüle
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; zorunlu

Bu hedef için benzersiz bir ad.

ld_profile

Etiket; varsayılan değer None

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

cc_test

Kural kaynağını görüntüle
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; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan değer []

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

Bunlar cc_library veya objc_library hedefleri olabilir.

srcs

Etiket listesi; varsayılan değer []

Hedefi oluşturmak için işlenen C ve C++ dosyalarının listesi. Bunlar, oluşturulmamış (normal kaynak) kod) veya oluşturulmalı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 bölümündeyse bu kural otomatik olarak diğer kurala bağlı olur.

.h dosyası derlenmese de aşağıda belirtilenler için kullanılabilir: bu kurala kaynaklara göre dahil edeceğim. Hem .cc hem de .h dosyaları, bu srcs dosyalarında veya deps bağımsız değişkeninde listelenen herhangi bir kuralın hdrs dosyasında listelenen üstbilgileri doğrudan içerebilir.

#included dosyanın tümünden bahsedilmelidir srcs özelliğinde veya Referans verilen cc_library() öğelerinin hdrs özelliği. Önerilen stil, bir kütüphaneyle ilişkili üstbilgilerin söz konusu kütüphanenin hdrs özelliğinde, bu kuralın kaynaklarıyla ilişkili diğer üstbilgilerin ise srcs özelliğinde listelenmesini içerir. Bkz. "Üstbilgi dahil etme kontrolü" ziyaret edin.

Bir kuralın adı srcs içindeyse bu kural otomatik olarak ona bağlıdır. Adlandırılmış kuralın outs C veya C++ kaynak dosyalarıysa bu kuralda derlenir; kitaplık dosyalarıysa bağlanır.

İ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ık: .lo, .pic.lo
  • Paylaşılan kitaplık, sürümü olan veya sürümü değiştirilmiş: .so, .so.version
  • Nesne dosyası: .o, .pic.o

...ve bu dosyaları oluşturan kurallar. Farklı uzantılar, gcc sözleşmesine uygun olarak farklı programlama dillerini gösterir.

additional_linker_inputs

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

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

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

copts

Dize listesi; varsayılan değer []

Bu seçenekleri C++ derleme komutuna ekleyin. "Değişken yap" değişikliğine tabi ve Bourne kabuk belirteçleme.

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

Pakette özellik belirtilmişse no_copts_tokenization, Bourne kabuk belirteçlemesi yalnızca dizeler için geçerlidir tek bir "Marka"dan oluşan değişkenine eklenmelidir.

defines

Dize listesi; varsayılan değer []

Derleme satırına eklenecek tanımlar listesi. "Yap" konusuyla ilgili değişken yerine koyma ve Bourne kabuk belirteçleme. Tek bir Bourne kabuk jetonundan oluşması gereken dizeler başa -D eklenir ve bu hedefe yönelik derleme komut satırına eklenir, kurala bağlı olarak değişiklik gösterir. Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde bunun yerine local_defines alanına tanımlama değerleri ekleyin.
includes

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

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

"Değişken yap" yerine koyma işlemine tabidir. Her dizenin başına -isystem değeri eklenir ve dize COPTS öğesine eklenir. COPTS'tan farklı olarak bu işaretler bu kural ve bu kurala bağlı her kural için eklenir. (Not: Bu, bağlı olduğu kurallar değildir.) Bunun geniş kapsamlı etkileri olabileceğinden çok dikkatli olun. Şüpheye düştüğünüzde "-I" COPTS olarak işaretler.

Üstbilgiler src'lere veya hdrs'lara eklenmelidir, aksi takdirde bağımlı kullanıcılar tarafından kullanılamaz belirli kurallara tabi olacaktır (varsayılan).

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

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

Varsayılan olarak C++ ikili dosyaları //tools/cpp:link_extra_lib ile bağlanır. Bu, varsayılan olarak etiket işaretçisi //tools/cpp:link_extra_libs'a bağlıdır. İşaret ayarlanmadığında bu kitaplık varsayılan olarak boş olur. Etiket işaretini ayarlama zayıf simgeler ve önleyiciler için geçersiz kılmalar gibi isteğe bağlı bağımlılıkların bağlanmasına izin verir paylaşılan kitaplık işlevleri veya özel çalışma zamanı kitaplıkları için (alkoç değişiklikleri için, malloc veya --custom_malloc tercih edilir). Bu özelliğin None bu davranışı devre dışı bırakır.

linkopts

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

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Make" değişkeni yerine koyma, Bourne kabuğu dize parçalara ayırma ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize LINKOPTS öğesine, önüne çok önemlidir.

Bu listedeki $ veya - ile başlamayan her öğenin, deps'deki bir hedefin etiketi olduğu varsayılır. İlgili içeriği oluşturmak için kullanılan söz konusu hedef tarafından oluşturulan dosyaların listesi bağlayıcıya eklenir seçenekleri vardır. Etiket geçersizse veya deps bölgesinde bildirilmedi.

linkstatic

Boole; varsayılan değer False'tir

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

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

Etkinleştirilirse ve bu bir ikili dosya veya testse bu seçenek, derleme aracına mümkün olduğunda kullanıcı kitaplıkları için .so yerine .a bağlamasını söyler. Statik kitaplığı olmayan kitaplıklar gibi bazı sistem kitaplıkları da dinamik olarak bağlanmaya devam edebilir. Bu nedenle, ortaya çıkan yürütülebilir dosya dinamik olarak bağlantılı, 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ığı full_static_link özelliğiyle STATIC; ör. "gcc -static foo.o libbar.a libbaz.a -lm".
    Bu mod, fully_static_link features özelliği ile birlikte kullanılabilir.
  • Tüm kullanıcı kitaplıklarının statik olarak bağlandığı STATIC ( sürümü mevcut), ancak sistem kitaplıkları (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlanır, ö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 kullanılabilir), ör. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False belirtilerek etkinleştirilir.

linkstatic özelliği, cc_library() kuralı. C++ kitaplıklarında 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. Özelliğin amacı, oluşturmayı öğreneceksiniz.

linkstatic=False ise derleme aracı, *.runfiles alanındaki bağımlılık oluşturulan paylaşılan kitaplıklar için sembolik bağlantılar oluşturur.

local_defines

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

Derleme satırına eklenecek tanımlar listesi. "Yap" konusuyla ilgili değişken yerine koyma ve Bourne kabuk belirteçleme. Tek bir Bourne kabuk jetonundan oluşması gereken dizeler başa -D eklenir ve bu hedef için derleme komut satırına eklenir, ancak muhtaç kişilerle değil.
malloc

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

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

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

nocopts

String; varsayılan değer ""

C++ derleme komutundan eşleşme seçeneklerini kaldırın. "Yap" konusuyla ilgili değişkeni ikame değerleridir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden var olan tüm COPTS (kuralın copts özelliğinde açıkça belirtilen değerler dahil) bu kuralı derlemek amacıyla COPTS'ten kaldırılır. Bu özelliğe nadiren ihtiyaç duyulur.
stamp

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

Derleme bilgilerinin ikili programda kodlanıp kodlanmayacağını belirler. Olası değerler:
  • stamp = 1: --nostamp derlemelerinde bile derleme bilgilerini her zaman ikili dosyaya damgalayın. Bu ayarından kaçınılmalıdır. Aksi takdirde, bu işlem ve buna bağımlı tüm aşağı akış işlemleri.
  • stamp = 0: Derleme bilgilerini her zaman sabit değerlerle değiştirin. Bu, iyi bir derleme sonucu önbelleğe alma sağlar.
  • stamp = -1: Derleme bilgilerinin yerleştirilmesi, --[no]stamp işareti tarafından kontrol edilir.

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'dir.

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

Bu özellik yalnızca hedef platform Windows olduğunda kullanılmalıdır. Şu amaçlarla kullanılabilir: simgeleri dışa aktarın.

cc_toolchain

Kural kaynağını görüntüle
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 aşağıdakilerden sorumludur:

  • C++ işlemlerinin çalışması için gereken tüm yapılar toplanıyor. Bu, all_files, compiler_files, linker_files veya _files ile biten diğer özellikler). Bunlar: tüm gerekli dosyaları globbing eden dosya gruplarıdır.
  • C++ işlemleri için doğru komut satırları oluşturma. Bu, CcToolchainConfigInfo sağlayıcısı (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 dokümanları için bu sayfada da bilgi bulabilirsiniz.

Araç zincirlerinin derlenmesini ve yapılandırılmasını engellemek için tags = ["manual"] kullanın bazel build //... çağrılırken gereksiz

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

all_files

Etiket; zorunlu

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

cc_toolchain.files bunu içerir ve tüm Starlark tarafından kullanılır kuralları tekrar gözden geçirelim.

ar_files

Etiket; varsayılan değer None

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

as_files

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

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

compiler_files

Etiket; zorunlu

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

Etiket; varsayılan değer None

Şu durumlarda derleme işlemleri için gereken tüm cc_toolchain yapılarının toplanması: giriş keşfi desteklenir (şu anda yalnızca Google için).
coverage_files

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

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

Etiket; zorunlu

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

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

C++ çalışma zamanı kitaplığı için dinamik kitaplık yapı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; varsayılan değer True

Geçiş yapmamak (ör. varsayılan olarak hedef platform) yerine tüm dosya girişlerini yürütme platformu için cc_toolchain'da derlemek üzere Doğru değerine ayarlayın.
libc_top

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

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

Etiket; zorunlu

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

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

Modüler yapılarda 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 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 parametre, "static_link_cpp_runtimes" etkinleştirildiğini görebilirsiniz. Şimdi de ve her şeyi statik olarak içerir.

strip_files

Etiket; 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'tir

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, işlemleri bağlamak için param dosyalarının kullanılmasını desteklediğinde True olarak ayarlanır.
toolchain_config

Etiket; zorunlu

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

String; nonconfig; varsayılan değer ""

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

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

cc_toolchain_suite

Kural kaynağını görüntüle
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 aşağıdakilerden sorumludur:

  • İlgili tüm C++ araç zincirlerini toplama
  • Bazel'e iletilen --cpu ve --compiler seçeneklerine bağlı olarak bir araç zinciri seçin.

Ayrıntılı C++ araç zinciri yapılandırması ve araç zinciri seçim dokümanları için bu sayfada da bilgi bulabilirsiniz.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

toolchains

Dizelerin etiketlerle eşlendiği sözlük; yapılandırılamaz; zorunlu

"<cpu>" sorgusundan bir harita veya "<cpu>|<derleyici>" dize cc_toolchain etiketi. "<cpu>" yalnızca --cpu olduğunda kullanılır Bazel'a aktarılır ve "<cpu>|<derleyici>" birlikte kullanıldığında --cpu ve --compiler Bazel'e iletilir. Ö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",
            },
          )