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

7.3 · 7.2 · 7.1 · 7.0 · 6.5

Genel Bakış

Derleyiciyi doğru seçeneklerle çağırmak için Bazel'in derleyicinin dahil edilen dizinleri ve önemli işaretçileri gibi dahili özellikleri hakkında bilgi sahibi olması gerekir. Diğer bir deyişle, Bazel'in çalışma şeklini anlamak için derleyicinin basitleştirilmiş bir modeline ihtiyacı vardır.

Bazel'in bilmesi gerekenler:

  • Derleyicinin ince LTO'yu, modülleri, dinamik bağlantıyı veya PIC'yi (konumdan bağımsız kod) destekleyip desteklemediği.
  • gcc, ld, ar, objcopy vb. gerekli araçların yolları.
  • Yerleşik sistemde dizinler bulunur. Bazel, kaynak dosyaya dahil edilen tüm üst bilgilerin BUILD dosyasında doğru şekilde tanımlandığını doğrulamak için bu bilgilere 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 işaretler.
  • Derleyici tarafından özel olarak gerekli olan değişkenler oluşturun.

Derleyici birden fazla mimariyi destekliyorsa Bazel'in bunları ayrı ayrı yapılandırması gerekir.

CcToolchainConfigInfo, Bazel'in C++ kurallarının davranışını yapılandırma için gerekli düzeyde ayrıntı sunan bir sağlayıcıdır. Varsayılan olarak Bazel, derlemeniz için CcToolchainConfigInfo politikasını otomatik olarak yapılandırır ancak dilerseniz manuel olarak yapılandırabilirsiniz. Bunun için CcToolchainConfigInfo özelliğini sağlayan bir Starlark kuralına ve cc_toolchain öğesinin toolchain_config özelliğini kuralınıza yönlendirmeniz gerekir. cc_common.create_cc_toolchain_config_info() numaralı telefonu arayarak CcToolchainConfigInfo öğesini oluşturabilirsiniz. İşlemde ihtiyaç duyacağınız tüm yapıların Starlark yapıcıları @rules_cc//cc:cc_toolchain_config_lib.bzl adresinde bulunabilir.

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

Örneğin, cc_binary veya cc_library gibi bir kural tarafından örneklendirilen bir derleme veya bağlantı işlemi için aşağıdaki bilgiler gerekir:

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

Korumalı alanda gerekli olan yapılar dışında yukarıdaki bilgilerin tümü, cc_toolchain öğesinin işaret ettiği Starlark hedefinde belirtilmiştir.

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

Araçlar zinciri seçimi

Araç zinciri seçim mantığı aşağıdaki şekilde ç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, yalnızca --cpu işareti değerine veya ortak bir --cpu | --compiler değerine göre bu araç takımlarından hangisinin seçileceğini belirler. Seçim süreci aşağıdaki gibidir:

    • --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 belirtilmezse Bazel, yalnızca --cpu ile cc_toolchain_suite.toolchains özelliğindeki ilgili girişi seçer.

    • Hiçbir işaret belirtilmezse Bazel, ana sistemi inceler ve bulgularına göre bir --cpu değeri seçer. İnceleme mekanizması koduna bakın.

Bir araç zinciri seçildikten sonra, Starlark kuralındaki ilgili feature ve action_config nesneleri derlemenin yapılandırmasını (yani daha sonra açıklanan öğeleri) yönetir. Bu mesajlar, Bazel ikili dosyasında değişiklik yapmadan Bazel'de tam teşekküllü C++ özelliklerinin uygulanmasına olanak tanır. C++ kuralları, Bazel kaynak kodunda ayrıntılı olarak açıklanan birden çok benzersiz işlemi destekler.

Özellikler

Özellik, komut satırı işaretleri, işlemler, yürütme ortamında kısıtlamalar veya bağımlılık değişiklikleri gerektiren bir öğedir. Bir özellik, BUILD dosyalarının treat_warnings_as_errors gibi işaret yapılandırmalarını seçmesine izin vermek veya C++ kurallarıyla etkileşim kurmak ve derlemeye header_modules ya da thin_lto gibi yeni derleme işlemleri ve girişleri eklemek gibi basit bir şey olabilir.

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

Özellikler adlarıyla belirtilir. Bu sayede Starlark kural yapılandırması, Bazel sürümlerinden tamamen ayrılabilir. Başka bir deyişle, Bazel sürümü yeni özelliklerin kullanımını gerektirmediği sürece CcToolchainConfigInfo yapılandırmalarının davranışını etkilemez.

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

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

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

Özellik ilişkileri

Bağımlılıklar genellikle doğrudan Bazel ile yönetilir. Bazel, yalnızca gereksinimleri uygular ve derlemede tanımlanan özelliklerin doğasına özgü anlaşmazlıkları yönetir. Araç zinciri spesifikasyonu, doğrudan özellik desteği ve genişletmeyi yöneten Starlark kuralında kullanılmak üzere 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üzeyinde. Bu özellik yalnızca belirtilen gerekli özellikler etkinleştirildiğinde desteklenir. Örneğin, bir özellik yalnızca belirli derleme modlarında (opt, dbg veya fastbuild) destekleniyor olabilir. "requires" birden fazla "feature_set" içeriyorsa "feature_set"lerden herhangi biri karşılanırsa (belirtilen tüm özellikler etkinleştirildiğinde) özellik desteklenir.
implies = ['feature']

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

Ayrıca, dezenfektanların ortak kısımları gibi bir dizi özelliğin genel işlevlerinin dikkate alınmasını sağlar. Dolaylı özellikler devre dışı bırakılamaz.

provides = ['feature']

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

Bu, kullanıcı aynı anda birbirini dışlayan iki veya daha fazla özellik istediğinde alternatifleri listeleyerek hata yönetimini iyileştirir.

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

İşlemler

İşlemler, bir işlemin nasıl çalışacağını varsaymadan işlemin yürütüleceği koşulları değiştirme esnekliği sağlar. action_config, bir işlemin çağırdığı araç ikilisini belirtir. feature ise işlem çağrıldığında söz konusu aracın nasıl davranacağını belirleyen yapılandırmayı (işaretler) belirtir.

İşlemler Bazel işlem grafiğini değiştirebileceğinden özellikler, hangi Bazel işlemlerini etkilediklerini belirtmek için işlemlere referans verir. CcToolchainConfigInfo sağlayıcı, c++-compile gibi işaretleri ve araçları olan işlemleri içerir. İşaretler, bir özellikle ilişkilendirilerek her işleme atanır.

Her işlem adı, Bazel tarafından gerçekleştirilen, derleme veya bağlama gibi tek bir işlem türünü temsil eder. Bununla birlikte, işlemler ile Bazel işlem türleri arasında bire çok ilişki vardır. Bazel işlem türü, bir işlemi uygulayan Java sınıfını (CppCompileAction gibi) ifade eder. Özellikle, aşağıdaki tablodaki "toplayıcı işlemleri" ve "derleyici işlemleri" CppCompileAction iken bağlantı işlemleri CppLinkAction'dır.

Derleyici işlemleri

İşlem Açıklama
preprocess-assemble Önceden işleme ile birleştirin. Genellikle .S dosyaları içindir.
assemble Önceden işleme olmadan birleştirin. Genellikle .s dosyaları için.

Derleyici işlemleri

İşlem Açıklama
cc-flags-make-variable CC_FLAGS öğesini genrules öğesine iletir.
c-compile C olarak derleyin.
c++-compile C++ olarak derleyin.
c++-header-parsing Aksi takdirde derleme hataları oluşacağından, derleyicinin ayrıştırıcısını bir başlık dosyasında çalıştırarak başlığın kendi kendine yeterli olduğundan emin olun. Yalnızca modülleri destekleyen toolchain'ler için geçerlidir.
İşlem Açıklama
c++-link-dynamic-library Tüm bağımlılıkları içeren bir paylaşılan kitaplığın bağlantısını ekleyin.
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.

AR işlemleri

AR işlemleri, ar aracılığıyla nesne dosyalarını arşiv kitaplıklarında (.a dosyaları) bir araya getirir ve bazı anlamları isme kodlar.

İş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 parametresini kullanma

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

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

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

Bir action_config, daha önce açıklanan özellik ilişkilerine göre diğer özellikleri ve action_config'leri gerektirebilir ve ima edebilir. Bu davranış, bir özelliğin davranışına benzer.

Son iki özellik, özelliklerdeki ilgili ö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 çiftlerini önlemek olduğu için dahil edilmiştir. Genellikle tek bir özelliğin birden fazla action_config üzerinde paylaşılması tercih edilir.

Aynı araç zincirinde aynı action_name ile birden fazla action_config tanımlayamazsınız. Bu, araç yollarında belirsizliği önler ve action_config'ün amacını (bir işlemin özelliklerinin araç zincirindeki tek bir yerde net bir şekilde açıklanması) destekler.

Araç oluşturucuyu kullanma

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

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

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

Örnek kullanım

Bazel işlemlerini farklı platformlar arası semantiklerle uygulamak için özellikler ve işlemler birlikte kullanılabilir. Örneğin..plist

Bazel'de bu süreç, unbundle-debuginfo bir Bazel işlemi olacak şekilde aşağıdaki gibi uygulanabilir:

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

Aynı özellik, fission kullanan Linux için veya .pdb dosyaları oluşturan Windows için tamamen farklı şekilde uygulanabilir. Örneğin, fission tabanlı hata ayıklama simgesi oluşturma için uygulama 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"],
                    ),
                ],
            ),
      ],
    ),
]

İşaret grupları

CcToolchainConfigInfo, işaretleri belirli bir amaca hizmet eden gruplar halinde gruplandırmanıza olanak tanır. İşaretçi değeri içinde önceden tanımlanmış değişkenler kullanarak bir işaretçi belirtebilirsiniz. Derleyici, işaretçiyi derleme komutuna eklerken bu değişkenleri genişletir. Örneğin:

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

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

İşaret grupları, listede göründükleri sırayla (yukarıdan aşağıya, soldan sağa) derleme komutuna 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> olarak genişler. Bir işaret grubu beyanının gövdesinde bulunan 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> olarak genişler.

Değişkenler birden çok kez tekrarlanabilir. Örneğin:

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

şu şekilde genişletilir:

-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 diziler de içerebilir. Ad çakışmalarını önlemek ve açıkça belirtmek için alanların tam yolunu 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 alanının varlığı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şkenleri, özellikler ve C++ kurallarını başarıyla yapılandırmak için gereken diğer bilgilere referans verilmektedir.

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 Kaldırılacak yapı.
output_file compile Derleme çıkışı.
output_assembly_file compile Oluşturulan derleme dosyası. Yalnızca compile işlemi, genellikle --save_temps işaretçisi kullanılırken derleme metni yayınladığında geçerlidir. İçerik, output_file ile aynıdır.
output_preprocess_file compile Önceden işlenmiş çıkış. Yalnızca kaynak dosyalara ön işlem uygulayan derleme işlemleri için geçerlidir (genellikle --save_temps işareti kullanılır). İçerik, output_file ile aynıdır.
includes compile Derleyicinin derlenmiş kaynağa koşulsuz olarak dahil etmesi gereken dosya dizisi.
include_paths compile Derleyicinin, #include<foo.h> ve #include "foo.h" kullanılarak eklenen üst bilgileri aradığı sıra dizinleri.
quote_include_paths compile -iquote dizisi, derleyicinin #include "foo.h" kullanılarak dahil edilen başlıkları aradığı dizinleri içerir.
system_include_paths compile -isystem dizisi, derleyicinin #include <foo.h> kullanılarak dahil edilen 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 derleyin.
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ından gelen işaretler dizisi.
user_compile_flags compile copt kural özelliğinden veya --copt, --cxxopt ve --conlyopt işaretlerinden oluşan işaret dizisi.
unfiltered_compile_flags compile unfiltered_cxx_flag Eski CROSSTOOL alanındaki veya unfiltered_compile_flags özelliğindeki işaretler dizisi. Bunlar nocopts kural özelliğine göre filtrelenmez.
sysroot sysroot
runtime_library_search_directories bağlantı Bağlantılayıcı çalışma zamanı arama yolunda bulunan girişler (genellikle -rpath işaretiyle ayarlanır).
library_search_directories bağlantı Bağlantılayıcı arama yolunda bulunan 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ı MSVC ile Windows'ta kullanılan def dosyasını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ğlantılayıcının çıkışının Execpath değeri.
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şturucu 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şturucu 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ğlantı işaretçileri.
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şturulması gerektiğini gösterir (Bazel seçeneği "--force_pic" geçildi).
strip_debug_symbols bağlantı Bu değişkenin varlığı, hata ayıklama simgelerinin kaldırılması gerektiğini gösterir.
is_cc_test bağlantı Mevcut işlem bir cc_test ilişkilendirme işlemiyse doğru, aksi takdirde yanlış değerini döndürür.
is_using_fission derleme, bağlantı Bu değişkenin varlığı, fission'un (nesne başına hata ayıklama bilgileri) etkin olduğunu gösterir. Hata ayıklama bilgileri .o dosyaları yerine .dwo dosyalarında yer alır ve derleyici ile bağlayıcının bunu bilmesi gerekir.
fdo_instrument_path derle, bağlantı oluştur, derle, bağlantı FDO enstrümantasyon profilini depolayan dizinin yolu.
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 enstrümantasyon profilini depolayan dizinin yolu.

İyi bilinen özellikler

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

Özellik Belgeler
opt | dbg | fastbuild Derleme moduna göre varsayılan olarak etkindir.
static_linking_mode | dynamic_linking_mode Bağlantı moduna bağlı olarak varsayılan olarak etkindir.
per_object_debug_info supports_fission özelliği belirtilip etkinleştirildiyse ve mevcut derleme modu --fission işaretinde belirtilmişse etkinleştirilir.
supports_start_end_lib Etkinleştirilirse (ve --start_end_lib seçeneği ayarlanırsa) Bazel, statik kitaplıklarla bağlantı kurmaz. Bunun yerine, doğrudan nesnelerle bağlantı kurmak için --start-lib/--end-lib bağlayıcı seçeneklerini kullanır. Bu işlem, Bazel'in statik kitaplıklar derlemesine gerek olmadığı için derlemeyi hızlandırır.
supports_interface_shared_libraries Etkinleştirilirse (ve --interface_shared_objects seçeneği ayarlanırsa) Bazel, linkstatic değeri Yanlış (varsayılan olarak cc_test) olarak ayarlanmış hedefleri arayüzde paylaşılan kitaplıklara bağlar. Bu sayede artımlı yeniden bağlantı işlemi daha hızlı gerçekleşir.
supports_dynamic_linker Etkinleştirildiğinde 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 bağlantı modunda statik olarak ve dinamik bağlantı modunda dinamik olarak bağlar. cc_toolchain.static_runtime_lib veya cc_toolchain.dynamic_runtime_lib özelliğinde (bağlantı moduna bağlı olarak) belirtilen yapı taşları, 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. Varsayılan olarak etkinleştirilmezse ve `--force_pic` parametresi iletilirse Bazel, "supports_pic" parametresini ister ve özelliğin etkin olduğunu doğrular. Özellik yoksa veya etkinleştirilemediyse `--force_pic` kullanılamaz.
static_linking_mode | dynamic_linking_mode Bağlantı moduna bağlı olarak varsayılan olarak etkindir.
no_legacy_features Bazel'in, mevcut olduğunda C++ yapılandırmasına eski özellikleri eklemesini engeller. Özelliklerin tam listesini aşağıda bulabilirsiniz.

Eski özellikler için yamalar mantığı

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

Bu, uzun bir özellik listesidir. Starlark'ta Crosstool tamamlandıktan sonra bunları kaldırmayı planlıyoruz. Merak eden okuyucular CppActionConfigs'deki uygulamayı inceleyebilir. Üretim araç zincirlerinde ise araç zincirinin daha bağımsız olması için no_legacy_features ekleyebilirsiniz.