C / C++ Kuralları

Sorun bildirin Kaynağı göster

Kurallar

cc_binary

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

Örtülü çıkış hedefleri

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

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

deps

List of labels; optional

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

Bunlar cc_library veya objc_library hedefleri olabilir.

srcs

List of labels; optional

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

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

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

Tüm #included dosyaları, bu kuralın srcs özelliğinde veya referans verilen cc_library() öğelerinin hdrs özelliğinde belirtilmelidir. Önerilen stil, bir kitaplıkla ilişkilendirilen başlıkların söz konusu kitaplığın hdrs özelliğinde listelenmesi ve bu kuralın kaynaklarıyla ilişkili kalan başlıkların srcs içinde listelenmesi için önerilir. Daha ayrıntılı bir açıklama için "Başlık ekleme kontrolü" bölümüne bakın.

Bir kuralın adı srcs ifadesindeyse otomatik olarak bu kurala bağlı olur. Adlandırılmış kuralın outs C veya C++ kaynak dosyalarıysa bu kuralda derlenirler; kitaplık dosyalarıysa birbirine bağlanır.

İzin verilen srcs dosya türleri:

  • C ve C++ kaynak dosyaları: .c, .cc, .cpp, .cxx, .c++, .C
  • C ve C++ başlık dosyaları: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • C ön işlemcili derleyici: .S
  • Arşiv: .a, .pic.a
  • "Her zaman bağla" kitaplığı: .lo, .pic.lo
  • Paylaşılan veya sürüm verilmemiş paylaşılan kitaplık: .so, .so.version
  • Nesne dosyası: .o, .pic.o

...ve bu dosyaları üreten tüm kurallar. Farklı uzantılar, gcc kurallarına uygun şekilde farklı programlama dillerini belirtir.

additional_linker_inputs

List of labels; optional

Bu dosyaları C++ bağlayıcı komutuna geçirin.

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

copts

List of strings; optional

C++ derleme komutuna bu seçenekleri ekleyin. "Değişken oluştur" değişikliğine ve Bourne kabuğu jeton dönüştürmesine tabidir.

Bu özellikteki her dize, ikili hedef derlenmeden önce belirtilen sırada COPTS özelliğine eklenir. İşaretler, yalnızca bu hedefi derlemek için uygulanır, bağımlılıkları için geçerli değildir. Bu nedenle, başka bir yere eklenen başlık dosyaları konusunda dikkatli olun. Tüm yollar mevcut pakete değil, çalışma alanına göre olmalıdır.

Paket no_copts_tokenization özelliğini bildirirse Bourne kabuğu jetona dönüştürme yalnızca tek bir "Make" değişkeninden oluşan dizeler için geçerlidir.

defines

List of strings; optional

Derleme satırına eklenecek tanımlayıcıların listesi. "Make" değişkeni değiştirme ve Bourne kabuk jetonlara dönüştürme işlemlerine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dize, -D ifadesinin başına eklenir ve bu hedefe ve ona bağlı her kural için derleme komut satırına eklenir. Çok geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde tanım değerlerini local_defines öğesine ekleyin.
includes

List of strings; optional

Derleme satırına eklenecek dir'leri dahil edin.

"Değişken oluştur" değişikliğine tabidir. Her dizenin başına -isystem eklenir ve COPTS ifadesine eklenir. COPTS'in aksine, bu işaretler bu kurala ve ona bağlı olan her kural için eklenir. (Not: bağlı olduğu kurallar değil Bunun geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde -OPTİMİZE yerine "-I" işaretleri ekleyin.

Üstbilgiler, src'lere veya hdr'lere eklenmelidir. Aksi takdirde, derleme korumalı alana alındığında (varsayılan) bağlı kurallar tarafından kullanılamaz.

linkopts

List of strings; optional

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Make" değişkeni değiştirme, Bourne kabuğu jetonlarına dönüştürme ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS öğesine eklenir.

Bu listenin $ veya - ile başlamayan her bir öğesinin, deps içindeki bir hedefin etiketi olduğu varsayılır. Bu hedef tarafından oluşturulan dosyaların listesi bağlayıcı seçeneklerine eklenir. Etiket geçersizse veya deps öğesinde bildirilmezse hata bildirilir.

linkshared

Boolean; optional; nonconfigurable; default is False

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

Bu işaretin olması, bağlantı oluşturma işleminin -shared ile gcc bağlantısı olarak gerçekleştiği ve sonuç olarak paylaşılan paylaşılan kitaplığın, örneğin bir Java programına yüklenmeye uygun olduğu anlamına gelir. Bununla birlikte, cc_binary kuralıyla oluşturulan paylaşılan kitaplıkların yalnızca diğer programlar tarafından manuel olarak yüklendiği varsayıldığından derleme için hiçbir zaman bağımlı ikili dosyaya bağlanmaz. Bu nedenle, bu kuralın cc_library kuralının yerine geçmemesi gerekir. Ölçeklenebilirlik sağlamak için bu yaklaşımdan tamamen kaçınmanızı ve bunun yerine java_library kuralının cc_library kurallarına bağlı olmasına izin vermenizi öneririz.

Hem linkopts=['-static'] hem de linkshared=True değerini belirtirseniz tamamen bağımsız olan tek bir birim alırsınız. Hem linkstatic=True hem de linkshared=True belirtirseniz çoğu zaman bağımsız olan tek bir birim alırsınız.

linkstatic

Boolean; optional; default is True

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

Bu seçenek varsayılan olarak cc_binary için etkin, geri kalanlar için kapalıdır.

Bu seçenek etkinleştirilirse ve bu bir ikili program veya test ise mümkün olduğunda kullanıcı kitaplıklarında derleme aracına .so yerine .a öğeleri içinde bağlantı verilmesini sağlar. Statik kitaplığı olmayan kitaplıklar ve bazı sistem kitaplıkları dinamik olarak bağlanmaya devam edebilir. Sonuç olarak, yürütülebilir dosya dinamik olarak bağlanacağı için yalnızca çoğunlukla statik olur.

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

  • Full_static_link özelliğinin bulunduğu ve her şeyin statik olarak bağlandığı STATIC; ör. "gcc -static foo.o libbar.a libbaz.a -lm".
    Bu mod, features özelliğinde fully_static_link belirtilerek etkinleştirilir.
  • Tüm kullanıcı kitaplıklarının statik olarak bağlandığı (Statik bir sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı STATIC. Örneğin, "gcc foo.o libfoo.a libbaz.a -lm".
    Bu mod, linkstatic=True belirtildiğinde etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DİNAMİK (örneğin, bir dinamik sürüm varsa), ör. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False değeri belirtilerek etkinleştirilir.

cc_library() kuralında kullanılan linkstatic özelliği farklı bir anlama sahip. linkstatic=True, C++ kitaplığında yalnızca statik bağlantıya izin verildiğini belirtir. Bu nedenle hiçbir .so oluşturulmaz. linkstatic=False, statik kitaplıkların oluşturulmasını engellemez. Bu özelliğin amacı, dinamik kitaplıkların oluşturulmasıdır.

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

local_defines

List of strings; optional

Derleme satırına eklenecek tanımlayıcıların listesi. "Make" değişkeni değiştirme ve Bourne kabuk jetonlara dönüştürme işlemlerine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dize, -D ifadesinin başına eklenir ve bu hedefin derleme komut satırına eklenir ancak bağımlılarına eklenmez.
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

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

Varsayılan olarak C++ ikili programları //tools/cpp:malloc ile bağlantılıdır. Boş kitaplık, ikili programın libc Malloc ile kullanılmasıdır. Bu etiket bir cc_library etiketi olmalıdır. Derleme C++ olmayan bir kural içinse bu seçeneğin hiçbir etkisi yoktur. linkshared=True belirtilirse bu özelliğin değeri yok sayılır.

nocopts

String; optional

C++ derleme komutundan eşleme seçeneklerini kaldırın. "Oluşturma" değişkeni değişimine tabidir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden oluşturulmuş 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 nadiren ihtiyaç duyulmalıdır.
stamp

Integer; optional; default is -1

Derleme bilgilerinin ikili programda kodlanıp kodlanmayacağını belirler. Olası değerler:
  • stamp = 1: --nostamp derlemelerinde bile derleme bilgilerini her zaman ikili dosyaya yapıştırın. İkili program ve ona bağlı olan tüm aşağı akış işlemleri için potansiyel olarak önbelleğe almayı sonlandıracağından bu ayardan kaçınılmalıdır.
  • stamp = 0: Derleme bilgilerini her zaman sabit değerlerle değiştirin. Bu sayede iyi bir derleme sonucunu önbelleğe alabilirsiniz.
  • stamp = -1: Derleme bilgilerinin yerleştirilmesi --[no]stamp işareti tarafından kontrol edilir.

Damgalı ikili programlar, bağımlılıkları değişmediği sürece yeniden oluşturulmaz.

win_def_file

Label; optional

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

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

cc_içe aktarma

Kural kaynağını göster
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)

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

Genel kullanım alanları aşağıda belirtilmiştir:
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 kitaplığı bağlama (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Paylaşılan bir kitaplığı arayüz kitaplığına bağlama (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. Paylaşılan bir kitaplığı system_provided=True ile bağlama (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
5. Statik veya paylaşılan kitaplıkla bağlantı oluşturma
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. Örneğin:
  cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = [ "vendor/curl/include" ],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

deps

List of labels; optional

Hedefin bağlı olduğu diğer kitaplıkların listesi. Çoğu derleme kuralının tanımladığı tipik özellikler başlıklı makalede deps hakkında genel yorumları görebilirsiniz.
hdrs

List of labels; optional

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

Boolean; optional; default is False

1 ise ikili program tarafından referans verilmiş herhangi bir simge olmasa bile bu C++ önceden derlenmiş kitaplığına bağımlı (doğrudan veya dolaylı olarak) herhangi bir ikili program, statik kitaplıkta arşivlenen tüm nesne dosyalarına bağlanır. Bu, kodunuz ikili programdaki kod tarafından açıkça çağrılmıyorsa (ör. kodunuz bir hizmet tarafından sağlanan bazı geri çağırmaları almak için kaydediliyorsa) yararlıdır.

Windows'da VS 2017 her zaman çalışmıyorsa bunun nedeni bilinen bir sorundur lütfen VS 2017'nizi en son sürüme geçirin.

interface_library

Label; optional

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

Label; optional

Önceden derlenmiş tek bir paylaşılan kitaplık. Bazel, çalışma zamanında buna bağlı olan ikili program tarafından kullanılabilir.

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

static_library

Label; optional

Önceden derlenmiş tek bir statik kitaplık.

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

system_provided

Boolean; optional; default is False

1 ise çalışma zamanında gereken paylaşılan kitaplığın sistem tarafından sağlandığını gösterir. Bu durumda, interface_library değeri belirtilmeli ve shared_library boş bırakılmalıdır.

cc_kitaplık

Kural kaynağını göster
cc_library(name, deps, srcs, data, hdrs, 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)

Başlık ekleme kontrolü

Derlemede kullanılan tüm başlık dosyaları, cc_* kuralların hdrs veya srcs kuralında tanımlanmalıdır. Bu zorunlu kılınır.

cc_library kuralları için hdrs içindeki başlıklar, kitaplığın herkese açık arayüzünü oluşturur ve hem hdrs içindeki hem de srcs kapsamındaki dosyaların yanı sıra, deps kitaplığında yer alan hdrs ve cc_* içerisindeki dosyalardan da doğrudan eklenebilir.srcs srcs içindeki başlıklar doğrudan kitaplığın hdrs ve srcs içindeki dosyalardan doğrudan dahil edilmelidir. Üstbilgiyi hdrs veya srcs etiketi içine alıp almayacağınıza karar verirken bu kitaplıktaki tüketicilerin bu başlığı doğrudan dahil edip etmediklerini sormalısınız. Bu karar, programlama dillerindeki public ile private arasındaki görünürlük oranıyla neredeyse aynıdır.

cc_binary ve cc_test kurallarının dışa aktarılan arayüzü olmadığından hdrs özelliği de yoktur. İkiliye veya teste ait olan tüm üst bilgiler srcs içinde listelenmelidir.

Bu kuralları göstermek için aşağıdaki örneği inceleyin.

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

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

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

Bu örnekte izin verilen doğrudan eklemeler aşağıdaki tabloda listelenmiştir. Örneğin, foo.cc, foo.h ve bar.h değerlerini doğrudan dahil edebilir, ancak baz.h değerini içeremez.

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

Dahil etme kontrol kuralları yalnızca doğrudan dahil etmeler için geçerlidir. Yukarıdaki örnekte foo.cc, bar.h içerebilir. baz.h içerebilir. Buna da baz-impl.h eklenmesine izin verilir. Teknik olarak, bir .cc dosyasının derlemesi, geçişli deps kapatma işleminin herhangi bir cc_library bölümünde hdrs veya srcs kapsamındaki tüm başlık dosyalarını toplu olarak içerebilir. Bu durumda, derleyici foo.cc derleme yaparken baz.h ve baz-impl.h değerlerini okuyabilir ancak foo.cc, #include "baz.h" içermemelidir. Buna izin verilebilmesi için baz, foo öğesinin deps listesine eklenmelidir.

Bazel, dahil etme kontrol kurallarının uygulanması için araç zinciri desteğine ihtiyaç duyar. layering_check özelliğinin, araç zinciri tarafından desteklenmesi ve açık bir şekilde istenmesi (ör. --features=layering_check komut satırı işareti veya package işlevinin features parametresi) gerekir. Bazel tarafından sağlanan araç zincirleri, bu özelliği yalnızca Unix ve macOS'te clang ile destekler.

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

deps

List of labels; optional

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

Bunlar cc_library veya objc_library hedefleri olabilir.

srcs

List of labels; optional

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

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

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

Tüm #included dosyaları, bu kuralın srcs özelliğinde veya referans verilen cc_library() öğelerinin hdrs özelliğinde belirtilmelidir. Önerilen stil, bir kitaplıkla ilişkilendirilen başlıkların söz konusu kitaplığın hdrs özelliğinde listelenmesi ve bu kuralın kaynaklarıyla ilişkili kalan başlıkların srcs içinde listelenmesi için önerilir. Daha ayrıntılı bir açıklama için "Başlık ekleme kontrolü" bölümüne bakın.

Bir kuralın adı srcs ifadesindeyse otomatik olarak bu kurala bağlı olur. Adlandırılmış kuralın outs C veya C++ kaynak dosyalarıysa bu kuralda derlenirler; kitaplık dosyalarıysa birbirine bağlanır.

İzin verilen srcs dosya türleri:

  • C ve C++ kaynak dosyaları: .c, .cc, .cpp, .cxx, .c++, .C
  • C ve C++ başlık dosyaları: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • C ön işlemcili derleyici: .S
  • Arşiv: .a, .pic.a
  • "Her zaman bağla" kitaplığı: .lo, .pic.lo
  • Paylaşılan veya sürüm verilmemiş paylaşılan kitaplık: .so, .so.version
  • Nesne dosyası: .o, .pic.o

...ve bu dosyaları üreten tüm kurallar. Farklı uzantılar, gcc kurallarına uygun şekilde farklı programlama dillerini belirtir.

hdrs

List of labels; optional

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

Bu, kitaplık arayüzünü tanımlayan başlık dosyalarını bildirmek için tercih edilen konumdur. Bu başlıklar, bu kurala veya bağımlı kurallara dahil edilen kaynakların dahil edilmesi için kullanıma sunulacaktır. Bu kitaplığın bir müşterisi tarafından eklenmesi amaçlanmamış olan başlıklar, yayınlanan bir başlıkta yer alsa bile srcs özelliğinde listelenmelidir. Daha ayrıntılı bir açıklama için "Başlık ekleme" kontrolüne bakın.

Boolean; optional; default is False

1 ise bu C++ kitaplığına bağlı olan (doğrudan veya dolaylı olarak) ikili program, srcs tarafından listelenen dosyaların tüm nesne dosyalarına (bazıları ikili program tarafından referans verilen herhangi bir simge içermiyor olsa bile) bağlantı verir. Bu, kodunuz ikili programdaki kod tarafından açıkça çağrılmıyorsa (ör. kodunuz bir hizmet tarafından sağlanan bazı geri çağırmaları almak için kaydediliyorsa) yararlıdır.

Windows'da VS 2017 her zaman çalışmıyorsa bunun nedeni bilinen bir sorundur lütfen VS 2017'nizi en son sürüme geçirin.

copts

List of strings; optional

C++ derleme komutuna bu seçenekleri ekleyin. "Değişken oluştur" değişikliğine ve Bourne kabuğu jeton dönüştürmesine tabidir.

Bu özellikteki her dize, ikili hedef derlenmeden önce belirtilen sırada COPTS özelliğine eklenir. İşaretler, yalnızca bu hedefi derlemek için uygulanır, bağımlılıkları için geçerli değildir. Bu nedenle, başka bir yere eklenen başlık dosyaları konusunda dikkatli olun. Tüm yollar mevcut pakete değil, çalışma alanına göre olmalıdır.

Paket no_copts_tokenization özelliğini bildirirse Bourne kabuğu jetona dönüştürme yalnızca tek bir "Make" değişkeninden oluşan dizeler için geçerlidir.

defines

List of strings; optional

Derleme satırına eklenecek tanımlayıcıların listesi. "Make" değişkeni değiştirme ve Bourne kabuk jetonlara dönüştürme işlemlerine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dize, -D ifadesinin başına eklenir ve bu hedefe ve ona bağlı her kural için derleme komut satırına eklenir. Çok geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde tanım değerlerini local_defines öğesine ekleyin.
implementation_deps

List of labels; optional

Kitaplık hedefinin bağlı olduğu diğer kitaplıkların listesi. deps kitaplığından farklı olarak, bu kitaplıkların başlıkları ve dahil edilen yolları (ve bunların tüm geçişli tanımlayıcıları) yalnızca bu kitaplığın derlenmesi için kullanılır. Bu kitaplıklara bağlı olan kitaplıklar kullanılmaz. implementation_deps ile belirtilen kitaplıklar, bu kitaplığa bağımlı ikili hedeflerde hâlâ bağlı.

Şimdilik kullanım cc_libraries ile sınırlıdır ve --experimental_cc_implementation_deps bayrağıyla korunmaktadır.

include_prefix

String; optional

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

Bu kural ayarlandığında, bu kuralın hdrs özelliğindeki başlıklara erişilebilir. Bu özellik, depoya bağlı yolunun başına eklenmiş değerdir.

Bu özellik eklenmeden önce strip_include_prefix özelliğindeki ön ek kaldırılır.

includes

List of strings; optional

Derleme satırına eklenecek dir'leri dahil edin.

"Değişken oluştur" değişikliğine tabidir. Her dizenin başına -isystem eklenir ve COPTS ifadesine eklenir. COPTS'in aksine, bu işaretler bu kurala ve ona bağlı olan her kural için eklenir. (Not: bağlı olduğu kurallar değil Bunun geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde -OPTİMİZE yerine "-I" işaretleri ekleyin.

Üstbilgiler, src'lere veya hdr'lere eklenmelidir. Aksi takdirde, derleme korumalı alana alındığında (varsayılan) bağlı kurallar tarafından kullanılamaz.

linkopts

List of strings; optional

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Make" değişkeni değiştirme, Bourne kabuğu jetonlarına dönüştürme ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS öğesine eklenir.

Bu listenin $ veya - ile başlamayan her bir öğesinin, deps içindeki bir hedefin etiketi olduğu varsayılır. Bu hedef tarafından oluşturulan dosyaların listesi bağlayıcı seçeneklerine eklenir. Etiket geçersizse veya deps öğesinde bildirilmezse hata bildirilir.

linkstamp

Label; optional

Belirtilen C++ kaynak dosyasını aynı anda derler ve nihai ikili dosyaya bağlar. Bu hile, zaman damgası bilgilerinin ikili programlara aktarılması için gereklidir. Kaynak dosyayı bir nesne dosyasında normal şekilde derlediğimizde zaman damgası yanlış olur. Bağlantı damga derlemesi, belirli bir derleyici işareti grubunu içermediğinden herhangi bir başlığa, derleyici seçeneğine veya başka bir derleme değişkenine bağlı olmamalıdır. Bu seçenek yalnızca base paketinde kullanılmalıdır.
linkstatic

Boolean; optional; default is False

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

Bu seçenek varsayılan olarak cc_binary için etkin, geri kalanlar için kapalıdır.

Bu seçenek etkinleştirilirse ve bu bir ikili program veya test ise mümkün olduğunda kullanıcı kitaplıklarında derleme aracına .so yerine .a öğeleri içinde bağlantı verilmesini sağlar. Statik kitaplığı olmayan kitaplıklar ve bazı sistem kitaplıkları dinamik olarak bağlanmaya devam edebilir. Sonuç olarak, yürütülebilir dosya dinamik olarak bağlanacağı için yalnızca çoğunlukla statik olur.

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

  • Full_static_link özelliğinin bulunduğu ve her şeyin statik olarak bağlandığı STATIC; ör. "gcc -static foo.o libbar.a libbaz.a -lm".
    Bu mod, features özelliğinde fully_static_link belirtilerek etkinleştirilir.
  • Tüm kullanıcı kitaplıklarının statik olarak bağlandığı (Statik bir sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı STATIC. Örneğin, "gcc foo.o libfoo.a libbaz.a -lm".
    Bu mod, linkstatic=True belirtildiğinde etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DİNAMİK (örneğin, bir dinamik sürüm varsa), ör. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False değeri belirtilerek etkinleştirilir.

cc_library() kuralında kullanılan linkstatic özelliği farklı bir anlama sahip. linkstatic=True, C++ kitaplığında yalnızca statik bağlantıya izin verildiğini belirtir. Bu nedenle hiçbir .so oluşturulmaz. linkstatic=False, statik kitaplıkların oluşturulmasını engellemez. Bu özelliğin amacı, dinamik kitaplıkların oluşturulmasıdır.

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

local_defines

List of strings; optional

Derleme satırına eklenecek tanımlayıcıların listesi. "Make" değişkeni değiştirme ve Bourne kabuk jetonlara dönüştürme işlemlerine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dize, -D ifadesinin başına eklenir ve bu hedefin derleme komut satırına eklenir ancak bağımlılarına eklenmez.
nocopts

String; optional

C++ derleme komutundan eşleme seçeneklerini kaldırın. "Oluşturma" değişkeni değişimine tabidir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden oluşturulmuş 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 nadiren ihtiyaç duyulmalıdır.
strip_include_prefix

String; optional

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

Ayarlandığında, bu kuralın hdrs özelliğindeki üstbilgilere, yolunda bu ön ek kapalıyken erişilebilir.

İlgili bir yol söz konusuysa bu, pakete bağlı bir yol olarak kabul edilir. Mutlak değer ise depoya bağlı bir yol olarak anlaşılır.

include_prefix özelliğindeki ön ek çıkarıldıktan sonra ön ek eklenir.

textual_hdrs

List of labels; optional

Bu kitaplık tarafından yayınlanan başlık dosyalarının listesi, bağımlı kurallardaki kaynaklar tarafından metinsel olarak dahil edilir.

Bu, tek başına derlenemeyen başlık dosyalarının bildirilmesi için konumdur. Diğer bir deyişle, geçerli kod oluşturmak için diğer kaynak dosyaların her zaman metinsel olarak eklenmesi gerekir.

win_def_file

Label; optional

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

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

cc_proto_kitaplığı

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

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

deps, proto_library kurallarına yönlendirmelidir.

Örnek:

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

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

proto_library(
    name = "foo_proto",
)

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

deps

List of labels; optional

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

cc_paylaşılan_kitaplık

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

Ortak bir kitaplık oluşturur.

Örnek

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

foo_shared örneğinde foo ve baz statik olarak birbirine bağlıdır. İkincisi ise geçişli bir bağımlılıktır. Zaten dynamic_dep bar_shared tarafından dinamik olarak sağlandığından bar bağlamaz.

foo_shared, hangi simgelerin dışa aktarılacağını kontrol etmek için bir bağlayıcı komut dosyası *.lds dosyası kullanır. cc_shared_library kural mantığı, hangi simgelerin dışa aktarılacağını denetlemez. Yalnızca iki paylaşılan kitaplık aynı hedefleri dışa aktarırsa analiz aşamasında hata vermek için dışa aktarıldığı varsayılır.

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

Örnekteki her cc_library en fazla bir cc_shared_library olmalıdır. baz öğesini bar_shared öğesine de bağlamak istersek tags = ["LINKABLE_MORE_THAN_ONCE"] öğesini baz öğesine eklememiz gerekir.

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

Hatalar

Two shared libraries in dependencies export the same symbols.

Bu durum, aynı hedefi dışa aktaran iki farklı cc_shared_library bağımlısıyla hedef oluşturduğunuzda ortaya çıkar. Bu sorunu düzeltmek için cc_shared_library bağımlılarından birinde kitaplıkların dışa aktarılmasını durdurmanız gerekir.

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

Bunu düzeltmenin bir yolu, kitaplığı cc_shared_library bağımlılıklarından birine bağlamayı durdurmaktır. Aynı zamanda hâlâ bağlantı kuran kitaplığın kitaplığı dışa aktarması gerekiyor. Böylece kitaplığı bağlamayan, simgelerin görünürlüğünü koruyor. Diğer bir yöntem de hedefi dışa aktaran üçüncü bir kitaplık çıkarmaktır. Üçüncü yöntem, cc_library suçlusunu LINKABLE_MORE_THAN_ONCE ile etiketlemektir. Ancak bu düzeltme nadiren yapılır. cc_library hizmetinin gerçekten birden fazla bağlantı oluşturmak için gerçekten güvenli olduğundan emin olmalısınız.

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

Yani, deps aracınızın geçişli kapatma işlemindeki bir kitaplıka cc_shared_library bağımlılarından biri olmadan erişilebilir, ancak halihazırda dynamic_deps içinde farklı bir cc_shared_library öğesine bağlanmış ve dışa aktarılmaz.

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

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

Önceden derlenmiş bir dinamik kitaplığınız varsa bunun, şu anda oluşturmakta olduğunuz mevcut cc_shared_library hedefine statik olarak bağlanmasına gerek yoktur. Bu nedenle, cc_shared_library içindeki deps öğesine ait değildir. Bu önceden derlenmiş dinamik kitaplık cc_libraries cihazınızdan birine bağımlıysa doğrudan cc_library işlevinin buna bağımlı olması gerekir.

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

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

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

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

deps

List of labels; optional

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

Bu doğrudan isteklerin geçişli kitaplık bağımlılığı, dynamic_deps konumunda bir cc_shared_library tarafından bağlanmadığı sürece bu paylaşılan kitaplığa bağlanır.

Analiz sırasında kural uygulaması, birden fazla cc_shared_libraries aynı hedefi dışa aktarırken hata vermek için deps öğesinde listelenen herhangi bir hedefi paylaşılan kitaplık tarafından dışa aktarılmış kabul eder. Kural uygulaması, bağlayıcıyı paylaşılan nesne tarafından hangi simgelerin dışa aktarılması gerektiği konusunda bilgilendirmez. Kullanıcı, bunu bağlayıcı komut dosyaları veya kaynak kodundaki görünürlük beyanları üzerinden çözmelidir.

Uygulama, aynı kitaplık statik olarak birden fazla cc_shared_library öğesine bağlandığında hataları tetikler. Bu durum, "LINKABLE_MORE_THAN_ONCE" öğesini cc_library.tags öğesine ekleyerek veya "cc_library" öğesini paylaşılan kitaplıklardan birinin dışa aktarması olarak listeleyerek bir başkasının dynamic_dep işlemi gerçekleştirilmesi önlenebilir.

additional_linker_inputs

List of labels; optional

Bağlayıcıya aktarmak isteyebileceğiniz diğer dosyalar (ör. bağlayıcı komut dosyaları). Bağlayıcının bu dosyayı bilmesi için gereken tüm işaret işaretlerini ayrı olarak iletmeniz gerekir. Bunu user_link_flags özelliği aracılığıyla yapabilirsiniz.
dynamic_deps

List of labels; optional

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

cc_shared_library uygulaması, farklı bir cc_shared_library tarafından sağlandığı için geçişli deps içinde hangi cc_libraries ile bağlantı oluşturulmayacağına karar vermek üzere dynamic_deps listesini (geçişli olarak, geçerli hedefin dynamic_deps metriği) kullanır.dynamic_deps

exports_filter

List of strings; optional

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

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

Bu özelliğin aslında bu hedeflere bir bağımlı kenar eklemediğini unutmayın. Bağımlı kenar, bunun yerine deps tarafından oluşturulmalıdır. Bu özellikteki girişler yalnızca dizedir. Bu özelliğe hedef eklediğinizde, paylaşılan kitaplığın bu hedefteki sembolleri dışa aktardığına dair bir hak talebi olarak kabul edilir. cc_shared_library mantığı, bağlayıcıya hangi simgelerin dışa aktarılacağını söyleme konusunda işlem yapmaz.

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

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

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

shared_lib_name

String; optional

cc_shared_library, varsayılan olarak hedefin adına ve platforma göre paylaşılan kitaplık çıkış dosyası için bir ad kullanır. Buna bir uzantı ve bazen bir ön ek dahildir. Bazen varsayılan adı istemeyebilirsiniz. Örneğin, Python için C++ paylaşılan kitaplıklarını yüklerken varsayılan lib* ön eki genellikle istenmeyebilir. Bu durumda özel bir ad seçmek için bu özelliği kullanabilirsiniz.

List of strings; optional

Bağlayıcıya iletebileceğiniz diğer işaretler Örneğin, bağlayıcıya additional_linker_inputs üzerinden iletilen bir komut dosyası hakkında bilgi vermek için aşağıdakileri kullanabilirsiniz:
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
win_def_file

Label; optional

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

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

fdo_önceden_getirme_ipuçları

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

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

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

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

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

profile

Label; optional

İpucu profilinin etiketi. İpucu dosyasında .afdo uzantısı var Etiket, fdo_absolute_path_profile kuralını da gösterebilir.

fdo_profili

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

Çalışma alanında veya belirtilen bir mutlak yolda bulunan 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

Name; required

Bu hedef için benzersiz bir ad.

absolute_path_profile

String; optional

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

Label; optional

FDO profilinin veya onu oluşturan bir kuralın etiketi. FDO dosyası şu uzantılardan birine sahip olabilir: dizine eklenmeyen LLVM profili için .profraw, dizine eklenen LLVM profili için .profdata, LLVM profa profili içeren .zip, AutoFDO profili için .afdo, XBinary profili için .xfdo. Etiket, fdo_absolute_path_profile kuralını da gösterebilir.
proto_profile

Label; optional

Protobuf profilinin etiketi.

pervane_optimize et

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

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

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

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

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

ld_profile

Label; optional

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

cc_test_

Kural kaynağını göster
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, 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

Name; required

Bu hedef için benzersiz bir ad.

deps

List of labels; optional

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

Bunlar cc_library veya objc_library hedefleri olabilir.

srcs

List of labels; optional

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

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

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

Tüm #included dosyaları, bu kuralın srcs özelliğinde veya referans verilen cc_library() öğelerinin hdrs özelliğinde belirtilmelidir. Önerilen stil, bir kitaplıkla ilişkilendirilen başlıkların söz konusu kitaplığın hdrs özelliğinde listelenmesi ve bu kuralın kaynaklarıyla ilişkili kalan başlıkların srcs içinde listelenmesi için önerilir. Daha ayrıntılı bir açıklama için "Başlık ekleme kontrolü" bölümüne bakın.

Bir kuralın adı srcs ifadesindeyse otomatik olarak bu kurala bağlı olur. Adlandırılmış kuralın outs C veya C++ kaynak dosyalarıysa bu kuralda derlenirler; kitaplık dosyalarıysa birbirine bağlanır.

İzin verilen srcs dosya türleri:

  • C ve C++ kaynak dosyaları: .c, .cc, .cpp, .cxx, .c++, .C
  • C ve C++ başlık dosyaları: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • C ön işlemcili derleyici: .S
  • Arşiv: .a, .pic.a
  • "Her zaman bağla" kitaplığı: .lo, .pic.lo
  • Paylaşılan veya sürüm verilmemiş paylaşılan kitaplık: .so, .so.version
  • Nesne dosyası: .o, .pic.o

...ve bu dosyaları üreten tüm kurallar. Farklı uzantılar, gcc kurallarına uygun şekilde farklı programlama dillerini belirtir.

additional_linker_inputs

List of labels; optional

Bu dosyaları C++ bağlayıcı komutuna geçirin.

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

copts

List of strings; optional

C++ derleme komutuna bu seçenekleri ekleyin. "Değişken oluştur" değişikliğine ve Bourne kabuğu jeton dönüştürmesine tabidir.

Bu özellikteki her dize, ikili hedef derlenmeden önce belirtilen sırada COPTS özelliğine eklenir. İşaretler, yalnızca bu hedefi derlemek için uygulanır, bağımlılıkları için geçerli değildir. Bu nedenle, başka bir yere eklenen başlık dosyaları konusunda dikkatli olun. Tüm yollar mevcut pakete değil, çalışma alanına göre olmalıdır.

Paket no_copts_tokenization özelliğini bildirirse Bourne kabuğu jetona dönüştürme yalnızca tek bir "Make" değişkeninden oluşan dizeler için geçerlidir.

defines

List of strings; optional

Derleme satırına eklenecek tanımlayıcıların listesi. "Make" değişkeni değiştirme ve Bourne kabuk jetonlara dönüştürme işlemlerine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dize, -D ifadesinin başına eklenir ve bu hedefe ve ona bağlı her kural için derleme komut satırına eklenir. Çok geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde tanım değerlerini local_defines öğesine ekleyin.
includes

List of strings; optional

Derleme satırına eklenecek dir'leri dahil edin.

"Değişken oluştur" değişikliğine tabidir. Her dizenin başına -isystem eklenir ve COPTS ifadesine eklenir. COPTS'in aksine, bu işaretler bu kurala ve ona bağlı olan her kural için eklenir. (Not: bağlı olduğu kurallar değil Bunun geniş kapsamlı etkileri olabileceği için çok dikkatli olun. Şüpheye düştüğünüzde -OPTİMİZE yerine "-I" işaretleri ekleyin.

Üstbilgiler, src'lere veya hdr'lere eklenmelidir. Aksi takdirde, derleme korumalı alana alındığında (varsayılan) bağlı kurallar tarafından kullanılamaz.

linkopts

List of strings; optional

Bu işaretleri C++ bağlayıcı komutuna ekleyin. "Make" değişkeni değiştirme, Bourne kabuğu jetonlarına dönüştürme ve etiket genişletme işlemlerine tabidir. Bu özellikteki her dize, ikili hedef bağlanmadan önce LINKOPTS öğesine eklenir.

Bu listenin $ veya - ile başlamayan her bir öğesinin, deps içindeki bir hedefin etiketi olduğu varsayılır. Bu hedef tarafından oluşturulan dosyaların listesi bağlayıcı seçeneklerine eklenir. Etiket geçersizse veya deps öğesinde bildirilmezse hata bildirilir.

linkstatic

Boolean; optional; default is False

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

Bu seçenek varsayılan olarak cc_binary için etkin, geri kalanlar için kapalıdır.

Bu seçenek etkinleştirilirse ve bu bir ikili program veya test ise mümkün olduğunda kullanıcı kitaplıklarında derleme aracına .so yerine .a öğeleri içinde bağlantı verilmesini sağlar. Statik kitaplığı olmayan kitaplıklar ve bazı sistem kitaplıkları dinamik olarak bağlanmaya devam edebilir. Sonuç olarak, yürütülebilir dosya dinamik olarak bağlanacağı için yalnızca çoğunlukla statik olur.

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

  • Full_static_link özelliğinin bulunduğu ve her şeyin statik olarak bağlandığı STATIC; ör. "gcc -static foo.o libbar.a libbaz.a -lm".
    Bu mod, features özelliğinde fully_static_link belirtilerek etkinleştirilir.
  • Tüm kullanıcı kitaplıklarının statik olarak bağlandığı (Statik bir sürüm varsa) ancak sistem kitaplıklarının (C/C++ çalışma zamanı kitaplıkları hariç) dinamik olarak bağlandığı STATIC. Örneğin, "gcc foo.o libfoo.a libbaz.a -lm".
    Bu mod, linkstatic=True belirtildiğinde etkinleştirilir.
  • Tüm kitaplıkların dinamik olarak bağlandığı DİNAMİK (örneğin, bir dinamik sürüm varsa), ör. "gcc foo.o libfoo.so libbaz.so -lm".
    Bu mod, linkstatic=False değeri belirtilerek etkinleştirilir.

cc_library() kuralında kullanılan linkstatic özelliği farklı bir anlama sahip. linkstatic=True, C++ kitaplığında yalnızca statik bağlantıya izin verildiğini belirtir. Bu nedenle hiçbir .so oluşturulmaz. linkstatic=False, statik kitaplıkların oluşturulmasını engellemez. Bu özelliğin amacı, dinamik kitaplıkların oluşturulmasıdır.

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

local_defines

List of strings; optional

Derleme satırına eklenecek tanımlayıcıların listesi. "Make" değişkeni değiştirme ve Bourne kabuk jetonlara dönüştürme işlemlerine tabidir. Tek bir Bourne kabuk jetonundan oluşması gereken her dize, -D ifadesinin başına eklenir ve bu hedefin derleme komut satırına eklenir ancak bağımlılarına eklenmez.
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

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

Varsayılan olarak C++ ikili programları //tools/cpp:malloc ile bağlantılıdır. Boş kitaplık, ikili programın libc Malloc ile kullanılmasıdır. Bu etiket bir cc_library etiketi olmalıdır. Derleme C++ olmayan bir kural içinse bu seçeneğin hiçbir etkisi yoktur. linkshared=True belirtilirse bu özelliğin değeri yok sayılır.

nocopts

String; optional

C++ derleme komutundan eşleme seçeneklerini kaldırın. "Oluşturma" değişkeni değişimine tabidir. Bu özelliğin değeri normal ifade olarak yorumlanır. Bu normal ifadeyle eşleşen önceden oluşturulmuş 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 nadiren ihtiyaç duyulmalıdır.
stamp

Integer; optional; default is 0

Derleme bilgilerinin ikili programda kodlanıp kodlanmayacağını belirler. Olası değerler:
  • stamp = 1: --nostamp derlemelerinde bile derleme bilgilerini her zaman ikili dosyaya yapıştırın. İkili program ve ona bağlı olan tüm aşağı akış işlemleri için potansiyel olarak önbelleğe almayı sonlandıracağından bu ayardan kaçınılmalıdır.
  • stamp = 0: Derleme bilgilerini her zaman sabit değerlerle değiştirin. Bu sayede iyi bir derleme sonucunu önbelleğe alabilirsiniz.
  • stamp = -1: Derleme bilgilerinin yerleştirilmesi --[no]stamp işareti tarafından kontrol edilir.

Damgalı ikili programlar, bağımlılıkları değişmediği sürece yeniden oluşturulmaz.

win_def_file

Label; optional

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

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

cc_araç zinciri

Kural kaynağını göster
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler, compiler_files, compiler_files_without_includes, coverage_files, cpu, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)

C++ araç zincirini temsil eder.

Bu kural şunlardan sorumludur:

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

C++ araç zincirini yapılandırmak için toolchain_config özelliğini kullanın. Ayrıntılı C++ araç zinciri yapılandırması ve araç zinciri seçim dokümanları için bu sayfaya da bakın.

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

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

all_files

Label; required

Tüm cc_toolchain eserleri koleksiyonu. Bu yapılar, aşağıdaki özelliklere ait daha hassas yapı grupları kullanan işlemler haricinde, kuralları_cc ile ilgili tüm işlemlere giriş olarak eklenir. Bazel, all_files'ın yapı sağlayan diğer tüm özelliklerin bir üst kümesi olduğunu varsayar (ör.linkstamp derlemesinde hem derleme hem de bağlantı dosyaları olması gerekir). Bu nedenle all_files gereklidir).

cc_toolchain.files, bu özelliği içerir ve C++ araç zinciri kullanan tüm Starlark kuralları tarafından kullanılır.

ar_files

Label; optional

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

as_files

Label; optional

Montaj işlemleri için gerekli tüm cc_toolchain yapılarının toplanması.

compiler

String; optional; nonconfigurable

Kullanımdan kaldırıldı. Bunun yerine toolchain_identifier özelliğini kullanın. Bu, Starlark'a CROSSTOOL taşıma işleminden sonra bir noop olacak ve #7075 tarafından kaldırılacaktır.

Ayarlandığında, çapraz araç_yapılandırması.toolchain seçimini yapmak için kullanılır. --cpu Bazel seçeneğine göre önceliklidir.

compiler_files

Label; required

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

Label; optional

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

Label; optional

Kapsam işlemleri için gerekli tüm cc_toolchain yapılarının toplanması. Belirtilmezse all_files'ler kullanılır.
cpu

String; optional; nonconfigurable

Kullanımdan kaldırıldı. Bunun yerine Toolchain_identifier özelliğini kullanın. Bu, CROSSTOOL'un Starlark'a taşınmasından sonra bir noop olacaktır ve #7075 tarafından kaldırılacaktır.

Ayarlandığında, çapraz araç_yapılandırması.toolchain seçimini yapmak için kullanılır. --cpu Bazel seçeneğine göre önceliklidir.

dwp_files

Label; required

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

Label; optional

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

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

exec_transition_for_inputs

Boolean; optional; default is True

exec platformu için herhangi bir geçiş (yani varsayılan olarak hedef platform) yerine tüm dosya girişlerini cc_toolchain'e derlemek için Doğru değerini ayarlayın.
libc_top

Label; optional

libc için derlenen/bağlanan işlemlere giriş olarak iletilen yapılar koleksiyonu.
linker_files

Label; required

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

Label; optional

Modüler derlemeler için kullanılacak modül harita yapısı.
objcopy_files

Label; required

Metne dönüştürme işlemleri için gerekli tüm cc_toolchain yapılarının toplanması.
static_runtime_lib

Label; optional

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

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

strip_files

Label; required

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

Boolean; optional; default is False

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

Boolean; optional; default is True

cc_toolchain, bağlantı işlemleri için parametre dosyalarının kullanılmasını destekliyorsa Doğru değerini ayarlayın.
toolchain_config

Label; required

cc_toolchain_config_info sağlayan kuralın etiketi.
toolchain_identifier

String; optional; nonconfigurable

Bu cc_toolchain'i karşılık gelen Crosstool_config.toolchain ile eşleştirmek için kullanılan tanımlayıcıdır.

#5380 sorunu düzeltilene kadar cc_toolchain, CROSSTOOL.toolchain ile ilişkilendirmek için önerilen yöntemdir. Bu öğe, toolchain_config özelliği (#5380) ile değiştirilecek.

cc_toolchain_level

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

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

Bu kural şunlardan sorumludur:

  • Alakalı tüm C++ araç zincirlerini bir araya getirme.
  • Bazel'e aktarılan --cpu ve --compiler seçeneklerine bağlı olarak bir araç zinciri seçilir.

Ayrıntılı C++ araç zinciri yapılandırması ve araç zinciri seçim dokümanları için bu sayfaya da bakın.

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

"<cpu>" veya "<cpu>|<derleyici>" dizelerinden cc_toolchain etiketine bir eşleme. Bazel'e yalnızca --cpu iletildiğinde "<cpu>", Bazel'a hem --cpu hem de --compiler iletildiğinde "<cpu>|<derleyici>" kullanılır. Örnek:

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