C / C++ Kuralları

. Sorun bildir Kaynağı göster Gece · 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)

Dolaylı çı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 ek şerit seçenekleri --stripopt=-foo 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ı. Diğer: anlamına gelir.

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.

Bu URL'ler cc_library veya objc_library olabilir belirler.

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 dosya derlenebilir. Bunlar oluşturulmuş dosyalar olabilir: adlandırılmış bir dosya başka bir kuralın outs, 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ı doğrudan bu srcs veya hdrs içinde listelenen deps bağımsız değişkeni.

#included dosyanın tümünden bahsedilmelidir srcs özelliğinde veya Referans verilen cc_library() öğelerinin hdrs özelliği. Önerilen stil, kullanılacak bir kitaplıkla ilişkilendirilen hdrs özelliğinde listelenir ve bu kuralın kaynaklarıyla ilişkili başlıkları srcs. 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'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 kurallar. Farklı uzantılar, farklı programlama dillerini olduğunu unutmayın.

additional_linker_inputs

Etiket listesi; varsayılan değer []

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

Örneğin, derlenmiş Windows .res dosyaları buraya yerleştirilmek üzere ikili hedefi vardır.

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 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.
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 için eklenir ona bağlı tüm kuralları görebiliriz. (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 "-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"

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

Varsayılan olarak, C++ ikili programları //tools/cpp:link_extra_lib ile Bu, varsayılan olarak //tools/cpp:link_extra_libs etiket işaretine 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ı (makaloc değişimleri 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 []

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 bölgesinde bildirilmedi.

linkshared

Boole; nonconfig; 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. Varsayılan olarak bu seçenek 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 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 kuralı. Ölçeklenebilirlik açısından bu yaklaşımdan tamamen kaçınmanızı ve java_library, cc_library kurallarına bağlı olsun .

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

linkstatic

Boole; varsayılan değer True

cc_binary ve cc_test: İkili dosyayı statik yatırım yapmanız önemlidir. 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 kullanın. Bazı sistem kitaplıkları, dinamik olarak bağlanmaya devam edebilir. statik kitaplık yoktur. 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ığı 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ı. Bir C++ kitaplığı için linkstatic=True, yalnızca statik bağlantıya izin verildiği için .so oluşturulmaz. linkstatic=Yanlış statik kitaplıkların oluşturulmasını engellemez. Özelliğin amacı, oluşturmayı öğreneceksiniz.

linkstatic=False ise derleme aracı *.runfiles alanındaki paylaşılan kitaplıklara aşina olmanız gerekir.

local_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 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'daki varsayılan bağımlılığı geçersiz kılın.

Varsayılan olarak, C++ ikili programları //tools/cpp:malloc ile bu boş bir kitaplıktır. Bu nedenle ikili program, libc Malloc'u kullanır. Bu etiket bir cc_library değerine başvuruda bulunmalıdır. Derleme C++ olmayan bir bu seçeneğin hiçbir etkisi yoktur. 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 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

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

Derleme bilgilerinin ikili programda kodlanıp kodlanmayacağını belirler. Olası değerler:
  • stamp = 1: Derleme bilgilerini --nostamp derleme. 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ş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

Bağlayıcıya 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_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 bir kitaplığı arayüz kitaplığıyla 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",
)
. 5. 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.c
adlı statik veya paylaşılan kitaplığa bağlanılıyor 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 etme" ö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ı göster tarafından tanımlanan tipik çoğu derleme kuralına bakın.
hdrs

Etiket listesi; varsayılan değer []

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

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

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

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

Ö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. İç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ı hdrs veya srcs / cc_* kural. Zorunlu kılınır.

cc_library kuralları için hdrs içindeki başlıklar, şu öğenin herkese açık arayüzünü oluşturur: yer alır ve hem hdrs hem de hdrs klasöründeki dosyalardan doğrudan eklenebilir ve kitaplığın kendisinden srcs tanesinin yanı sıra hdrs ve Kitaplığı deps içinde listeleyen cc_* kuraldan srcs tanesi. 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, diğer tedarikçilerle yaklaşık olarak Programlama dillerinde public ve private görünürlük.

cc_binary ve cc_test kurallarının dışa aktarılmış bir arayüzü olmadığından ayrıca hdrs özelliğine sahip değil. İkili program veya teste ait tüm başlıklar doğrudan 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 değil.

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 olma kontrolü kuralları yalnızca doğrudan reklamlar için geçerlidir dahil edilir. Yukarıdaki örnekte foo.cc için izin verilen: dahil olmak üzere bar.h, dahil olmak üzere baz.h dönüşün baz-impl.h içermesine izin verilir. 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. İçinde bu durumda derleyici baz.h ve baz-impl.h verilerini okuyabilir foo.cc derlenirken, ancak foo.cc şunu içermemelidir: #include "baz.h" içerir. Bunun için izin verildi, deps öğesine baz eklenmelidir / foo.

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

Etiket listesi; varsayılan değer []

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

Bu URL'ler cc_library veya objc_library olabilir belirler.

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 dosya derlenebilir. Bunlar oluşturulmuş dosyalar olabilir: adlandırılmış bir dosya başka bir kuralın outs, 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ı doğrudan bu srcs veya hdrs içinde listelenen deps bağımsız değişkeni.

#included dosyanın tümünden bahsedilmelidir srcs özelliğinde veya Referans verilen cc_library() öğelerinin hdrs özelliği. Önerilen stil, kullanılacak bir kitaplıkla ilişkilendirilen hdrs özelliğinde listelenir ve bu kuralın kaynaklarıyla ilişkili başlıkları srcs. 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'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 kurallar. Farklı uzantılar, farklı programlama dillerini olduğunu unutmayın.

hdrs

Etiket listesi; varsayılan değer []

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

Bu, şuna benzeyen başlık dosyalarını bildirmek için kesinlikle tercih edilen konumdur: kitaplığın arayüzünü tarif eder. Bu başlıklar, bu kurala kaynaklar tarafından veya bağımlı kurallara dahil edilebilir. 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. Bkz. "Üstbilgi dahil etme kontrol etme" bölümüne bakın.

additional_compiler_inputs

Etiket listesi; varsayılan değer []

Derleyici komut satırına iletmek isteyebileceğiniz diğer dosyalar (ör. temizleyici) yoksayılanlar listeleri de olabilir. Burada belirtilen dosyalar daha sonra $(location) fonksiyonu.
additional_linker_inputs

Etiket listesi; varsayılan değer []

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

Örneğin, derlenmiş Windows .res dosyaları buraya yerleştirilmek üzere ikili hedefi vardı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.

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.

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 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ığın hedeflediği diğer kitaplıkların listesi. Şununla beğenme: deps, üstbilgilerini içerir ve bu kitaplıkların (ve tüm geçişli dep'ler) yalnızca bu kitaplığın derlenmesi için kullanılır, ona güvenmeniz gerekir. 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.

strip_include_prefix özelliğindeki ön ek bu değerden önce kaldırıldı öneki eklendi.

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 için eklenir ona bağlı tüm kuralları görebiliriz. (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 "-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).

linkopts

Dize listesi; varsayılan değer []

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 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. Bir bağlantı damgası derlemesi, emin olun. Bu nedenle, herhangi bir özel işarete veya başka bir derleme değişkeni kullanabilirsiniz. Bu seçenek yalnızca base paketi.
linkstatic

Boole; varsayılan değer False

cc_binary ve cc_test: İkili dosyayı statik yatırım yapmanız önemlidir. 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 kullanın. Bazı sistem kitaplıkları, dinamik olarak bağlanmaya devam edebilir. statik kitaplık yoktur. 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ığı 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ı. Bir C++ kitaplığı için linkstatic=True, yalnızca statik bağlantıya izin verildiği için .so oluşturulmaz. linkstatic=Yanlış statik kitaplıkların oluşturulmasını engellemez. Özelliğin amacı, oluşturmayı öğreneceksiniz.

linkstatic=False ise derleme aracı *.runfiles alanındaki paylaşılan kitaplıklara aşina olmanız gerekir.

local_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 hedef için derleme komut satırına eklenir, ancak muhteliflerine değil.
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 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.
strip_include_prefix

String; varsayılan değer ""

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

Ayarlandığında, bu kuralın hdrs özelliğindeki başlıklar erişilebilir olur bu ön eki keserek yapar.

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, şu ön ekten sonra eklenir: soyutlanır.

textual_hdrs

Etiket listesi; varsayılan değer []

tarafından yayınlanan üstbilgi dosyalarının listesi bu kitaplık, bağımlı kurallardaki kaynaklar tarafından metin olarak eklenecek.

Bu, kendi başlarına derlanamayan üstbilgi dosyalarının bildirildiği konumdur; diğer kaynak dosyalara metin olarak eklenmeleri gerekir. girin.

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. Şu amaçlarla kullanılabilir: simgeleri dışa aktarın.

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

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan değer []

proto_library listesi kuralları belirlemeniz gerekir.

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 öğesini statik olarak bağlar. baz ise geçişli 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ığı şunları yapar: hangi simgelerin dışa aktarılacağını kontrol etmez, yalnızca iki paylaşılan kitaplık, dosyayı dışa aktarırsa analiz aşamasında hata vermek için dışa aktarılır daha yüksek olacaktır.

cc_shared_library ürününün her doğrudan bağımlılığının dışa aktarıldı. Dolayısıyla Bazel, analiz sırasında foo değerinin foo_shared tarafından dışa aktarıldı. baz dosyasının dışa aktarılacağı varsayılmaz foo_shared tarafından. 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 yerde görünmelidir cc_shared_library. 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. Bunu düzeltmek için kitaplıkların cc_shared_library bağımlılık.

Bu durum, iki farklı değerde yeni bir cc_shared_library oluşturduğunuzda gerçekleşir: aynı hedefi statik olarak bağlayan farklı cc_shared_library bağımlılıkları. 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. 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 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 cihazınızın geçişli olarak kapanışındaki bir kitaplığa erişilebildiği anlamına gelir cc_shared_library bağımlılıklarından birini yaşamadan ama hâlihazırda dynamic_deps içinde farklı bir cc_shared_library ile bağlantılı ve dışa aktarıldı.

Çö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. Dolayısıyla, alan adının deps cc_shared_library. Ö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 bir dışa aktarmayı talep ediyorsanız bu hatayı dinamik bağımlılarınızdan biri tarafından dışa aktarılmakta olan bir hedef belirleyebilirsiniz.

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ı, deps dışa aktarıldığında hata oluştu. Bu işlem, paylaşılan kitaplık tarafından dışa aktarılıyor. birden çok cc_shared_libraries, aynı hedefleri dışa aktarıyor. Kuralın uygulanması tarafından dışa aktarılacağı konusunda bağlayıcıyı bilgilendirme gösterilmektedir. Kullanıcı, bağlayıcı komut dosyaları veya görünürlük aracılığıyla bunu yapmalıdır. bildirimlerinin kaynak koduna dahil edilir.

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

Etiket listesi; varsayılan değer []

Bağlayıcıya iletmek isteyebileceğiniz tüm ek dosyalar (ör. bağlayıcı komut dosyaları). Bunun farkında olmak için bağlayıcının ihtiyacı olan 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 değer []

Bunlar, mevcut hedefin bağımlı 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ı zamanda dynamic_deps mevcut hedefin dynamic_deps) hangi cc_libraries değerindeki zaten sağlandığı için geçişli deps birbirine bağlanmamalıdır farklı bir cc_shared_library tarafından.

exports_filter

Dize listesi; varsayılan değer []

Bu özellik, mevcut koordineli olacaklardır.

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 tüm hedefleri listelemek için kullanılmalıdır ancak deps öğesinin geçişli bağımlılıklarıdır.

Bu özelliğin aslında bu hedeflere bir bağımlılık ucu eklemediğini unutmayın. bağımlılık kenarı bunun yerine deps tarafından oluşturulmalıdır.Bu özelliğinin değeri yalnızca dizedir. Bu özelliğe hedef belirlerken Bu durum, paylaşılan kitaplığın ilgili hedefteki simgeleri dışa aktardığı iddiası olarak kabul edilir. cc_shared_library mantığı, bağlayıcıya hangi simgeleri dışa aktarılmalıdır.

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 adı ve platformu tanımlamanız gerekir. Buna bir uzantı ve bazen bir ön ek 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 []

Bağlayıcıya iletmek isteyebileceğiniz tüm ek işaretler. Örneğin, ek_linker_inputs üzerinden iletilmiş bir bağlayıcı komut dosyası olduğunu fark ederseniz, takip etmek için:
         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. Şu amaçlarla kullanılabilir: simgeleri dışa aktarın.

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 bir FDO önceden getirme ipucu profilini temsil eder mutlak yol. Ö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. İpucu dosyası .afdo uzantısına sahiptir Etiket ayrıca bir fdo_Mutlak_path_profile kuralına 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ı aşağıdaki uzantılardan birine sahip olabilir: Dizine eklenmemiş LLVM profili için .profraw, dizine eklenmiş LLVM profili için .profdata, .zip bir LLVM profraw profiline veya .afdo (AutoFDO profili) içeren bir dosya oluşturabilirsiniz.
profile

Etiket; varsayılan değer None

FDO profilinin veya onu oluşturan kuralın etiketi. 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 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ö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. Dosyada yalnızca .profdata veya .zip uzantısı (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ı (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ında 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.

Bu URL'ler cc_library veya objc_library olabilir belirler.

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 dosya derlenebilir. Bunlar oluşturulmuş dosyalar olabilir: adlandırılmış bir dosya başka bir kuralın outs, 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ı doğrudan bu srcs veya hdrs içinde listelenen deps bağımsız değişkeni.

#included dosyanın tümünden bahsedilmelidir srcs özelliğinde veya Referans verilen cc_library() öğelerinin hdrs özelliği. Önerilen stil, kullanılacak bir kitaplıkla ilişkilendirilen hdrs özelliğinde listelenir ve bu kuralın kaynaklarıyla ilişkili başlıkları srcs. 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'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 kurallar. Farklı uzantılar, farklı programlama dillerini olduğunu unutmayın.

additional_linker_inputs

Etiket listesi; varsayılan değer []

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

Örneğin, derlenmiş Windows .res dosyaları buraya yerleştirilmek üzere ikili hedefi vardır.

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 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.
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 için eklenir ona bağlı tüm kuralları görebiliriz. (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 "-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"

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

Varsayılan olarak, C++ ikili programları //tools/cpp:link_extra_lib ile Bu, varsayılan olarak //tools/cpp:link_extra_libs etiket işaretine 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ı (makaloc değişimleri 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 []

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 bölgesinde bildirilmedi.

linkstatic

Boole; varsayılan değer False

cc_binary ve cc_test: İkili dosyayı statik yatırım yapmanız önemlidir. 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 kullanın. Bazı sistem kitaplıkları, dinamik olarak bağlanmaya devam edebilir. statik kitaplık yoktur. 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ığı 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ı. Bir C++ kitaplığı için linkstatic=True, yalnızca statik bağlantıya izin verildiği için .so oluşturulmaz. linkstatic=Yanlış statik kitaplıkların oluşturulmasını engellemez. Özelliğin amacı, oluşturmayı öğreneceksiniz.

linkstatic=False ise derleme aracı *.runfiles alanındaki paylaşılan kitaplıklara aşina olmanız gerekir.

local_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 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'daki varsayılan bağımlılığı geçersiz kılın.

Varsayılan olarak, C++ ikili programları //tools/cpp:malloc ile bu boş bir kitaplıktır. Bu nedenle ikili program, libc Malloc'u kullanır. Bu etiket bir cc_library değerine başvuruda bulunmalıdır. Derleme C++ olmayan bir bu seçeneğin hiçbir etkisi yoktur. 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 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

Tam sayı; varsayılan değer 0

Derleme bilgilerinin ikili programda kodlanıp kodlanmayacağını belirler. Olası değerler:
  • stamp = 1: Derleme bilgilerini --nostamp derleme. 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ş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

Bağlayıcıya 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 şunlardan 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. Şuna da bakın: sayfa inceleyin.

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ılar tüm rules_cc ile ilgili işlemler (daha hassas kümeler kullanan işlemler hariç yapıları) ayırmanızı sağlar. Bazel, all_files öğesinin bir üst küme olduğunu varsayar diğer tüm yapı sağlayan özelliklerin (ör. linkstamp derlemesinin her ikisinin de derlenmesi gerekiyor) ve dosya bağlayacağınız için bu işlem all_files sürer).

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

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

Ş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

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ı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 parametre, "static_link_cpp_runtimes" etkinleştirildiğini görebilirsiniz. Şimdi de ve bunları dinamik bir şekilde gösterir.

exec_transition_for_inputs

Boole; varsayılan değer True

Yürütme platformu için tüm dosya girişlerini cc_toolchain'de oluşturmak için True olarak ayarlayın. (varsayılan olarak hedef platform) ekleyebilirsiniz.
libc_top

Etiket; varsayılan değer None

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

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

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

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

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 numaralı sorun düzeltilene kadar cc_toolchain öğesini, şununla ilişkilendirmek için önerilen yol budur: CROSSTOOL.toolchain. toolchain_config ile değiştirilecek (#5380) özelliğini gönderin.

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 şunlardan sorumludur:

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

Şuna da bakın: sayfa inceleyin.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

toolchains

Sözlük dizelerini etiketlerle eşleme; nonyapılandırabilir; 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",
            },
          )