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

Sorun bildir Kaynağı göster

Genel bakış

Derleyiciyi doğru seçeneklerle çağırmak için Bazel'ın 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'ın ş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 sistemde dizinler bulunur. Bazel'ın, kaynak dosyaya dahil edilen tüm üst bilgilerin BUILD dosyasında doğru bir şekilde tanımlandığını doğrulaması için bunlara ihtiyacı vardır.
  • Varsayılan sysroot.
  • Derleme, bağlantı oluşturma, arşivleme için hangi işaretlerin kullanılacağı.
  • Desteklenen derleme modları (opt, dbg, fastbuild) için hangi işaretlerin kullanılacağı.
  • Değişkenleri derleyici için özellikle gerekli kılın.

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

CcToolchainConfigInfo, Bazel C++ kurallarının davranışını yapılandırmak için gerekli ayrıntı düzeyini sağlayan bir sağlayıcıdır. Bazel, varsayılan olarak derlemeniz için CcToolchainConfigInfo öğesini otomatik olarak yapılandırır ancak manuel olarak yapılandırabilirsiniz. Bunun için, CcToolchainConfigInfo 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() numarasını arayarak CcToolchainConfigInfo oluşturabilirsiniz. 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 aktarır.

Örneğin, cc_binary veya cc_library gibi bir kuralla somutlaştırılan 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çeneklerinden 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 gereken 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ığı şu ş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, 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şi bulamazsa hata verir.

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

    • Hiçbir işaret belirtilmezse 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 öğeler) yönetir. Bu mesajlar, Bazel ikili programı değiştirilmeden Bazel'de tam donanımlı C++ özelliklerinin uygulanmasına olanak tanır. C++ kuralları, Bazel kaynak kodunda ayrıntılı olarak belgelenen birden çok benzersiz işlemi destekler.

Özellikler

Özellik; 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ıktır. 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şimde bulunup derlemeye header_modules ya da thin_lto gibi yeni derleme işlemleri ve girişleri eklemek gibi basit bir işlem olabilir.

İdeal olarak CcToolchainConfigInfo, özelliklerin 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.

Bir özellik adı ile belirtilir. Bu, Starlark kural yapılandırmasının Bazel sürümlerinden tamamen ayrıştırılmasına olanak tanır. Başka bir deyişle, bir Bazel sürümü, 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 açıkça etkinleştirir.
  • Kullanıcı, bu özelliği --feature Bazel seçeneği veya features kural özelliği aracılığıyla etkinleştirir.

Özellikler birbirine bağımlı 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ından kaynaklanan ç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 desteklendiğinde (opt, dbg veya fastbuild). "requires" birden fazla "feature_set" içeriyorsa (belirtilen tüm özellikler etkinleştirildiğinde) "feature_set"lerden herhangi biri karşılandığında özellik desteklenir.
implies = ['feature']

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

Ayrıca, temizleyicilerin sık kullanılan parçaları gibi bir dizi özelliğin ortak işlev alt kümelerini de hesaba katma olanağı sağlar. Örtülü ö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"] belirtebilir.

Bu özellik, kullanıcı aynı anda iki veya daha fazla karşılıklı olarak birbirini dışlayan özellik isterse alternatifleri listeleyerek hata işlemeyi iyileştirir.

with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
]
İşaretleme 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ştirildiği ve not_features kümesinde 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şleme koşulsuz olarak uygulanır.

İşlemler

Eylemler, bir işlemin nasıl çalışacağını varsaymadan yürütülürken koşulları değiştirme esnekliği sağlar. action_config, bir işlemin çağırdığı araç ikili programını, 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 işlem 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 işaretleri ve araçları olan c++-compile gibi işlemleri içerir. Her işleme, bir özellikle ilişkilendirilerek işaretler atanır.

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

Derleyici işlemleri

İşlem Açıklama
preprocess-assemble Ön işleme sistemiyle birleştirin. Genellikle .S dosyaları için.
assemble Önceden işleme olmadan monte edin. Genellikle .s dosyaları için.

Derleyici işlemleri

İşlem Açıklama
cc-flags-make-variable CC_FLAGS öğesini, türlere yayar.
c-compile C olarak derleyin.
c++-compile C++ olarak derleyin.
c++-header-parsing Başlığın 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ı oluşabilir. 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 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) derler 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ı (ikili) ve özelliklerle 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şleme karşılık gelen 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ç, özellik yapılandırmasıyla eşleşen bir özellik grubuna sahip listede 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. Aynı özellikte olduğu gibi.
env_sets Bir işlem grubu için geçerli olan ortam kısıtlamalarının listesi. Aynı özellikte olduğu gibi.

action_config, daha önce açıklanan özellik ilişkileri tarafından belirtildiği gibi 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ğinden ve amaç gereksiz action_config+feature eşlemelerinden 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 action_config amacını güçlendirir. İşlemin özellikleri, araç zincirinde tek bir yerde net bir şekilde açıklanır.

Araç kurucuyu kullanma

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

Alan Açıklama
path Söz konusu aracın yolu (mevcut konuma göre).
with_features Bu aracın kullanılabilmesi için karşılanması gereken en az bir özellik listesi bulunur.

Belirli bir action_config için yalnızca tek bir tool, araç yolu ve yürütme gereksinimlerini Bazel işlemine uygular. Özellik yapılandırmasıyla eşleşen with_feature grubuna sahip bir araç bulunana kadar action_config öğesinde tools özelliği yinelenerek 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

Özellikler ve işlemler, farklı platformlar arası anlamlara sahip Bazel eylemlerini uygulamak için birlikte kullanılabilir. Örneğin, macOS'te hata ayıklama sembolü oluşturma işlemi için, derleme işleminde simgeler oluşturulması, ardından bağlantı işlemi sırasında sıkıştırılmış dsym arşivi oluşturmak için özel bir araç çağrılması ve ardından Xcode tarafından kullanılabilecek uygulama paketi ve .plist dosyaları oluşturmak için bu arşivin açılması gerekir.

Bazel ile bu süreç aşağıdaki gibi uygulanabilir: unbundle-debuginfo bir Bazel işlemidir:

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

action_configs = [
    action_config (
        action_name = ACTION_NAMES.cpp_link_executable,
        tools = [
            tool(
                with_features = [
                    with_feature(features=["generate-debug-symbols"]),
                ],
                path = "toolchain/mac/ld-with-dsym-packaging",
            ),
            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 veya .pdb dosyası üreten Windows için tamamen farklı şekilde 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(
                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"],
                    ),
                ],
            ),
      ],
    ),
]

Grupları işaretle

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

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

Bu durumda, işaretin içeriği eylemin çı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 bayrak 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 bir yol öğesi için -I<path> değerine genişler. İşaretleme grubu bildiriminin 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 bir 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ı da içerebilir. Ad çakışmalarını önlemek 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

İşaret grupları, belirli bir değişkenin veya alanının varlığına dayalı koşullu genişletmeyi destekler. Bunun için expand_if_available, expand_if_not_available, expand_if_true, expand_if_false veya expand_if_equal özelliklerini kullanır. Ö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, C++ kurallarını başarıyla yapılandırmak için gereken derleme değişkenleri, özellikler ve diğer bilgilere bir referans sağlanı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 Kaldırı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ı ön işleyen (genellikle --save_temps işareti kullanıldığında) işlemleri derlemek için geçerlidir. İçerik, output_file ile aynıdır.
includes compile Derleyicinin koşulsuz olarak derlenen kaynağa eklemesi gereken dosya sırası.
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 eklenen başlıkları aradığı dizinleri içerir.
system_include_paths compile -isystem dizisi, derleyicinin #include <foo.h> kullanılarak 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ından gelen 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şaret dizisi. Bunlar nocopts kural özelliği tarafından 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ğlanacak dosyaları, bağlayıcı çağrısında giriş olarak işaretler.
def_file_path bağlantı MSVC içeren Windows'da 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ı param 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ı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ş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ğlayıcı işaretleri.
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 belirtir (Bazel seçeneği "--force_pic" geçirildi).
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 bir 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.
cs_fdo_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 belirtilmişse etkinleştirilir.
supports_start_end_lib Etkinleştirilirse (ve --start_end_lib seçeneği ayarlanırsa) Bazel statik kitaplıklara bağlantı vermez. Bunun yerine, doğrudan nesnelere bağlantı oluşturmak için --start-lib/--end-lib bağlayıcı seçeneklerini kullanır. Bazel'ın statik kitaplıklar derlemesine gerek olmadığından bu, derlemeyi hızlandırır.
supports_interface_shared_libraries Etkinleştirilirse (ve --interface_shared_objects seçeneği ayarlanırsa) Bazel, linkstatic öğesinin Yanlış (varsayılan olarak cc_test) değerine ayarlandığı hedefleri arayüz paylaşılan kitaplıklarına bağlar. Bu, artımlı yeniden bağlantıyı 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 C++ yapılandırmasına eski özellikleri eklemesini önler. Özelliklerin tam listesini aşağıda bulabilirsiniz.

Eski özelliklere 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 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, Starlark'taki Crosstool aracından sonra bunları ortadan kaldırmaktır. Meraklı okuyucular için uygulamayı CppActionConfigs'de görebilir, üretim araç zincirleri için araç zincirini daha bağımsız hale getirmek için no_legacy_features eklemeyi düşünün.