Genel Bakış
Derleyiciyi doğru seçeneklerle çağırmak için Bazel'in, derleyici iç işleyişi hakkında bazı bilgilere (ör. include dizinleri ve önemli işaretler) ihtiyacı vardır. Başka bir deyişle, Bazel'in işleyişini anlamak için derleyicinin basitleştirilmiş bir modeline ihtiyacı vardır.
Bazel'in aşağıdaki bilgileri bilmesi gerekir:
- Derleyicinin thinLTO, modüller, dinamik bağlantı veya PIC (konumdan bağımsız kod) destekleyip desteklemediği.
- gcc, ld, ar, objcopy gibi gerekli araçların yolları.
- Yerleşik sistem, dizinleri içerir. Bazel, kaynak dosyaya dahil edilen tüm üstbilgilerin BUILDdosyasında düzgün şekilde tanımlandığını doğrulamak için bu bilgilere ihtiyaç duyar.
- Varsayılan sysroot.
- Derleme, bağlama ve arşivleme için hangi işaretlerin kullanılacağı.
- Desteklenen derleme modları (opt, dbg, fastbuild) için hangi işaretlerin kullanılacağı.
- Derleyici tarafından özellikle gerekli kılınan 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ırmak için gerekli ayrıntı düzeyini sağlayan bir sağlayıcıdır. Varsayılan olarak Bazel, derlemeniz için CcToolchainConfigInfo öğesini otomatik olarak yapılandırır ancak manuel olarak da 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() işlevini çağırarak CcToolchainConfigInfo oluşturabilirsiniz.
Süreçte ihtiyacınız olacak tüm yapıların Starlark oluşturucularını @rules_cc//cc:cc_toolchain_config_lib.bzl adresinde bulabilirsiniz.
Bir C++ hedefi analiz aşamasına girdiğinde Bazel, cc_toolchain dosyasına göre uygun BUILD hedefini seçer ve cc_toolchain.toolchain_config özelliğinde belirtilen hedeften CcToolchainConfigInfo sağlayıcısını alır. cc_toolchain hedefi, bu bilgiyi CcToolchainProvider aracılığıyla C++ hedefine iletir.
Örneğin, cc_binary veya cc_library gibi bir kural tarafından oluşturulan 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/--linkoptseçenekleri aracılığıyla iletilen yapılandırma işaretleri
- Ortam değişkenleri
- İşlemin yürütüldüğü sanal ortamda gereken yapılar
Sandbox'ta gerekli olan yapılar hariç yukarıdaki tüm bilgiler, cc_toolchain işaretinin gösterdiği Starlark hedefinde belirtilir.
Sandbox'a gönderilecek yapılar cc_toolchain hedefinde belirtilir. Örneğin, cc_toolchain.linker_files özelliğiyle, bağlayıcı ikili dosyasını ve araç zinciri kitaplıklarını belirtip bunları korumalı alana gönderebilirsiniz.
Araç zinciri seçimi
Araç zinciri seçim mantığı şu şekilde çalışır:
- Kullanıcı, - BUILDdosyasında bir- cc_toolchain_suitehedefi belirtir ve- --crosstool_topseçeneğini kullanarak Bazel'i hedefe yönlendirir.
- cc_toolchain_suitehedefi birden fazla araç zincirine referans veriyor.- --cpuve- --compilerişaretlerinin değerleri, bu araç zincirlerinden hangisinin seçileceğini belirler. Bu seçim yalnızca- --cpuişaret değerine veya ortak bir- --cpu | --compilerdeğerine göre yapılır. Seçim süreci aşağıdaki gibidir:- --compilerseçeneği belirtilirse Bazel,- --cpu | --compilerile- cc_toolchain_suite.toolchainsözelliğinden ilgili girişi seçer. Bazel, karşılık gelen bir giriş bulamazsa hata verir.
- --compilerseçeneği belirtilmezse Bazel, yalnızca- --cpuiçeren- cc_toolchain_suite.toolchainsözelliğinden ilgili girişi seçer.
- Herhangi bir işaret belirtilmezse Bazel, ana makine sistemini inceler ve bulgularına göre bir - --cpudeğ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 öğeler) yönetir. Bu mesajlar, Bazel ikilisini değiştirmeden Bazel'de tam teşekküllü C++ özelliklerinin uygulanmasına olanak tanır. C++ kuralları, Bazel kaynak kodunda ayrıntılı olarak belgelenen birden fazla benzersiz işlemi destekler.
Özellikler
Özellik, komut satırı işaretleri, işlemler, yürütme ortamıyla ilgili kısıtlamalar veya bağımlılık değişiklikleri gerektiren bir varlıktır. Bir özellik, BUILD dosyalarının treat_warnings_as_errors gibi işaretlerin yapılandırmalarını seçmesine veya C++ kurallarıyla etkileşime girmesine ve derlemeye header_modules veya thin_lto gibi yeni derleme işlemleri ve girişleri eklemesine olanak tanımak kadar basit olabilir.
İdeal olarak, CcToolchainConfigInfo bir özellik listesi içerir. Her özellik, bir veya daha fazla işaret grubundan oluşur. Her işaret grubu, belirli Bazel işlemleri için geçerli olan bir işaret listesini tanımlar.
Özellikler ada göre belirtilir. Bu sayede, Starlark kuralı yapılandırması Bazel sürümlerinden tamamen ayrılabilir. Başka bir deyişle, bu yapılandırmalar yeni özelliklerin kullanılmasını gerektirmediği sürece Bazel sürümü, CcToolchainConfigInfo yapılandırmalarının davranışını etkilemez.
Bir özellik aşağıdaki yöntemlerden biriyle etkinleştirilir:
- Özelliğin enabledalanıtrueolarak ayarlanır.
- Bazel veya kural sahibi bunu açıkça etkinleştirir.
- Kullanıcı, --featureBazel seçeneği veyafeatureskuralı özelliği aracılığıyla etkinleştirir.
Özellikler birbirine bağlı olabilir, komut satırı işaretlerine, BUILDdosya
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 zorunlu kılar ve derlemede tanımlanan özelliklerin doğasında bulunan çakışmaları yönetir. Araç zinciri spesifikasyonu, özellik desteğini ve genişletmeyi yöneten Starlark kuralında doğrudan kullanılmak üzere daha ayrıntılı kısıtlamalara olanak tanır. Desteklenen biçimler şunlardır:
| Constraint | Açıklama | 
| requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
] | Özellik düzeyi. Bu özellik yalnızca belirtilen gerekli özellikler etkinleştirilmişse desteklenir. Örneğin, bir özellik yalnızca belirli derleme modlarında ( opt,dbgveyafastbuild) destekleniyorsa. "requires" birden fazla "feature_set" içeriyorsa, belirtilen tüm özellikler etkinleştirildiğinde "feature_set"lerden herhangi biri karşılanıyorsa özellik desteklenir. | 
| implies = ['feature'] | Özellik düzeyi. Bu özellik, belirtilen özellikleri içerir. Bir özelliği etkinleştirmek, bu özelliğin ima ettiği tüm özellikleri de dolaylı olarak etkinleştirir (yani, özyinelemeli olarak çalışır). Ayrıca, işlevlerin ortak alt kümelerini (ör. temizleyicilerin ortak kısımları) bir dizi özellikten ayırma olanağı da sunar. İçerilen özellikler devre dışı bırakılamaz. | 
| provides = ['feature'] | Özellik düzeyi. Bu özelliğin, birbirini dışlayan alternatif özelliklerden biri olduğunu gösterir. Örneğin, tüm temizleyiciler  Bu, kullanıcı aynı anda birbirini dışlayan iki veya daha fazla özellik istediğinde alternatifleri listeleyerek hata işlemeyi iyileştirir. | 
| with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
] | Set düzeyinde işaretleme. Bir özellik, birden fazla işaret grubu belirtebilir. with_featuresbelirtildiğinde, işaret kümesi yalnızca belirtilenfeatureskümesindeki tüm özelliklerin etkinleştirildiği venot_featureskümesinde belirtilen tüm özelliklerin devre dışı bırakıldığı en az birwith_feature_setvarsa derleme komutuna genişletilir.with_featuresbelirtilmezse işaret grubu, belirtilen her işlem için koşulsuz olarak uygulanır. | 
İşlemler
İşlemler, işlemin nasıl çalıştırılacağını varsaymadan, bir işlemin yürütüldüğü koşulları değiştirme esnekliği sağlar. action_config, bir işlemin çağırdığı araç ikilisini belirtirken feature, işlemin çağrılması sırasında bu aracın nasıl davranacağını belirleyen yapılandırmayı (işaretler) belirtir.
Özellikler, Bazel işlem grafiğini değiştirebildiğinden hangi Bazel işlemlerini etkilediklerini belirtmek için işlemlere başvurur. CcToolchainConfigInfo sağlayıcısı, c++-compile gibi kendileriyle ilişkili işaretler ve araçlar içeren işlemler içerir. İşlemler, bir özellikle ilişkilendirilerek her işleme işaret atanır.
Her işlem adı, Bazel tarafından gerçekleştirilen tek bir işlem türünü (ör. derleme veya bağlama) temsil eder. Ancak işlemler ve Bazel işlem türleri arasında çoktan bire ilişki vardır. Bazel işlem türü, bir işlemi (ör. CppCompileAction) uygulayan bir Java sınıfını ifade eder. Özellikle, aşağıdaki tablodaki "assembler işlemleri" ve "derleyici işlemleri" CppCompileAction, bağlantı işlemleri ise CppLinkAction'dir.
Derleyici işlemleri
| İşlem | Açıklama | 
| preprocess-assemble | Ön işleme ile birleştirin. Genellikle .Sdosyaları için. | 
| assemble | Ön işleme olmadan birleştirin. Genellikle .sdosyaları için. | 
Derleyici işlemleri
| İşlem | Açıklama | 
| cc-flags-make-variable | CC_FLAGSöğesini genrules'a yayar. | 
| c-compile | C. olarak derle | 
| 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şur. Yalnızca modülleri destekleyen araç zincirleri için geçerlidir. | 
Bağlantı işlemleri
| İşlem | Açıklama | 
| c++-link-dynamic-library | Tüm bağımlılıklarını içeren bir paylaşılan kitaplığı bağlayın. | 
| c++-link-nodeps-dynamic-library | Yalnızca cc_librarykaynakları içeren bir paylaşılan kitaplığı bağlayın. | 
| c++-link-executable | Çalışmaya 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ı) birleştirir ve bazı semantik bilgileri ada kodlar.
| İşlem | Açıklama | 
| c++-link-static-library | Statik kitaplık (arşiv) oluşturun. | 
LTO işlemleri
| İşlem | Açıklama | 
| lto-backend | Bitkodları yerel nesneler halinde derleyen ThinLTO işlemi. | 
| lto-index | ThinLTO işlemi, genel dizin oluşturur. | 
action_config kullanma
action_config, işlem sırasında çağrılacak aracı (ikili) belirterek ve özellikler tarafından tanımlanan bir dizi işaret ayarlayarak bir Bazel işlemini açıklayan bir Starlark yapısıdır. Bu işaretler, işlemin yürütülmesine kısıtlamalar uygular.
action_config() oluşturucusunda aşağıdaki parametreler bulunur:
| Özellik | Açıklama | 
| action_name | Bu işlemin karşılık geldiği Bazel işlemi. Bazel, bu özelliği işlem başına araç ve yürütme gereksinimlerini keşfetmek için 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 grup işlem için geçerli olan işaretlerin listesi. Bir özellik için geçerli olan durumun aynısıdır. | 
| env_sets | Bir grup işlem için geçerli olan ortam kısıtlamalarının listesi. Bir özellik için geçerli olan durumla 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 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 çiftlerinden kaçınmak olduğundan dahil edilmiştir. Genellikle tek bir özelliğin birden fazla action_config arasında paylaşılması tercih edilir.
Aynı araç zincirinde aynı action_name ile birden fazla action_config tanımlayamazsınız. Bu, araç yollarındaki belirsizliği önler ve action_config ile amaçlanan şeyi (bir işlemin özelliklerinin araç zincirinde tek bir yerde net bir şekilde açıklanması) zorunlu kılar.
Araç oluşturucuyu kullanma
Biraction_config, tools parametresi aracılığıyla bir dizi araç belirtebilir.
tool() oluşturucusu aşağıdaki parametreleri alır:
| Alan | Açıklama | 
| path | Söz konusu araca giden yol (mevcut konuma göre). | 
| with_features | Bu aracın uygulanması için en az birinin karşılanması gereken özellik kümelerinin 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. Bir araç, action_config üzerinde tools özelliği yinelenerek seçilir. Özellik yapılandırmasıyla eşleşen bir with_feature kümesine sahip bir araç bulunana kadar bu işlem devam eder (Daha fazla bilgi için bu sayfanın önceki bölümlerinde yer alan Ö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, çeşitli platformlar arası semantiklerle Bazel işlemlerini uygulamak için birlikte kullanılabilir. Örneğin, macOS'te hata ayıklama sembolü oluşturma işlemi için derleme işleminde sembollerin 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 aracın çağrılması ve son olarak uygulama paketini ve Xcode tarafından kullanılabilen .plist dosyalarını oluşturmak için bu arşivin sıkıştırılmasının açılması gerekir.
Bazel ile bu süreç bunun yerine aşağıdaki gibi uygulanabilir. Burada 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 dosyaları oluşturan Windows için tamamen farklı şekilde uygulanabilir. Örneğin, fission tabanlı hata ayıklama simgesi oluşturma işlemi 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"],
                    ),
                ],
            ),
      ],
    ),
]
İşaret grupları
CcToolchainConfigInfo, işaretleri belirli bir amaca hizmet eden gruplar halinde paketlemenize olanak tanır. Derleyici, işareti derleme komutuna eklerken genişlettiği işaret değerinde önceden tanımlanmış değişkenleri kullanarak bir işaret belirtebilirsiniz. Örneğin:
flag_group (
    flags = ["%{output_execpath}"],
)
Bu durumda, işaretin içeriği işlemin çıkış dosya yoluyla değiştirilir.
İşaret grupları, listede göründükleri sıraya göre (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şletilir. Bir işaret grubu bildiriminin gövdesindeki tüm işaretler (veya flag_group) tek 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şletilir.
Bir değişken birden fazla kez tekrar edebilir. Ö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ılarla eşleşebilir. Ö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 olmak için alanlar aracılığıyla 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 özellikleri kullanılarak belirli bir değişkenin ya da alanının varlığına göre 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, C++ kurallarını başarıyla yapılandırmak için gereken derleme değişkenleri, özellikler ve diğer bilgilerle ilgili bir referans sunulmaktadır.
CcToolchainConfigInfo derleme değişkenleri
Aşağıda CcToolchainConfigInfo derleme değişkenlerinin 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 | Yayılan montaj dosyası. Yalnızca compileişlemi, genellikle--save_tempsişareti kullanılırken derleme metni yayınladığında geçerlidir. İçerikler,output_fileile aynıdır. | 
| output_preprocess_file | compile | Önceden işlenmiş çıktı. Yalnızca kaynak dosyaları önceden işleyen derleme işlemleri için geçerlidir. Bu işlemler genellikle --save_tempsişareti kullanılırken gerçekleştirilir. İçerikler,output_fileile aynıdır. | 
| includes | compile | Derleyicinin derlenmiş kaynağa koşulsuz olarak eklemesi gereken dosyaların sırası. | 
| include_paths | compile | Derleyicinin #include<foo.h>ve#include "foo.h"kullanılarak eklenen başlıkları aradığı dizinlerin sırası. | 
| quote_include_paths | compile | -iquotesırası şunları içerir:
       Derleyicinin#include "foo.h"kullanılarak eklenen başlıkları aradığı dizinler. | 
| system_include_paths | compile | -isystemsırası şunları içerir:
       Derleyicinin#include <foo.h>kullanılarak eklenen başlıkları aradığı dizinler. | 
| dependency_file | compile | Derleyici tarafından oluşturulan .dbağımlılık dosyası. | 
| preprocessor_defines | compile | definesdizisi (ör.--DDEBUG). | 
| pic | compile | Çıkışı konumdan bağımsız kod olarak derler. | 
| gcov_gcno_file | compile | gcovkapsam dosyası. | 
| per_object_debug_info_file | compile | Nesne başına hata ayıklama bilgileri ( .dwp) dosyası. | 
| stripotps | şerit | stripoptssırası. | 
| legacy_compile_flags | compile | Eski CROSSTOOLalanlarındaki (ör.compiler_flag,optional_compiler_flag,cxx_flagveoptional_cxx_flag) işaretlerin sırası. | 
| user_compile_flags | compile | coptkuralı özelliğinden veya--copt,--cxxoptve--conlyoptişaretlerinden gelen işaret dizisi. | 
| unfiltered_compile_flags | compile | unfiltered_cxx_flagEskiCROSSTOOLalanındaki veyaunfiltered_compile_flagsözelliğindeki işaretlerin sırası. Bunlarnocoptskural özelliğiyle filtrelenmez. | 
| sysroot | sysroot | |
| runtime_library_search_directories | bağlantı | Bağlayıcı çalışma zamanı arama yolundaki girişler (genellikle -rpathişaretiyle ayarlanır). | 
| library_search_directories | bağlantı | Bağlayıcı arama yolundaki girişler (genellikle -Liş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'da kullanılan def dosyasının konumu. | 
| linker_param_file | bağlantı | Komut satırı uzunluğu 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ının çı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ığı ifsooluşturma aracı için giriş. | 
| interface_library_output_path | bağlantı | ifsoOluşturucu aracı kullanılarak arayüz kitaplığının oluşturulacağı yol. | 
| legacy_link_flags | bağlantı | Eski CROSSTOOLalanlarından gelen bağlayıcı işaretleri. | 
| user_link_flags | bağlantı | --linkoptveyalinkoptsözelliğinden gelen bağlayıcı işaretleri. | 
| linkstamp_paths | bağlantı | Bağlantı zaman damgası yollarını 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` iletilmiştir). | 
| 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_testbağlantı oluşturma işlemiyse doğru, aksi takdirde yanlış. | 
| is_using_fission | derleme, bağlantı | Bu değişkenin varlığı, fisyonun (nesne başına hata ayıklama bilgileri) etkinleştirildiğini gösterir. Hata ayıklama bilgileri .odosyaları yerine.dwodosyalarında yer alır ve derleyici ile bağlayıcı bunu bilmelidir. | 
| fdo_instrument_path | derleme, 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. | 
Bilinen özellikler
Aşağıda, özelliklerin ve etkinleştirme koşullarının referansı verilmiştir.
| Özellik | Belgeler | 
| opt | dbg | fastbuild | Derleme moduna bağlı olarak varsayılan olarak etkindir. | 
| static_linking_mode | dynamic_linking_mode | Bağlama moduna bağlı olarak varsayılan olarak etkindir. | 
| per_object_debug_info | supports_fissionözelliği belirtilmişse ve etkinleştirilmişse ve geçerli derleme modu--fissionişaretinde belirtilmişse etkinleştirilir. | 
| supports_start_end_lib | Etkinleştirilirse (ve --start_end_libseçeneği ayarlanırsa) Bazel, statik kitaplıklara karşı bağlantı oluşturmaz ancak bunun yerine doğrudan nesnelere karşı bağlantı oluşturmak için--start-lib/--end-libbağlayıcı seçeneklerini kullanır. Bazel'in statik kitaplıklar oluşturması gerekmediğinden bu işlem derlemeyi hızlandırır. | 
| supports_interface_shared_libraries | Etkinleştirilirse (ve --interface_shared_objectsseçeneği ayarlanırsa) Bazel,linkstaticdeğeri False olarak ayarlanmış hedefleri (varsayılan olarakcc_test) arayüz paylaşılan kitaplıklarına bağlar. Bu sayede artımlı yeniden bağlama işlemi daha hızlı gerçekleşir. | 
| 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 bağlama modunda statik olarak, dinamik bağlama modunda ise dinamik olarak bağlar. cc_toolchain.static_runtime_libveyacc_toolchain.dynamic_runtime_libözelliğinde (bağlantı moduna bağlı olarak) belirtilen yapay nesneler, 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 bulunur. 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ğlama moduna bağlı olarak varsayılan olarak etkindir. | 
| no_legacy_features | Bazel'in, mevcut olduğunda C++ yapılandırmasına eski özellikler eklemesini engeller. Özelliklerin tam listesini aşağıda bulabilirsiniz. | 
Eski özellikler için yama 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.
- Araç zincirinin en üstüne dependency_file(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne pic(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne per_object_debug_info(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne preprocessor_defines(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne includes(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne include_paths(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne fdo_instrument(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne fdo_optimize(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne cs_fdo_instrument(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne cs_fdo_optimize(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne fdo_prefetch_hints(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne autofdo(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne build_interface_libraries(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne dynamic_library_linker_tool(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne shared_flag(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne linkstamps(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne output_execpath_flags(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne runtime_library_search_directories(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne library_search_directories(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne archiver_flags(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne libraries_to_link(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne force_pic_flags(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne user_link_flags(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne legacy_link_flags(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne static_libgcc(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne fission_support(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne strip_debug_symbols(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne coverage(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne llvm_coverage_map_format(yoksa) özelliğini ekler.
- Araç zincirinin en üstüne gcc_coverage_map_format(yoksa) özelliğini ekler.
- Araç zincirinin en altına fully_static_link(yoksa) özelliği ekler.
- Araç zincirinin en altına user_compile_flags(yoksa) özelliği ekler.
- Araç zincirinin en altına sysroot(yoksa) özelliği ekler.
- Araç zincirinin en altına unfiltered_compile_flags(yoksa) özelliği ekler.
- Araç zincirinin en altına linker_param_file(yoksa) özelliği ekler.
- Araç zincirinin en altına compiler_input_flags(yoksa) özelliği ekler.
- Araç zincirinin en altına compiler_output_flags(yoksa) özelliği ekler.
Bu, uzun bir özellik listesidir. Starlark'taki Crosstool tamamlandıktan sonra bu araçları kaldırmayı planlıyoruz. Meraklı okuyucular için CppActionConfigs'teki uygulamaya göz atın. Üretim araç zincirleri için ise araç zincirini daha bağımsız hale getirmek üzere no_legacy_features eklemeyi düşünebilirsiniz.