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

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


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

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

Ayrıca izin verilen bağlayıcı komut dosyalarını (.lds) sunumlara yerleştirin ve linkopts.
srcs

Etiket listesi; varsayılan değer []

Kitaplık hedefini 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 değeri, bu cc_library otomatik olarak diğer kurala bağlı olur.

Saf derleyici dosyaları (.s, .asm) ön işleme tabi tutulmaz ve genellikle anlatacağım. Önceden işlenmiş derleme dosyaları (.S) önceden işlenir ve genellikle kullanarak derleyiciyi detaylandırırsınız.

.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 bu kuralın hdrs içinde ya da herhangi bir kuralı deps bağımsız değişkeninde listeleniyor.

#included dosyanın tümünden bahsedilmelidir Bunun hdrs özelliği veya referans verilen cc_library ya da gizliyse srcs sayfasında listelenmelidir bu kitaplığa ekle. Ayrıntılı bilgi için "Üstbilgi dahil etme kontrolü" oluşturabilirsiniz.

.so, .lo ve .a dosyaları önceden derlenmiş dosyalardır. Kitaplığınızda bunlar Kullanmadığımız üçüncü taraf kodu kullanıyorsa srcs kaynak kodu kullanılıyor.

srcs özelliği başka bir kuralın etiketini içeriyorsa cc_library, bu kuralın çıkış dosyalarını şu işlemler için kaynak dosya olarak kullanır: derler. Bu, tek seferlik kaynak kodu oluşturmak için yararlıdır (zaman zaman Starlark kural sınıfı uygulamak ve cc_common etiketini kullanmak daha iyidir. API)

İ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 (ör. cc_embed_data). Farklı uzantılar, farklı programlama dillerini olduğunu unutmayın.

data

Etiket listesi; varsayılan değer []

Çalışma zamanında bu kitaplığın ihtiyaç duyduğu dosyaların listesi. data ile ilgili genel yorumları göster tarafından tanımlanan tipik çoğu derleme kuralına bakın.

Oluşturulan bir dosyanın adı data ise cc_library kuralı, otomatik olarak oluşturan kuralı.

data bir kural adıysa cc_library kural otomatik olarak bu kurala bağlıdır, ve bu kuralın outs öğeleri otomatik olarak şuraya eklenir: bu cc_library adlı kullanıcının veri dosyaları.

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


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
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 mevcut paketle değil, çalışma alanına bağlı olmalıdır. Bu özelliğe, third_party dışında ihtiyaç duyulmamalı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. Bu tür sorunlarda neden olabileceği için etkileridir. Şüpheye düştüğünüzde, Bunun yerine local_defines.
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.

hdrs_check

String; varsayılan değer ""

Kullanımdan kaldırıldı, işlem yok.
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 dize paket yolunun başına eklenir ve "include_paths" aracılığıyla genişletme CROSSTOOL özelliği. POSIX sisteminde çalışan bir araç zinciri standart özellik tanımlarıyla -isystem path_to_package/include_entry Bu, yalnızca Google'ın #include ifadeleri yazma stiline uymaz. 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.

Eklenen include yolları, oluşturulan dosyaların yanı sıra dosyalarını da kullanabilirsiniz.

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; 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.link_static 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. libc gibi sistem kitaplıkları (ancak C/C++ çalışma zamanı kitaplıkları değil, aşağıda bakın) ve diğer kütüphaneler de dinamik olarak 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 veya fully_static_link features, //third_party dışında kullanılıyor nedenini açıklamak için lütfen kuralın yanına bir yorum ekleyin.

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.

Üretimde linkstatic=False ile derlenmiş çok az kod olmalıdır. 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.

module_interfaces

Etiket listesi; varsayılan değer []

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

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

  • Clang kullanım EBM'si
  • GCC herhangi bir kaynak dosya uzantısını kullanabilir
  • MSVC, ixx kullanıyor

Kullanım bayrak ile korunuyor --experimental_cpp_modules

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) bu kuralı derlemek amacıyla COPTS öğesinden kaldırılacak. Bu özelliğe gerek olmamalı veya özellik kullanılmamalıdır third_party dışında. Değerlerin ön işlemesi yapılmaz "Marka" dışında hiçbir şekilde değişken yerine
reexport_deps

Etiket listesi; varsayılan değer []

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, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)

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

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


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = 1,
)
. 2. Paylaşılan 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

Unix'te:


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

Windows'da:


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

Unix'te:


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

Windows'da:


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

Unix'te:


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

Windows'da:


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

Kalan değer, Unix ve Windows'da aynıdır:


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

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

cc_import, "dahil 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.

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 dize paket yolunun başına eklenir ve "include_paths" aracılığıyla genişletme CROSSTOOL özelliği. POSIX sisteminde çalışan bir araç zinciri standart özellik tanımlarıyla -isystem path_to_package/include_entry Bu, yalnızca Google'ın #include ifadeleri yazma stiline uymaz. 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.

Varsayılan include yolu, oluşturulan öğeleri içermez dosyası olarak da kaydedebilir. Oluşturulan bir üstbilgide #include işlemi yapmanız gerekiyorsa srcs dosyasında listeleyin.

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

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.

objects

Etiket listesi; varsayılan değer []

pic_objects

Etiket listesi; varsayılan değer []

pic_static_library

Etiket; varsayılan değer None

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, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

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

Statik bağlantıyla bir öğe derlerseniz bağımlı bir kitaplık kuralının çıktısı olan cc_library .a dosyasıdır. Örneğin alwayslink=True, .lo dosyasını alırsınız.

Gerçek çıkış dosyasının adı şudur: libfoo.so paylaşılan kitaplıktır (burada foo kuralın adıdır). İlgili içeriği oluşturmak için kullanılan diğer kitaplık türleri .lo ve .a ile biter. tıklayın. Belirli bir paylaşılan kitaplık adına ihtiyacınız varsa Python modülü tanımlamak için genrule komutunu kullanarak kitaplığı kopyalayın istediğiniz ada ekleyebilirsiniz.

Üstbilgi dahil etme kontrolü

Derlemede kullanılan tüm başlık dosyaları cc_* kuralından hdrs veya srcs. Zorunlu kılınır.

cc_library kuralları için hdrs içindeki başlıklar, kitaplığın herkese açık arayüzünden oluşturulur ve hem hdrs ve srcs kitaplığındaki dosyalardan ve hdrs ve srcs dosyalarındaki dosyalardan kitaplığı deps içinde listeleyen cc_* kuralından. srcs içindeki başlıklar yalnızca dosyalardan doğrudan eklenmelidir hdrs ve srcs kitaplığının kendisinde. Zaman hdrs veya srcs içerisine başlık koymaya karar verdiğinizde, bu kütüphanedeki tüketicilerin şu işlemleri yapmasına izin verip vermediğinizi: dahil edebilirsiniz. Bu karar, yaklaşık olarak Programlama dillerinde public ile private arasında görünürlük.

cc_binary ve cc_test kuralda dışa aktarılmış veri yok arayüzü olduğundan hdrs özelliğine de sahip değildirler. Tüm başlıklar veya teste doğrudan ait olanlar srcs.

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 adlı uygulamanın doğrudan foo.h ve bar.h içerir, ancak baz.h içermez.

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.

Örnekler


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

Aşağıdaki örnek, Yeşil Ofis third_party/python2_4_3/BUILD Kodlardan bazıları dl kitaplığını kullanır ( başka bir dinamik kitaplıktır), kuralı,-ldl dl kitaplığı.


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

Aşağıdaki örnek, third_party/kde/BUILD alanından geliyor. Önceden oluşturulmuş .so dosyalarını depoda tutuyoruz. Üstbilgi dosyaları include adlı bir alt dizinde bulunur.


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

Aşağıdaki örnek, third_party/gles/BUILD alanından geliyor. Üçüncü taraf kodu için genellikle defines ve linkopts.


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

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan değer []

Kitaplık hedefinin temel aldığı diğer kitaplıkların listesi.

Bunlar, cc_library veya objc_library hedef olabilir.

deps ile ilgili genel yorumları göster tarafından tanımlanan tipik çoğu derleme kuralına bakın.

Bunlar, C++ kitaplık kurallarının adları olmalıdır. Bu kuralın kitaplığını bağlayan bir ikili program oluşturduğunuzda, deps uygulamasındaki kitaplıkları da bağlayacaksınız.

"Düşüncelere" rağmen adı, bu kitaplığın tüm istemcileri değil buraya ait. Çalışma zamanı veri bağımlılıkları data öğesine aittir. Diğer kurallar tarafından oluşturulan kaynak dosyalar srcs klasörüne ait.

Önceden derlenmiş bir üçüncü taraf kitaplığına bağlantı oluşturmak için adını Bunun yerine srcs.

Bu kitaplığa bağlamadan bir şeye bağımlı olmak için adını data olarak değiştirin.

srcs

Etiket listesi; varsayılan değer []

Kitaplık hedefini 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 değeri, bu cc_library otomatik olarak diğer kurala bağlı olur.

Saf derleyici dosyaları (.s, .asm) ön işleme tabi tutulmaz ve genellikle anlatacağım. Önceden işlenmiş derleme dosyaları (.S) önceden işlenir ve genellikle kullanarak derleyiciyi detaylandırırsınız.

.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 bu kuralın hdrs içinde ya da herhangi bir kuralı deps bağımsız değişkeninde listeleniyor.

#included dosyanın tümünden bahsedilmelidir Bunun hdrs özelliği veya referans verilen cc_library ya da gizliyse srcs sayfasında listelenmelidir bu kitaplığa ekle. Ayrıntılı bilgi için "Üstbilgi dahil etme kontrolü" oluşturabilirsiniz.

.so, .lo ve .a dosyaları önceden derlenmiş dosyalardır. Kitaplığınızda bunlar Kullanmadığımız üçüncü taraf kodu kullanıyorsa srcs kaynak kodu kullanılıyor.

srcs özelliği başka bir kuralın etiketini içeriyorsa cc_library, bu kuralın çıkış dosyalarını şu işlemler için kaynak dosya olarak kullanır: derler. Bu, tek seferlik kaynak kodu oluşturmak için yararlıdır (zaman zaman Starlark kural sınıfı uygulamak ve cc_common etiketini kullanmak daha iyidir. API)

İ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 (ör. cc_embed_data). Farklı uzantılar, farklı programlama dillerini olduğunu unutmayın.

data

Etiket listesi; varsayılan değer []

Çalışma zamanında bu kitaplığın ihtiyaç duyduğu dosyaların listesi. data ile ilgili genel yorumları göster tarafından tanımlanan tipik çoğu derleme kuralına bakın.

Oluşturulan bir dosyanın adı data ise cc_library kuralı, otomatik olarak oluşturan kuralı.

data bir kural adıysa cc_library kural otomatik olarak bu kurala bağlıdır, ve bu kuralın outs öğeleri otomatik olarak şuraya eklenir: bu cc_library adlı kullanıcının veri dosyaları.

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


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
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.

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

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 mevcut paketle değil, çalışma alanına bağlı olmalıdır. Bu özelliğe, third_party dışında ihtiyaç duyulmamalı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. Bu tür sorunlarda neden olabileceği için etkileridir. Şüpheye düştüğünüzde, Bunun yerine local_defines.
hdrs_check

String; varsayılan değer ""

Kullanımdan kaldırıldı, işlem yok.
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.

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

includes

Dize listesi; varsayılan değer []

Derleme satırına eklenecek dizin dosyalarının listesi. "Değişken yap" değişikliğine tabidir. Her dize paket yolunun başına eklenir ve "include_paths" aracılığıyla genişletme CROSSTOOL özelliği. POSIX sisteminde çalışan bir araç zinciri standart özellik tanımlarıyla -isystem path_to_package/include_entry Bu, yalnızca Google'ın #include ifadeleri yazma stiline uymaz. 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.

Eklenen include yolları, oluşturulan dosyaların yanı sıra dosyalarını da kullanabilirsiniz.

linkopts

Dize listesi; varsayılan değer []

cc_binary.linkopts başlıklı makaleyi inceleyin. linkopts özelliği, deps aracılığıyla doğrudan veya dolaylı olarak bu kitaplığa bağlıdır özellikleri aracılığıyla (veya benzer şekilde ele alınan diğer özellikler aracılığıyla) malloc (cc_binary) özelliğini gönderin. Bağımlılık linkopt'ler, bağımlı linkopt'lere (ör. bağımlılık linkopt'lerine) göre önceliklidir daha sonra komut satırında görünür). Linkopt'ler şurada belirtiliyor: --linkopt kurallı linkopt'lere göre önceliklidir.

linkopts özelliğinin yalnızca .so dosya veya yürütülebilir dosya oluştururken .a veya .lo dosyaları oluştururken. Yani, linkstatic=True özelliği ayarlanırsa linkopts özelliğinin, oluşturma üzerinde herhangi bir etkisi yoktur. bu kitaplıkta, yalnızca bu kitaplığa bağımlı diğer hedeflerde kullanılabilir.

Ayrıca, burada belirtilen "-Wl,-soname" ifadesinin veya "-Xlinker -soname" seçenekleri desteklenmez ve bu özellikte hiçbir zaman belirtilmemelidir.

cc_library tarafından üretilen .so dosyaları kuralları, bağımlı oldukları kitaplıklara bağlı değil beklemeye gerek yoktur. Kullanmak için paylaşılan bir kitaplık oluşturmaya çalışıyorsanız ana deponun dışında, ör. manuel kullanım için dlopen() veya LD_PRELOAD ile, cc_binary kuralı kullanmak daha iyi olabilir linkshared=True özelliği için de kullanılabilir. cc_binary.linkshared başlıklı makaleyi inceleyin.

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.link_static 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. libc gibi sistem kitaplıkları (ancak C/C++ çalışma zamanı kitaplıkları değil, aşağıda bakın) ve diğer kütüphaneler de dinamik olarak 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 veya fully_static_link features, //third_party dışında kullanılıyor nedenini açıklamak için lütfen kuralın yanına bir yorum ekleyin.

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.

Üretimde linkstatic=False ile derlenmiş çok az kod olmalıdır. 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.
module_interfaces

Etiket listesi; varsayılan değer []

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

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

  • Clang kullanım EBM'si
  • GCC herhangi bir kaynak dosya uzantısını kullanabilir
  • MSVC, ixx kullanıyor

Kullanım bayrak ile korunuyor --experimental_cpp_modules

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.

Bu özellik yalnızca third_party kapsamında yasaldı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, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, 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, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)

Paylaşılan bir kitaplık oluş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.

experimental_disable_topo_sort_do_not_use_remove_before_7_0

Boole; varsayılan değer False

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

roots

Etiket listesi; varsayılan değer []

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

Dize listesi; varsayılan değer []

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.

cc_static_library

Kural kaynağını görüntüle
cc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Bir hedefler listesinden ve bunların geçişli bağımlılıklarından statik bir kitaplık oluşturur.

Ortaya çıkan statik kitaplık, deps ve bunların geçişli bağımlılıkları, PIC nesne.

Çıkış grupları

linkdeps

Şu tabloda listelenen hedeflerin geçişli bağımlılıklarının etiketlerini içeren bir metin dosyası: deps (Statik kitaplığa nesne dosyası eklemeyen), ancak katkıda bulunanlar: en az bir statik, dinamik veya arayüz kitaplığı sağlamalısınız. Elde edilen statik kitaplık bağlantı sırasında bu kitaplıkların kullanılabilir olmasını gerektirebilir.

linkopts

Kullanıcılar tarafından sağlanan tüm geçişli öğelerin linkopts öğesini içeren metin dosyası deps içinde listelenen hedeflerin bağımlılıklarını

Yinelenen simgeler

Varsayılan olarak cc_static_library kuralı, oluşturulan statik kitaplığında yinelenen simge yok. Aksi takdirde derleme bir hatayla başarısız oluyor iletisinin bir kopyasını oluşturun.

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

symbol_check için araç zinciri desteği

Bazel ile gönderilen ve otomatik olarak yapılandırılmış C++ araç zincirleri, symbol_check özelliğini tüm platformlarda kullanabilirsiniz. Özel araç zincirleri, iki yöntemden biriyle yapabilirsiniz:

  • ACTION_NAMES.validate_static_library işlemini uygulamak ve symbol_check özelliğiyle etkinleştiriyorum. İşlemdeki araç seti olmak üzere iki bağımsız değişkenle çağrılır: yinelenen sembolleri kontrol etmek için statik kitaplık ve yolu kontrol edilir.
  • symbol_check özelliğinin, işlemi, yinelenen simgeler için başarısız olacak şekilde oluşturmamanız gerekir.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan değer []

Geçişli tüm hedefleri de dahil olmak üzere statik bir kitaplıkta birleştirilecek hedeflerin listesi ve bildirmeyi konuştuk.

Herhangi bir nesne dosyası sağlamayan bağımlılıklar statik ancak bunların etiketleri linkdeps çıkış grubu.

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

cc_test() kuralı bir test derler. Burada bir test bazı test kodlarının etrafında kullanılan ikili sarmalayıcıdır.

Varsayılan olarak, C++ testleri dinamik olarak bağlanır.
. Bir birim testini statik olarak bağlamak için linkstatic=True Test etmenizin neden gerekli olduğunu açıklamak isterim. linkstatic; muhtemelen bu bariz değildir.

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

Aşağıdakiler hariç olmak üzere cc_binary() bağımsız değişkenlerini görün stamp bağımsız değişkeni testler için varsayılan olarak 0'a ayarlanır ve bu cc_test için ekstra tüm test kurallarında (*_test) ortak özellikler.

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.

Ayrıca izin verilen bağlayıcı komut dosyalarını (.lds) sunumlara yerleştirin ve linkopts.
srcs

Etiket listesi; varsayılan değer []

Kitaplık hedefini 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 değeri, bu cc_library otomatik olarak diğer kurala bağlı olur.

Saf derleyici dosyaları (.s, .asm) ön işleme tabi tutulmaz ve genellikle anlatacağım. Önceden işlenmiş derleme dosyaları (.S) önceden işlenir ve genellikle kullanarak derleyiciyi detaylandırırsınız.

.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 bu kuralın hdrs içinde ya da herhangi bir kuralı deps bağımsız değişkeninde listeleniyor.

#included dosyanın tümünden bahsedilmelidir Bunun hdrs özelliği veya referans verilen cc_library ya da gizliyse srcs sayfasında listelenmelidir bu kitaplığa ekle. Ayrıntılı bilgi için "Üstbilgi dahil etme kontrolü" oluşturabilirsiniz.

.so, .lo ve .a dosyaları önceden derlenmiş dosyalardır. Kitaplığınızda bunlar Kullanmadığımız üçüncü taraf kodu kullanıyorsa srcs kaynak kodu kullanılıyor.

srcs özelliği başka bir kuralın etiketini içeriyorsa cc_library, bu kuralın çıkış dosyalarını şu işlemler için kaynak dosya olarak kullanır: derler. Bu, tek seferlik kaynak kodu oluşturmak için yararlıdır (zaman zaman Starlark kural sınıfı uygulamak ve cc_common etiketini kullanmak daha iyidir. API)

İ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 (ör. cc_embed_data). Farklı uzantılar, farklı programlama dillerini olduğunu unutmayın.

data

Etiket listesi; varsayılan değer []

Çalışma zamanında bu kitaplığın ihtiyaç duyduğu dosyaların listesi. data ile ilgili genel yorumları göster tarafından tanımlanan tipik çoğu derleme kuralına bakın.

Oluşturulan bir dosyanın adı data ise cc_library kuralı, otomatik olarak oluşturan kuralı.

data bir kural adıysa cc_library kural otomatik olarak bu kurala bağlıdır, ve bu kuralın outs öğeleri otomatik olarak şuraya eklenir: bu cc_library adlı kullanıcının veri dosyaları.

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


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
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 mevcut paketle değil, çalışma alanına bağlı olmalıdır. Bu özelliğe, third_party dışında ihtiyaç duyulmamalı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. Bu tür sorunlarda neden olabileceği için etkileridir. Şüpheye düştüğünüzde, Bunun yerine local_defines.
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.

hdrs_check

String; varsayılan değer ""

Kullanımdan kaldırıldı, işlem yok.
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 dize paket yolunun başına eklenir ve "include_paths" aracılığıyla genişletme CROSSTOOL özelliği. POSIX sisteminde çalışan bir araç zinciri standart özellik tanımlarıyla -isystem path_to_package/include_entry Bu, yalnızca Google'ın #include ifadeleri yazma stiline uymaz. 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.

Eklenen include yolları, oluşturulan dosyaların yanı sıra dosyalarını da kullanabilirsiniz.

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

cc_binary ve cc_test: İkili dosyayı statik yatırım yapmanız önemlidir. cc_library.link_static 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. libc gibi sistem kitaplıkları (ancak C/C++ çalışma zamanı kitaplıkları değil, aşağıda bakın) ve diğer kütüphaneler de dinamik olarak 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 veya fully_static_link features, //third_party dışında kullanılıyor nedenini açıklamak için lütfen kuralın yanına bir yorum ekleyin.

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.

Üretimde linkstatic=False ile derlenmiş çok az kod olmalıdır. 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.

module_interfaces

Etiket listesi; varsayılan değer []

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

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

  • Clang kullanım EBM'si
  • GCC herhangi bir kaynak dosya uzantısını kullanabilir
  • MSVC, ixx kullanıyor

Kullanım bayrak ile korunuyor --experimental_cpp_modules

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) bu kuralı derlemek amacıyla COPTS öğesinden kaldırılacak. Bu özelliğe gerek olmamalı veya özellik kullanılmamalıdır third_party dışında. Değerlerin ön işlemesi yapılmaz "Marka" dışında hiçbir şekilde değişken yerine
reexport_deps

Etiket listesi; varsayılan değer []

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_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

C++ araç zincirini temsil eder.

Bu kural ş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 False

Kullanımdan kaldırıldı. İşlemsiz
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.
output_licenses

Dize listesi; varsayılan değer []

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

Kullanımdan kaldırıldı: Kural yoktur ve kaldırılacaktır.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

fdo_prefetch_hints

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

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


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

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

profile

Etiket; zorunlu

İpuçları profilinin etiketi. İ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, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

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


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

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

memprof_profile

Etiket; varsayılan değer None

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

Etiket; zorunlu

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, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

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


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

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

profile

Etiket; zorunlu

MEMPROF profilinin etiketi. Profilin .profdata uzantısı (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, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, 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"
)

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

cc_profile

Etiket; zorunlu

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

Etiket; zorunlu

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