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

Genel bakış

Bazel'ın derleyiciyi doğru seçeneklerle çağırmak için derleyicinin dahili bileşenleri hakkında dizin ve önemli işaretler ekleme gibi bazı bilgilere ihtiyacı vardır. Başka bir deyişle, Bazel'in çalışmalarını anlamak için derleyicinin basitleştirilmiş bir modeline ihtiyacı vardır.

Bazel'in şunları bilmesi gerekiyor:

  • Derleyicinin thinLTO, modüller, dinamik bağlantı veya PIC'yi (konumdan bağımsız kod) destekleyip desteklemediği.
  • gcc, ld, ar, objcopy gibi gerekli araçlara giden yollar.
  • Yerleşik sistem dizinler içerir. Bazel, kaynak dosyaya dahil edilen tüm üst bilgilerin BUILD dosyasında doğru bir şekilde tanımlandığını doğrulamak için bunlara ihtiyaç duyar.
  • 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 flag'ler.
  • Derleyici tarafından özellikle gerekli kılınan değişkenleri oluşturun.

Derleyici birden çok mimariyi destekliyorsa Bazel'in bunları ayrı olarak yapılandırması gerekir.

CcToolchainConfigInfo, Bazel'in C++ kurallarının davranışını yapılandırmak için gereken ayrıntı düzeyini sağlayan bir sağlayıcıdır. Bazel, varsayılan olarak derlemeniz için CcToolchainConfigInfo politikasını otomatik olarak yapılandırır ancak dilerseniz bu ayarı manuel olarak yapılandırabilirsiniz. Bunun için CcToolchainConfigInfo sağlayan bir Starlark kuralına ihtiyacınız vardır ve cc_toolchain öğesinin toolchain_config özelliğini kuralınıza yönlendirmeniz gerekir. cc_common.create_cc_toolchain_config_info() yöntemini çağırarak CcToolchainConfigInfo oluşturabilirsiniz. Bu süreçte ihtiyaç duyacağınız tüm struct'lar için Starlark kurucularını @rules_cc//cc:cc_toolchain_config_lib.bzl içinde bulabilirsiniz.

Bir C++ hedefi analiz aşamasına girdiğinde, Bazel BUILD dosyasına uygun cc_toolchain hedefini seçer ve cc_toolchain.toolchain_config özelliğinde belirtilen hedeften CcToolchainConfigInfo sağlayıcısını alır. cc_toolchain hedefi, bu bilgileri bir CcToolchainProvider aracılığıyla C++ hedefine iletir.

Örneğin, cc_binary veya cc_library gibi bir kuralla somutlaşan bir derleme veya bağlantı işlemi için aşağıdaki bilgiler gerekir:

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

Korumalı alan için gerekli yapılar hariç yukarıdaki tüm bilgiler, cc_toolchain öğesinin işaret ettiği Starlark hedefinde belirtilir.

Korumalı alana gönderilecek yapılar cc_toolchain hedefinde bildirilir. Örneğin, cc_toolchain.linker_files özelliğiyle korumalı alana gönderilecek bağlayıcı ikili programı ve araç zinciri kitaplıklarını belirtebilirsiniz.

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 --crosstool_top seçeneğini kullanarak Bazel'ı hedefe yönlendirir.

  2. cc_toolchain_suite hedefi birden fazla araç zincirine referans veriyor. --cpu ve --compiler işaretlerinin değerleri, bu araç zincirlerinden hangisinin seçileceğini yalnızca --cpu işaret değerine veya ortak --cpu | --compiler değerine göre belirler. Seçim süreci şu şekildedir:

    • --compiler seçeneği belirtilirse Bazel, --cpu | --compiler ile cc_toolchain_suite.toolchains özelliğinden ilgili girişi seçer. Bazel karşılık gelen bir giriş bulamazsa hata verir.

    • --compiler seçeneği belirtilmemişse Bazel yalnızca --cpu ile cc_toolchain_suite.toolchains özelliğinden ilgili girişi seçer.

    • İşaret belirtilmemişse Bazel ana makine sistemini inceler ve bulgularına dayanarak bir --cpu değeri seçer. İnceleme mekanizması kodunu inceleyin.

Bir araç zinciri seçildikten sonra, Starlark kuralında karşılık gelen feature ve action_config nesneleri derlemenin yapılandırmasını (yani daha sonra açıklanan öğeleri) yönetir. Bu mesajlar, Bazel ikili programını değiştirilmeden tam donanımlı C++ özelliklerinin Bazel'de uygulanmasına olanak tanır. C++ kuralları, Bazel kaynak kodunda ayrıntılı olarak açıklanan birden çok benzersiz işlemi destekler.

Özellikler

Komut satırı işaretleri, işlemler, yürütme ortamı üzerindeki kısıtlamalar veya bağımlılık değişiklikleri gerektiren varlıklara özellik denir. Özellik, BUILD dosyalarının treat_warnings_as_errors gibi işaret yapılandırmalarını seçmesine veya C++ kurallarıyla etkileşime girip derlemeye header_modules ya da thin_lto gibi yeni derleme işlemleri ve girişleri dahil etmesine izin vermek gibi basit bir şey olabilir.

İdeal olarak, CcToolchainConfigInfo bir özellik listesi içerir. Bu listede her özellik, her biri belirli Bazel işlemleri için geçerli olan işaret listesini tanımlayan bir veya daha fazla işaret grubundan oluşur.

Özellik, Starlark kural yapılandırmasının Bazel sürümlerinden tamamen ayrıştırılmasını sağlayan ada göre belirtilir. Diğer bir deyişle, Bazel sürümü, yapılandırmalar yeni özelliklerin kullanılmasını gerektirmediği sürece CcToolchainConfigInfo yapılandırmalarının davranışını etkilemez.

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

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

Özelliklerin birbirine bağımlılığı olabilir, komut satırı işaretlerine, BUILD dosya ayarlarına ve diğer değişkenlere bağlıdır.

Özellik ilişkileri

Bağımlılıklar genellikle doğrudan Bazel ile yönetilir. Bazel sadece gereksinimleri uygular ve derlemede tanımlanan özelliklerin doğasından gelen çatışmaları yönetir. Araç zinciri spesifikasyonu, özellik desteği ve genişletmeyi yöneten Starlark kuralında doğrudan kullanım için daha ayrıntılı kısıtlamalara olanak tanır. Desteklenen biçimler şunlardır:

Kısıtlama Açıklama
requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
]
Özellik düzeyi. Bu özellik, yalnızca belirtilen gerekli özellikler etkinse desteklenir. Örneğin, bir özellik yalnızca belirli derleme modlarında (opt, dbg veya fastbuild) desteklendiğini belirtir. "requires" birden fazla "feature_set" öğesi içeriyorsa, "feature_set"lerden herhangi biri karşılandığında (belirtilen tüm özellikler etkinleştirildiğinde) özellik desteklenir.
implies = ['feature']

Özellik düzeyi. Bu özellik, belirtilen özellikleri ima eder. Bir özelliğin etkinleştirilmesi, ima edilen tüm özellikleri de dolaylı olarak etkinleştirir (yani, yinelemeli olarak çalışır).

Ayrıca, temizleyicilerin sık kullanılan parçaları gibi bir dizi özellikte işlevlerin yaygın alt kümelerini de hesaba katma olanağı sağlar. Dolaylı özellikler devre dışı bırakılamaz.

provides = ['feature']

Özellik düzeyi. Bu özelliğin, birbirini dışlayan birkaç alternatif özellikten biri olduğunu belirtir. Örneğin, tüm temizleyiciler provides = ["sanitizer"] değerini belirtebilir.

Bu özellik, kullanıcı aynı anda iki veya daha fazla birbirini dışlayan özellik isterse alternatiflerin listelenerek hata giderme sürecini iyileştirir.

with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
]
İşaretleme ayarı düzeyi. Bir özellik, birden çok işaret grubu belirtebilir. with_features belirtildiğinde, işaret grubu yalnızca belirtilen features grubundaki tüm özelliklerin etkinleştirilmiş olduğu ve not_features grubunda belirtilen tüm özelliklerin devre dışı bırakıldığı en az bir with_feature_set varsa derleme komutuna genişletilir. with_features belirtilmezse ayarlanan işaret, belirtilen her işlem için koşulsuz olarak uygulanır.

İşlemler

Eylemler, bir işlemin nasıl yürütüleceğini varsayarak yürütüldüğü koşulları değiştirme esnekliği sağlar. action_config, bir işlemin çağırdığı araç ikili programını belirtir. feature ise işlem çağrıldığında aracın nasıl davranacağını belirleyen yapılandırmayı (işaretler) belirtir.

Özellikler, işlemler Bazel eylem grafiğini değiştirebileceğinden, hangi Bazel işlemlerini etkilediklerini belirtmek için işlemlere referans verir. CcToolchainConfigInfo sağlayıcısı, ilişkili bayraklar ve araçlar olan işlemleri (ör. c++-compile) içerir. Her işleme, bunları bir özellikle ilişkilendirerek bayraklar atanır.

Her işlem adı, Bazel tarafından gerçekleştirilen tek bir işlem türünü (ör. derleme veya bağlantı oluşturma) temsil eder. Bununla birlikte, eylemler ile Bazel işlem türleri arasında çoka-bir ilişki vardır. Burada Bazel işlem türü, bir işlemi (CppCompileAction gibi) uygulayan Java sınıfını ifade eder. Özellikle, aşağıdaki tabloda verilen "derleyici işlemleri" ve "derleyici işlemleri", CppCompileAction, bağlantı işlemleri ise CppLinkAction şeklindedir.

Derleyici işlemleri

İşlem Açıklama
preprocess-assemble Ön işleme yöntemini kullanarak birleştirin. Normalde .S dosya için.
assemble Ön işleme yapmadan monte edin. Normalde .s dosya için.

Derleyici işlemleri

İşlem Açıklama
cc-flags-make-variable CC_FLAGS öğesini genellere yayar.
c-compile C olarak derleyin.
c++-compile C++ olarak derleyin.
c++-header-parsing Üstbilginin bağımsız olduğundan emin olmak için derleyicinin ayrıştırıcısını bir başlık dosyasında çalıştırın, aksi takdirde derleme hataları ortaya çıkar. Yalnızca modülleri destekleyen araç zincirleri için geçerlidir.
İşlem Açıklama
c++-link-dynamic-library Tüm bağımlılıklarını içeren paylaşılan bir kitaplığa bağlantı oluşturun.
c++-link-nodeps-dynamic-library Yalnızca cc_library kaynak içeren paylaşılan bir kitaplığı bağlayın.
c++-link-executable Çalıştırmaya hazır son bir kitaplığı bağlayın.

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

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

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

LTO işlemleri

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

action_config kullanma

action_config, işlem sırasında çağrılacak aracı (iki bileşenli) ve özellikler tarafından tanımlanan işaret gruplarını belirterek bir Bazel işlemini tanımlayan bir Starlark yapısıdır. Bu işaretler, işlemin yürütülmesine kısıtlamalar uygular.

action_config() oluşturucusu aşağıdaki parametrelere sahiptir:

Özellik Açıklama
action_name Bu işlemin karşılık geldiği Bazel işlemi. Bazel, işlem başına aracı ve yürütme gereksinimlerini keşfetmek için bu özelliği kullanır.
tools Çağrılacak yürütülebilir dosya. İşleme uygulanan araç, listedeki özellik yapılandırmasıyla eşleşen bir özellik grubuna sahip ilk araç olur. Varsayılan değer sağlanmalıdır.
flag_sets Bir işlem grubu için geçerli olan işaretlerin listesi. Bu durum bir özellik için de geçerlidir.
env_sets Bir işlem grubu için geçerli olan ortam kısıtlamalarının listesi. Bu durum bir özellik için de geçerlidir.

action_config, daha önce açıklanan özellik ilişkileri tarafından belirtildiği şekilde diğer özellikleri ve action_config'leri zorunlu kılabilir ve ima edebilir. Bu davranış, bir özelliğin davranışına benzer.

Son iki özellik, özelliklerde karşılık gelen özelliklere göre gereksizdir ve bazı Bazel işlemleri belirli işaretler veya ortam değişkenleri gerektirdiği ve amaç gereksiz action_config+feature çiftlerinden kaçınmak olduğu için dahil edilmiştir. Genellikle tek bir özelliğin birden fazla action_config ile paylaşılması tercih edilir.

Aynı araç zincirinde aynı action_name değerine sahip birden fazla action_config tanımlayamazsınız. Bu, araç yollarındaki belirsizliği önler ve bir işlemin özelliklerinin araç zincirinde tek bir yerde net bir şekilde açıklanmasını sağlayan action_config amacını zorunlu kılar.

Araç oluşturucuyu kullanma

action_config, tools parametresi aracılığıyla bir araç grubunu belirtebilir. tool() oluşturucu şu parametreleri alır:

Alan Açıklama
tool_path Söz konusu aracın yolu (mevcut konuma göre).
with_features Bir özellik listesi, bu aracın uygulanabilmesi için en az birinin karşılanması gereken özellikleri belirler.

Belirli bir action_config için yalnızca tek bir tool, araç yolunu ve yürütme gereksinimlerini Bazel işlemine uygular. Bir araç, özellik yapılandırmasıyla eşleşen with_feature kümesine sahip bir araç bulunana kadar action_config öğesinde tools özelliği iterasyon yapılarak seçilir (daha fazla bilgi için bu sayfada daha önceki özellik ilişkileri bölümüne bakın). Araç listelerinizi, boş özellik yapılandırmasına karşılık gelen varsayılan bir araçla sonlandırmanız gerekir.

Örnek kullanım

Özellikler ve işlemler, platformlar arası çeşitli anlamlar içeren Bazel eylemlerini uygulamak için birlikte kullanılabilir. Örneğin, macOS'te hata ayıklama sembolü oluşturma işlemi, derleme işleminde semboller oluşturmayı, ardından bağlantı işlemi sırasında sıkıştırılmış dsym arşivi oluşturmak için özel bir aracın çağrılmasını ve ardından bu arşivin sıkıştırılarak Xcode tarafından tüketilebilecek uygulama paketini ve .plist dosyalarını üretmek için arşivin açılmasını gerektirir.

Bunun yerine, 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, fission kullanan Linux veya .pdb dosyaları üreten Windows için tamamen farklı uygulanabilir. Örneğin, fission tabanlı hata ayıklama sembolü oluşturma uygulaması aşağıdaki gibi görünebilir:

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"],
                    ),
                ],
            ),
      ],
    ),
]

İşaretleme grupları

CcToolchainConfigInfo, işaretleri belirli bir amaca hizmet eden gruplar halinde gruplandırmanıza olanak tanır. İşaret değeri içindeki önceden tanımlanmış değişkenleri kullanarak bir işaret belirtebilirsiniz. Bu değişkenler, derleme komutuna derleyici tarafından eklenirken derleyici tarafından genişletilir. Örneğin:

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

Bu durumda, işaretin içeriği, işlemin çıkış dosyası yoluyla değiştirilir.

İşaretleme grupları, derleme komutuna, listede göründükleri sırayla, yukarıdan aşağıya, soldan sağa olacak şekilde genişletilir.

Derleme komutuna eklendiğinde farklı değerlerle tekrarlanması gereken işaretler 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. İşaretleme grubu beyanının gövdesindeki tüm işaretler (veya flag_group'ler) bir birim olarak genişletilir. Ö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}"],
)

şuna 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 adım sıraları içerebilir. Ad çakışmalarını önlemek ve adın açık olmasını sağlamak 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

İşaret grupları, expand_if_available, expand_if_not_available, expand_if_true, expand_if_false veya expand_if_equal özelliklerini kullanarak belirli bir değişkenin veya değişkenin alanına dayalı koşullu genişletmeyi destekler. Ö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şkenlerine, özelliklere ve C++ kurallarını başarıyla yapılandırmak için gereken diğer bilgilere dair bir referans sunulmaktadır.

CcToolchainConfigInfo derleme değişkenleri

Aşağıda CcToolchainConfigInfo derleme değişkenlerine 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 derleme metni yayınladığında, genellikle --save_temps işareti kullanıldığında geçerli olur. İçerik, output_file ile aynıdır.
output_preprocess_file compile Ön işlenmiş çıkış. Yalnızca kaynak dosyaları önceden işleyen (genellikle --save_temps işaretini kullanırken) işlemleri derlemek için geçerlidir. İçerik, output_file ile aynıdır.
includes compile Derleyicinin, derlenen kaynağa koşulsuz olarak dahil etmesi gereken dosyaların sırasıdır.
include_paths compile Derleyicinin, #include<foo.h> ve #include "foo.h" kullanılarak eklenen başlıkları aradığı sıra dizinleri.
quote_include_paths compile -iquote dizisi, derleyicinin #include "foo.h" kullanarak eklenen başlıkları aradığı dizinleri içerir.
system_include_paths compile -isystem dizisi, derleyicinin #include <foo.h> kullanarak eklenen başlıkları aradığı dizinleri içerir.
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 compiler_flag, optional_compiler_flag, cxx_flag ve optional_cxx_flag gibi eski CROSSTOOL alanlarındaki işaret dizisi.
user_compile_flags compile copt kural özelliğinden veya --copt, --cxxopt ve --conlyopt işaretlerinden gelen işaret dizisi.
unfiltered_compile_flags compile unfiltered_cxx_flag eski CROSSTOOL alanından veya unfiltered_compile_flags özelliğinden gelen işaretler dizisi. Bunlar nocopts kural özelliğine göre filtrelenmez.
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şaretiyle ayarlanır).
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 geçersiz dosyanın konumu.
linker_param_file bağlantı Komut satırı uzunluk sınırını aşmak için Bazel tarafından oluşturulan bağlayıcı parametre dosyasının konumu.
output_execpath bağlantı Bağlayıcı çıktısının yürütme yolu.
generate_interface_library bağlantı Arayüz kitaplığının oluşturulup oluşturulmayacağına bağlı olarak "yes" veya "no".
interface_library_builder_path bağlantı Arayüz kitaplığı oluşturma aracının yolu.
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ını kullanarak 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 veya linkopts özelliğinden gelen bağlayıcı işaretleri.
symbol_counts_output bağlantı Sembol sayılacak 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şturulması gerektiğini gösterir (Bazel seçeneği "--force_pic" iletildi).
strip_debug_symbols bağlantı Bu değişkenin varlığı, hata ayıklama sembollerinin kaldırılması gerektiğini gösterir.
is_cc_test bağlantı Mevcut işlem cc_test bağlantı işlemi olduğunda doğru, aksi takdirde yanlış değerini alır.
is_using_fission derleme, bağlantı Bu değişkenin varlığı, fisyonun (nesne başına hata ayıklama bilgisi) etkinleştirildiğini gösterir. Hata ayıklama bilgileri .o dosyaları yerine .dwo dosyalarında bulunur ve derleyici ile bağlayıcının bunu bilmesi gerekir.
fdo_instrument_path derleme, bağlantı FDO araçları profilini depolayan dizine giden yol.
fdo_profile_path compile FDO profiline giden yol.
fdo_prefetch_hints_path compile Önbellek önceden getirme profilinin yolu.
csfdo_instrument_path derleme, bağlantı Bağlama duyarlı FDO araçları profilini depolayan dizine giden yol.

İyi bilinen özellikler

Aşağıda, özelliklere ve bunların etkinleştirme koşullarına referans verilmiştir.

Özellik Belgeler
opt | dbg | fastbuild Derleme moduna göre varsayılan olarak etkinleştirilir.
static_linking_mode | dynamic_linking_mode Bağlantı moduna göre varsayılan olarak etkinleştirilir.
per_object_debug_info supports_fission özelliği belirtilip etkinleştirildiyse ve mevcut derleme modu --fission işaretinde belirtiliyorsa etkinleştirilir.
supports_start_end_lib Politika etkinleştirilirse (ve --start_end_lib seçeneği ayarlanırsa) Bazel statik kitaplıklara bağlantı vermez. Bunun yerine, nesnelere doğrudan bağlantı oluşturmak için --start-lib/--end-lib bağlayıcı seçeneklerini kullanır. Bazel'in statik kitaplıklar derlemesi gerekmediğinden bu işlem, derlemeyi hızlandırır.
supports_interface_shared_libraries Politika etkinleştirilirse (ve --interface_shared_objects seçeneği ayarlanırsa) Bazel, linkstatic değeri Yanlış (varsayılan olarak cc_test) değerine ayarlanmış hedefleri arayüz paylaşılan kitaplıklara bağlar. Bu, artımlı yeniden bağlamayı hızlandırır.
supports_dynamic_linker Etkinleştirilirse C++ kuralları, araç zincirinin paylaşılan kitaplıklar oluşturabileceğini bilir.
static_link_cpp_runtimes Etkinleştirilirse Bazel, C++ çalışma zamanını statik olarak ve dinamik bağlantı modunda dinamik olarak bağlar. cc_toolchain.static_runtime_lib veya cc_toolchain.dynamic_runtime_lib özelliğinde belirtilen yapılar (bağlantı moduna bağlı olarak) bağlantı işlemlerine eklenir.
supports_pic Etkinleştirilirse araç zinciri, dinamik kitaplıklar için PIC nesnelerini kullanmayı bilir. PIC derlemesi gerektiğinde "pic" değişkeni mevcuttur. Varsayılan olarak etkinleştirilmemişse ve "--force_pic" iletilirse, Bazel "supports_pic" isteğinde bulunur ve özelliğin etkinleştirildiğini doğrular. Özellik eksikse veya etkinleştirilemediyse "--force_pic" kullanılamaz.
static_linking_mode | dynamic_linking_mode Bağlantı moduna göre varsayılan olarak etkinleştirilir.
no_legacy_features Mevcut olduğunda Bazel'ın eski özellikleri C++ yapılandırmasına eklemesini engeller. Özelliklerin tam listesini aşağıda bulabilirsiniz.

Eski özelliklerde yama uygulama mantığı

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

  • 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 (varsa) özelliğini ekler
  • Araç zincirinin en üstüne pic (varsa) özelliğini ekler
  • Araç zincirinin en üstüne per_object_debug_info (varsa) özelliğini ekler
  • Araç zincirinin en üstüne preprocessor_defines (varsa) özelliğini ekler
  • Araç zincirinin en üstüne includes (varsa) özelliğini ekler
  • Araç zincirinin en üstüne include_paths (varsa) özelliğini ekler
  • Araç zincirinin en üstüne fdo_instrument (varsa) özelliğini ekler
  • Araç zincirinin en üstüne fdo_optimize (varsa) özelliğini ekler
  • Araç zincirinin en üstüne cs_fdo_instrument (varsa) özelliğini ekler
  • Araç zincirinin en üstüne cs_fdo_optimize (varsa) özelliğini ekler
  • Araç zincirinin en üstüne fdo_prefetch_hints (varsa) özelliğini ekler
  • Araç zincirinin en üstüne autofdo (varsa) özelliğini ekler
  • Araç zincirinin en üstüne build_interface_libraries (varsa) özelliğini ekler
  • Araç zincirinin en üstüne dynamic_library_linker_tool (varsa) özelliğini ekler
  • Araç zincirinin en üstüne symbol_counts (varsa) özelliğini ekler
  • Araç zincirinin en üstüne shared_flag (varsa) özelliğini ekler
  • Araç zincirinin en üstüne linkstamps (varsa) özelliğini ekler
  • Araç zincirinin en üstüne output_execpath_flags (varsa) özelliğini ekler
  • Araç zincirinin en üstüne runtime_library_search_directories (varsa) özelliğini ekler
  • Araç zincirinin en üstüne library_search_directories (varsa) özelliğini ekler
  • Araç zincirinin en üstüne archiver_flags (varsa) özelliğini ekler
  • Araç zincirinin en üstüne libraries_to_link (varsa) özelliğini ekler
  • Araç zincirinin en üstüne force_pic_flags (varsa) özelliğini ekler
  • Araç zincirinin en üstüne user_link_flags (varsa) özelliğini ekler
  • Araç zincirinin en üstüne legacy_link_flags (varsa) özelliğini ekler
  • Araç zincirinin en üstüne static_libgcc (varsa) özelliğini ekler
  • Araç zincirinin en üstüne fission_support (varsa) özelliğini ekler
  • Araç zincirinin en üstüne strip_debug_symbols (varsa) özelliğini ekler
  • Araç zincirinin en üstüne coverage (varsa) özelliğini ekler
  • Araç zincirinin en üstüne llvm_coverage_map_format (varsa) özelliğini ekler
  • Araç zincirinin en üstüne gcc_coverage_map_format (varsa) özelliğini ekler
  • Araç zincirinin alt kısmına fully_static_link (varsa) özelliğini ekler
  • Araç zincirinin alt kısmına user_compile_flags (varsa) özelliğini ekler
  • Araç zincirinin alt kısmına sysroot (varsa) özelliğini ekler
  • Araç zincirinin alt kısmına unfiltered_compile_flags (varsa) özelliğini ekler
  • Araç zincirinin alt kısmına linker_param_file (varsa) özelliğini ekler
  • Araç zincirinin alt kısmına compiler_input_flags (varsa) özelliğini ekler
  • Araç zincirinin alt kısmına compiler_output_flags (varsa) özelliğini ekler

Bu, uzun bir özellik listesidir. Planınız, Starlark'taki Crosstool aracı tamamlandığında onlardan kurtulmak. Meraklı okuyucular için CppActionConfigs içindeki uygulamaya bakın. Üretim araç zincirleri ise araç zincirini daha bağımsız hale getirmek için no_legacy_features eklemeyi düşünün.