C++ Araç Zinciri Yapılandırması

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Genel Bakış

Derleyiciyi doğru seçeneklerle çağırmak için Bazel'in dahili bileşenleri hakkında daha fazla bilgi edinin. Başka bir deyişle, Bazel'in derleyicinin basitleştirilmiş bir modelini kullanarak çalışma şekli.

Bazel'ın aşağıdakileri bilmesi gerekir:

  • Derleyicinin thinLTO, modül, dinamik bağlantı veya PIC'yi destekleyip desteklemediği (konumdan bağımsız kod) girin.
  • gcc, ld, ar, objcopy gibi gerekli araçlara giden yollar.
  • Yerleşik sistemde dizinler bulunur. Bazel'in bunları doğrulamak için kaynak dosyada yer alan tüm üstbilgilerin gerektiği gibi BUILD dosyası.
  • Varsayılan sysroot.
  • Derleme, bağlantı oluşturma, arşivleme için kullanılacak işaretler.
  • Desteklenen derleme modları (opt, dbg, fastbuild) için kullanılacak işaretler.
  • Derleyici tarafından özellikle gerekli kılınan değişkenleri yapın.

Derleyici birden fazla mimariyi destekliyorsa Bazel'in oluşturabilirsiniz.

CcToolchainConfigInfo, ihtiyacınız olan ek düzeyde ayrıntı düzeyini kontrol eder. Varsayılan olarak Bazel, derlemeniz için CcToolchainConfigInfo uygulamasını otomatik olarak yapılandırır ancak manuel olarak yapılandırma seçeneğiniz vardır. Bunun için bir Starlark kuralına ihtiyacınız var CcToolchainConfigInfo sağlayan ve Kuralınıza cc_toolchain öğesinin toolchain_config özelliğini ekleyin. Şu numarayı arayarak CcToolchainConfigInfo oluşturabilirsiniz: cc_common.create_cc_toolchain_config_info() İşlemde ihtiyacınız olacak tüm struct'lar için Starlark oluşturucularını @rules_cc//cc:cc_toolchain_config_lib.bzl.

C++ hedefi analiz aşamasına geçtiğinde, Bazel uygun BUILD dosyasını temel alarak cc_toolchain hedefini belirler ve Şurada belirtilen hedeften CcToolchainConfigInfo sağlayıcı: cc_toolchain.toolchain_config özelliği için geçerlidir. cc_toolchain hedefi bu bilgileri bir CcToolchainProvider üzerinden C++ hedefine iletir.

Örneğin, cc_binary veya cc_library için şu bilgiler gerekiyor:

  • Kullanılacak derleyici veya bağlayıcı
  • Derleyici/bağlayıcı için komut satırı işaretleri
  • --copt/--linkopt seçenekleri üzerinden iletilen yapılandırma işaretleri
  • Ortam değişkenleri
  • İşlemin yürütüleceği korumalı alanda gereken yapılar

Korumalı alanda gerekli olan yapılar hariç yukarıdaki bilgilerin tümü cc_toolchain öğesinin işaret ettiği Starlark hedefinde belirtilir.

Korumalı alana gönderilecek yapılar cc_toolchain içinde beyan edilir hedefi belirleyebilirsiniz. Örneğin, cc_toolchain.linker_files özelliğiyle şunları yapabilirsiniz: korumalı alana gönderilecek bağlayıcı ikili programı ve araç zinciri kitaplıklarını belirtir.

Araç zinciri seçimi

Araç zinciri seçim mantığı aşağıdaki gibi çalışır:

  1. Kullanıcı, BUILD dosyasında bir cc_toolchain_suite hedefi belirtir ve Şunu kullanarak: --crosstool_top seçeneği.

  2. cc_toolchain_suite hedefi birden fazla araç zincirine referans veriyor. İlgili içeriği oluşturmak için kullanılan --cpu ve --compiler işaretlerinin değerleri, bunlardan hangisinin Araç zincirleri yalnızca --cpu işaret değerine göre seçilir veya --cpu | --compiler değerine göre. Seçim süreci şöyle olur:

    • --compiler seçeneği belirtilirse Bazel, cc_toolchain_suite.toolchains içinden ilgili giriş özelliğini --cpu | --compiler ile değiştirin. Bazel giriş yaparsa hata verir.

    • --compiler seçeneği belirtilmezse Bazel cc_toolchain_suite.toolchains özelliğine yalnızca --cpu ile ulaşabilirsiniz.

    • Herhangi bir işaret belirtilmezse Bazel, ana makine sistemini inceler ve bir seçim --cpu değeri. Bkz. inceleme mekanizması kodu ekleyin.

Bir araç zinciri seçildikten sonra karşılık gelen feature ve action_config Starlark kuralındaki nesneler, yapının (yani öğeler için de ekleyebilirsiniz. Bu mesajlar, hiçbir değişiklik yapmadan Bazel'deki tam C++ özelliklerini Bazel ikili programı. C++ kuralları, ayrıntılı olarak belgelenen birden çok benzersiz işlemi destekler Bazel kaynak koduna bakın.

Özellikler

Özellik, komut satırı işaretleri, işlemler ve işlemler gerektiren bir varlıktır. ya da bağımlılık değişiklikleri olabilir. Özellik BUILD dosyalarının şu yapılandırmaları seçmesine izin vermek kadar basit bir şey olabilir: treat_warnings_as_errors gibi) işaretlemelerini veya C++ kuralları ile etkileşimde bulunmalarını gibi yeni derleme işlemlerini ve girişlerini dahil etme: header_modules veya thin_lto.

İdeal olarak CcToolchainConfigInfo, her bir özelliğin her birinin özellik, her biri bir işaret listesi tanımlayan bir veya daha fazla işaret grubundan oluşur seçenekleri vardır.

Bir özellik, Starlark'ın tamamen ayrıştırılmasına olanak tanıyan adla belirtilmiştir kural yapılandırması oluşturun. Başka bir deyişle, bir Bazel sürümü olduğu sürece CcToolchainConfigInfo yapılandırmalarının davranışını yapılandırmaları yeni özelliklerin kullanılmasını gerektirmez.

Bir özellik, aşağıdaki yöntemlerden biriyle etkinleştirilir:

  • Özelliğin enabled alanı true olarak ayarlanmış.
  • Bazel veya kural sahibi bu özelliği açıkça etkinleştirir.
  • Kullanıcı, bu özelliği --feature Bazel seçeneği veya features kuralıyla etkinleştirir. özelliğini gönderin.

Özelliklerin birbirine bağımlılıkları olabilir. Komut satırı bayraklarına bağlı olarak BUILD dosyası kullanabilirsiniz. ayarları ve diğer değişkenleri içerir.

Özellik ilişkileri

Bağımlılıklar genellikle doğrudan Bazel ile yönetilir. Bu da özelliklerin doğası gereği çatışmaları yönetir ve oluşturmamıza yardımcı olur. Araç zinciri spesifikasyonu, daha ayrıntılı doğrudan Starlark kuralında yer alan ve ilgili özelliği düzenleyen destek ve genişleme. Desteklenen biçimler şunlardır:

Kısıtlama Açıklama
requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
]
Özellik düzeyinde. Bu özellik yalnızca özellikleri etkinleştirebilirsiniz. Örneğin, bir özellik yalnızca belirli derleme modları (opt, dbg veya fastbuild). "requires", birden fazla "feature_set" içeriyorsa "feature_set"ten herhangi biri karşılanırsa özellik desteklenir (belirtilen tüm özellikler etkinleştirildiğinde).
implies = ['feature']

Özellik düzeyinde. Bu özellik, belirtilen özellikleri belirtir. Bir özelliğin etkinleştirilmesi, içerdiği tüm özelliklerin de dolaylı olarak etkinleştirilmesini sağlar (yinelemeli olarak çalışır).

Ayrıca, işlevselliklerinin yaygın alt kümelerini dezenfektanların ortak parçaları gibi özellikler bulunur. İma ediliyor özellikleri devre dışı bırakılamaz.

provides = ['feature']

Özellik düzeyinde. Bu özelliğin, birlikte çalışan birkaç özellikten biri olduğunu benzersiz alternatif özellikler. Örneğin tüm dezenfektanların provides = ["sanitizer"] belirtin.

Bu sayede, kullanıcı sorarsa alternatifler listeleyerek hata işleme sürecini iyileştirir. birbirini dışlayan iki özellik kullanabilirsiniz.

with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
]
İşaret grubu düzeyinde. Bir özellik, birden çok işaret grubu belirtebilir. with_features belirtildiğinde, ayarlanan işaret yalnızca genişletilir (en az bir with_feature_set varsa derleme komutuna ekleme) belirtilen features özelliklerindeki tüm özellikler ve not_features sayfasında belirtilen tüm özellikler etkin durumda olmalıdır. devre dışı bırakıldı. with_features belirtilmezse bayrak grubu şu şekilde olur: koşulsuz olarak uygulanır.

İşlemler

Eylemler, söz konusu koşulların sözleşmeye uygun olarak değiştirilmesine Bu eylem, eylemin nasıl gerçekleştirileceği kabul edilmeden yürütülür. action_config, bir işlemin çağırdığı araç ikili programını belirtirken bir diğer yandan feature, bu aracın işlem çağrıldığında davranır.

Özellikler, hangi Bazel işlemlerini belirtmek için işlemlere referans verir Eylemler Bazel eylem grafiğini değiştirebildiği için onlar da etkilenir. İlgili içeriği oluşturmak için kullanılan CcToolchainConfigInfo sağlayıcıda bayraklar ve araçlar olan işlemler var bunlarla ilişkili (örneğin, c++-compile). Her işleme işaret atanır bir özellikle ilişkilendirebilirsiniz.

Her işlem adı, Bazel tarafından gerçekleştirilen tek bir işlem türünü temsil eder. Örneğin: derleme veya bağlama. Bununla birlikte, Çevik projeler ile arasında bir birden çok işlemleri ve Bazel işlem türleri (Bazel işlem türü bir Java sınıfını belirtir) (CppCompileAction gibi). Özellikle, "derleyici işlemleri" ve "derleyici işlemleri" aşağıdaki tabloda görebilirsiniz: CppCompileAction, bağlantı işlemleri ise CppLinkAction.

Derleyici işlemleri

İşlem Açıklama
preprocess-assemble Ön işleme özelliğiyle birleştirin. Genellikle .S dosyaları içindir.
assemble Ön işlemeden derleyin. Genellikle .s dosyaları içindir.

Derleyici işlemleri

İşlem Açıklama
cc-flags-make-variable CC_FLAGS öğesini Genrules'a yayar.
c-compile C olarak derleyin.
c++-compile C++ olarak derleyin.
c++-header-parsing Başlığın bağımsız olur, aksi takdirde derleme hatalarına neden olur. Geçerli yalnızca modülleri destekleyen araç zincirlerine izin verir.
İşlem Açıklama
c++-link-dynamic-library Tüm bağımlılıklarını içeren paylaşılan bir kitaplığı bağlayın.
c++-link-nodeps-dynamic-library Yalnızca cc_library kaynak içeren paylaşılan bir kitaplığı bağlayın.
c++-link-executable Çalıştırılmaya hazır son bir kitaplık bağlayın.

Artırılmış gerçeklik (AR) işlemleri

AR işlemleri, ar aracılığıyla nesne dosyalarını arşiv kitaplıklarında (.a dosya) birleştirir ve ada birtakım anlamlar kodlayın.

İşlem Açıklama
c++-link-static-library Statik kitaplık oluşturun (arşiv).

LTO işlemleri

İşlem Açıklama
lto-backend Bit kodlarını yerel nesnelerde derleyen ThinLTO işlemi.
lto-index Global dizin oluşturan ThinLTO işlemi.

action_config'i kullanma

action_config, bir Bazel'i tanımlayan bir Starlark yapısıdır eylem sırasında çağırılacak aracı (ikili) belirterek eylemin işaret eder. Bu flag'ler, işlemin birkaç adım var.

action_config() kurucusu aşağıdaki parametrelere sahiptir:

Özellik Açıklama
action_name Bu eylemin karşılık geldiği Bazel eylemi. Bazel bu özelliği, işlem başına aracı ve yürütme yöntemini keşfetmek için kullanır. gereksinimlerini karşılayın.
tools Çağrılacak yürütülebilir dosya. İşleme uygulanan araç, Listede, özellik ile eşleşen bir özellik kümesine sahip ilk araç yapılandırma. Varsayılan değer sağlanmalıdır.
flag_sets Bir işlem grubu için geçerli olan işaretleme listesi. Şununla aynıdır: özelliğini kullanabilirsiniz.
env_sets Bir işlem grubu için geçerli olan ortam kısıtlamalarının listesi. Özellik için kullanılır.

action_config, başka özellikler ve action_config tarafından belirlenen özellik ilişkilerine değineceğiz. Bu davranış bir özelliğinkine benzer.

Son iki özellik, özellikleridir ve bazı Bazel işlemleri için belirli işaretlemeler veya amaç, gereksiz action_config+feature çiftler. Tek bir özelliğin birden fazla action_config üzerinden paylaşılması genellikle tercih edilir.

Aynı action_name ile birden fazla action_config tanımlayamazsınız aynı araç zincirinin içinde olup olmadığını sorun. Bu, araç yollarında belirsizliği önler ve action_config (bir işlemin mülklerinin) mantığını yerine getirir. araç zincirinde tek bir yerde net bir şekilde açıklanmalıdır.

Araç oluşturucu kullanma

action_config, tools parametresi aracılığıyla bir araç grubu belirtebilir. tool() oluşturucusu, aşağıdaki parametreleri alır:

Alan Açıklama
tool_path Söz konusu aracın yolu (geçerli konuma göre).
with_features En az birinin yerine getirilmesi gereken özelliklerin listesi bu aracı kullanabilirsiniz.

Belirli bir action_config için yalnızca tek bir tool geçerlidir Bazel eylemi için gereken araç yolu ve yürütme gereksinimlerini. Bir araç seçildi action_config üzerinde tools özelliği aracılığıyla bir araç özellik yapılandırmasıyla eşleşen bir with_feature grubu bulundu (bu sayfanın önceki Özellik ilişkileri bölümüne bakın bakın). Araç listelerinizi varsayılan bir aracını da kullanabilirsiniz.

Örnek kullanım

Özellikler ve işlemler, Bazel işlemlerini uygulamak için birlikte kullanılabilir farklı anlamlara sahip olabiliyor. Örneğin, şurada hata ayıklama simgesi oluşturma: macOS, derleme işleminde simge oluşturmayı ve ardından bağlantı işlemi sırasında özel bir araç kullanarak sıkıştırılmış dsym arşivini oluşturabilir ve ardından bu arşivin sıkıştırılmış sürümünü açarak uygulama paketini ve .plist'ı oluşturun. dosyaları Xcode tarafından kullanılabilir.

Bazel ile bu işlem aşağıdaki gibi uygulanabilir: unbundle-debuginfo bir Bazel işlemidir:

load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")

action_configs = [
    action_config (
        config_name = ACTION_NAMES.cpp_link_executable,
        action_name = ACTION_NAMES.cpp_link_executable,
        tools = [
            tool(
                with_features = [
                    with_feature(features=["generate-debug-symbols"]),
                ],
                tool_path = "toolchain/mac/ld-with-dsym-packaging",
            ),
            tool (tool_path = "toolchain/mac/ld"),
        ],
    ),
]

features = [
    feature(
        name = "generate-debug-symbols",
        flag_sets = [
            flag_set (
                actions = [
                    ACTION_NAMES.c_compile,
                    ACTION_NAMES.cpp_compile
                ],
                flag_groups = [
                    flag_group(
                        flags = ["-g"],
                    ),
                ],
            )
        ],
        implies = ["unbundle-debuginfo"],
   ),
]

Bu özellik, farklı bir uygulama paketi kullanan Linux için fission veya .pdb dosya oluşturan Windows için. Örneğin, fission tabanlı hata ayıklama sembolü oluşturma uygulaması aşağıdaki gibi görünebilir: şöyle olur:

load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")

action_configs = [
    action_config (
        name = ACTION_NAMES.cpp_compile,
        tools = [
            tool(
                tool_path = "toolchain/bin/gcc",
            ),
        ],
    ),
]

features = [
    feature (
        name = "generate-debug-symbols",
        requires = [with_feature_set(features = ["dbg"])],
        flag_sets = [
            flag_set(
                actions = [ACTION_NAMES.cpp_compile],
                flag_groups = [
                    flag_group(
                        flags = ["-gsplit-dwarf"],
                    ),
                ],
            ),
            flag_set(
                actions = [ACTION_NAMES.cpp_link_executable],
                flag_groups = [
                    flag_group(
                        flags = ["-Wl", "--gdb-index"],
                    ),
                ],
            ),
      ],
    ),
]

İşaret grupları

CcToolchainConfigInfo, işaretlemeleri bir amaca hizmet eder. Önceden tanımlanmış değişkenleri kullanarak içindeki "bayrak" değerine; derleyici, işareti derleme komutudur. Örneğin:

flag_group (
    flags = ["%{output_file_path}"],
)

Bu durumda, işaretin içeriği çıkış dosyası yoluyla değiştirilir eyleme dönüşebilir.

İşaretleme grupları, gösterildikleri sırayla derleme komutuna genişletilir yukarıdan aşağıya, soldan sağa.

Derlemeye eklendiğinde farklı değerlerle tekrarlanması gereken işaretler için komutuna dahil etmek için, işaret grubu list türündeki değişkenleri yineleyebilir. Örneğin, list türündeki include_path değişkeni:

flag_group (
    iterate_over = "include_paths",
    flags = ["-I%{include_paths}"],
)

include_paths listesindeki her yol öğesi için -I<path> değerine genişler. Tümü bayrak grubu bildiriminin gövdesindeki flag'ler (veya flag_group'ler) oluşturabilirsiniz. Örneğin:

flag_group (
    iterate_over = "include_paths",
    flags = ["-I", "%{include_paths}"],
)

include_paths listesindeki her yol öğesi için -I <path> değerine genişler.

Bir değişken birden çok kez tekrarlanabilir. Örneğin:

flag_group (
    iterate_over = "include_paths",
    flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"],
)

şu şekilde genişler:

-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>

Değişkenler, nokta gösterimi kullanılarak erişilebilen yapılara karşılık gelebilir. Örneğin:

flag_group (
    flags = ["-l%{libraries_to_link.name}"],
)

Yapılar iç içe yerleştirilebilir ve sıralar da içerebilir. Ad çakışmalarını önlemek için ve açık olmak için alanlarda tam yolu belirtmeniz gerekir. Örneğin:

flag_group (
    iterate_over = "libraries_to_link",
    flag_groups = [
        flag_group (
            iterate_over = "libraries_to_link.shared_libraries",
            flags = ["-l%{libraries_to_link.shared_libraries.name}"],
        ),
    ],
)

Koşullu genişletme

İşaretleme grupları, belirli bir öğenin varlığına göre koşullu genişletmeyi destekler değişkeninin veya alanının expand_if_available, expand_if_not_available expand_if_true, expand_if_false veya expand_if_equal özellikleri. Örneğin:

flag_group (
    iterate_over = "libraries_to_link",
    flag_groups = [
        flag_group (
            iterate_over = "libraries_to_link.shared_libraries",
            flag_groups = [
                flag_group (
                    expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
                    flags = ["--whole_archive"],
                ),
                flag_group (
                    flags = ["-l%{libraries_to_link.shared_libraries.name}"],
                ),
                flag_group (
                    expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
                    flags = ["--no_whole_archive"],
                ),
            ],
        ),
    ],
)

CcToolchainConfigInfo referansı

Bu bölümde, derleme değişkenleri, özellikleri ve C++ kurallarını başarıyla yapılandırmak için gereken bilgileri içerir.

CcToolchainConfigInfo derleme değişkenleri

Aşağıda, CcToolchainConfigInfo derleme değişkenine referans verilmiştir.

Değişken İşlem Açıklama
source_file compile Derlenecek kaynak dosya.
input_file şerit Çıkarılacak yapı.
output_file compile Derleme çıktısı.
output_assembly_file compile Yayınlanan derleme dosyası. Yalnızca compile işlemi, genellikle --save_temps işareti. İçerik output_file
output_preprocess_file compile Önceden işlenmiş çıkış. Yalnızca derlemek için geçerlidir yalnızca kaynak dosyaları ön işlemden geçiren işlemler (genellikle --save_temps işareti. İçerik output_file
includes compile Derleyicinin kullanması gereken dosya sırası koşulsuz olarak derlenen kaynağa ekleyin.
include_paths compile Derleyicinin içinde yer aldığı sıra dizinleri #include<foo.h> kullanılarak eklenen başlıkları arar ve #include "foo.h".
quote_include_paths compile -iquote dizisi şunları içerir: derleyicinin, #include "foo.h".
system_include_paths compile -isystem dizisi şunları içerir: derleyicinin, #include <foo.h>.
dependency_file compile Derleyici tarafından oluşturulan .d bağımlılık dosyası.
preprocessor_defines compile defines dizisi, ör. --DDEBUG.
pic compile Çıkışı konumdan bağımsız kod olarak derler.
gcov_gcno_file compile gcov kapsam dosyası.
per_object_debug_info_file compile Nesne başına hata ayıklama bilgileri (.dwp) dosyası.
stripotps şerit stripopts dizisi.
legacy_compile_flags compile Eski işaretler dizisi CROSSTOOL alanları (ör. compiler_flag, optional_compiler_flag, cxx_flag ve optional_cxx_flag.
user_compile_flags compile copt kural özelliğini veya --copt, --cxxopt ve --conlyopt işaretleri.
unfiltered_compile_flags compile unfiltered_cxx_flag eski CROSSTOOL alanı veya unfiltered_compile_flags özelliği. Bunlar şu ölçüte göre filtrelenmez: nocopts kural özelliğine sahiptir.
sysroot sysroot
runtime_library_search_directories bağlantı Bağlayıcı çalışma zamanı arama yolundaki girişler (genellikle -rpath işaretiyle ayarlanır).
library_search_directories bağlantı Bağlayıcı arama yolundaki girişler (genellikle -L işaretini kullanın).
libraries_to_link bağlantı Bağlayıcı çağrısında giriş olarak bağlanacak dosyalar sağlayan işaretler.
def_file_path bağlantı Windows'da MSVC ile kullanılan def dosyasının konumu.
linker_param_file bağlantı Bazel tarafından komut satırı uzunluk sınırını aştığını gösterir.
output_execpath bağlantı Bağlayıcı çıktısını yürütme.
generate_interface_library bağlantı Arayüz kitaplığının gerekip gerekmediğine bağlı olarak "yes" veya "no" oluşturabilirsiniz.
interface_library_builder_path bağlantı Arayüz kitaplığı oluşturucu aracına giden yol.
interface_library_input_path bağlantı Arayüz kitaplığı ifso oluşturma aracı için giriş.
interface_library_output_path bağlantı ifso oluşturma aracı kullanılarak arayüz kitaplığının oluşturulacağı yol.
legacy_link_flags bağlantı Eski CROSSTOOL alanlarından gelen bağlayıcı işaretleri.
user_link_flags bağlantı --linkopt uygulamasından gelen bağlayıcı işaretleri veya linkopts özelliğini gönderin.
symbol_counts_output bağlantı Sembol sayısının yazılacağı yol.
linkstamp_paths bağlantı Bağlantı damgası yolları veren bir derleme değişkeni.
force_pic bağlantı Bu değişkenin varlığı, PIC/PIE kodunun oluşturulmalıdır (Bazel seçeneği "--force_pic" geçti).
strip_debug_symbols bağlantı Bu değişkenin varlığı, hata ayıklama işleminin simgelerinin kaldırılması gerekir.
is_cc_test bağlantı Mevcut işlem cc_test olduğunda güven ver bağlantı oluşturma işlemi, aksi takdirde false (yanlış) değerini alır.
is_using_fission derle, bağlantı oluştur, derle, bağlantı Bu değişkenin varlığı, fisyonun (nesne başına hata ayıklama bilgisi) olduğunu gösterir etkinleştirilir. Hata ayıklama bilgileri bunun yerine .dwo dosyasında olacak (.o dosya) ve derleyici ile bağlayıcının bunu bilmesi gerekir.
fdo_instrument_path derle, bağlantı oluştur, derle, bağlantı FDO araç profilinin depolandığı dizinin yolu.
fdo_profile_path compile FDO profilinin yolu.
fdo_prefetch_hints_path compile Önbellek önceden getirme profilinin yolu.
csfdo_instrument_path derle, bağlantı oluştur, derle, bağlantı Bağlama duyarlı FDO'yu depolayan dizine giden yol ödeme profili oluşturun.

İyi bilinen özellikler

Aşağıda özelliklere ve bunların etkinleştirilmesine ilişkin referans verilmiştir koşullar.

Özellik Belgeler
opt | dbg | fastbuild Derleme moduna göre varsayılan olarak etkindir.
static_linking_mode | dynamic_linking_mode Bağlantı moduna göre varsayılan olarak etkindir.
per_object_debug_info supports_fission özelliği belirtilirse ve etkin derleme modudur ve mevcut derleme modu --fission işareti.
supports_start_end_lib Etkinleştirilmişse (ve --start_end_lib seçeneği ayarlanmışsa) Bazel statik kitaplıklara bağlantı oluşturmaz, bunun yerine Nesnelere karşı bağlantı oluşturmak için --start-lib/--end-lib bağlayıcı seçeneği doğrudan ekleyebilirsiniz. Bazel'in derleme yapması gerekmeyeceği için derlemeyi hızlandırır olması gerekir.
supports_interface_shared_libraries Etkinleştirilmişse (ve --interface_shared_objects seçeneği etkinse ayarlanacaksa, Bazel, linkstatic değeri şu şekilde ayarlanmış hedefleri bağlayacaktır: Paylaşılan arayüze karşı Yanlış (varsayılan olarak cc_test sn) kitaplıklar. Bu, artımlı yeniden bağlama işlemini hızlandırır.
supports_dynamic_linker Etkinleştirilirse C++ kuralları, araç zincirinin paylaşılan veri kitaplıklar.
static_link_cpp_runtimes Etkinleştirilirse Bazel, C++ çalışma zamanını statik bağlantıda statik olarak bağlar. ve dinamik olarak bağlantı kurabilirsiniz. Yapılar cc_toolchain.static_runtime_lib veya cc_toolchain.dynamic_runtime_lib özelliği ( bağlantı modu) bağlantı işlemlerine eklenir.
supports_pic Etkinleştirilirse araç zinciri, dinamik kitaplıklar için PIC nesnelerini kullanacağını bilir. PIC derlemesi gerektiğinde "pic" değişkeni mevcuttur. Etkin değilse varsayılan olarak ve "--force_pic" geçildiğinde Bazel, "supports_pic" değeri için istekte bulunur ve özelliğin etkinleştirildiğinden emin olun. Özellik yoksa veya yapılamıyorsa `--force_pic` kullanılamaz.
static_linking_mode | dynamic_linking_mode Bağlantı moduna göre varsayılan olarak etkindir.
no_legacy_features Bazel'in C++ yapılandırmasını devre dışı bırakır. Şu listenin daha fazla bilgi edineceksiniz.

Eski özelliklere yama uygulama mantığı

Bazel, geriye dönük adımlar için araç zincirinin özelliklerinde aşağıdaki değişiklikleri uygular: uyumluluk:

  • legacy_compile_flags özelliğini araç zincirinin en üstüne taşır
  • default_compile_flags özelliğini araç zincirinin en üstüne taşır
  • Araç zincirinin en üstüne dependency_file (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne pic (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne per_object_debug_info (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne preprocessor_defines (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne includes (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne include_paths (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne fdo_instrument (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne fdo_optimize (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne cs_fdo_instrument (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne cs_fdo_optimize (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne fdo_prefetch_hints (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne autofdo (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne build_interface_libraries (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne dynamic_library_linker_tool (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne symbol_counts (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne shared_flag (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne linkstamps (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne output_execpath_flags (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne runtime_library_search_directories (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne library_search_directories (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne archiver_flags (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne libraries_to_link (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne force_pic_flags (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne user_link_flags (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne legacy_link_flags (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne static_libgcc (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne fission_support (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne strip_debug_symbols (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne coverage (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne llvm_coverage_map_format (mevcut değilse) özelliği ekler
  • Araç zincirinin en üstüne gcc_coverage_map_format (mevcut değilse) özelliği ekler
  • Araç zincirinin en altına fully_static_link (mevcut değilse) özelliği ekler
  • Araç zincirinin en altına user_compile_flags (mevcut değilse) özelliği ekler
  • Araç zincirinin en altına sysroot (mevcut değilse) özelliği ekler
  • Araç zincirinin en altına unfiltered_compile_flags (mevcut değilse) özelliği ekler
  • Araç zincirinin en altına linker_param_file (mevcut değilse) özelliği ekler
  • Araç zincirinin en altına compiler_input_flags (mevcut değilse) özelliği ekler
  • Araç zincirinin en altına compiler_output_flags (mevcut değilse) özelliği ekler

Bu, uzun bir özellik listesidir. Plan, onlardan bir kez kurtulmak Starlark'taki Crosstool: tamamlandı. Meraklı okuyucular için uygulamayı şuradan görebilirsiniz: CppActionConfigs, Üretim araç zincirleri için de no_legacy_features araç zincirini daha bağımsız hale getiriyor.