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 gibi gerekli araçların yolları.
- Yerleşik sistem dizinleri içerir. 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ğlama, 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. Bazel, varsayılan olarak CcToolchainConfigInfo
'ü derlemeniz için otomatik olarak yapılandırır ancak 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()
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.
Bir C++ hedefi analiz aşamasına girdiğ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ıyı alır. 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ı taşları dışındaki tüm bilgiler, cc_toolchain
öğesinin işaret ettiği Starlark hedefinde belirtilir.
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:
Kullanıcı,
BUILD
dosyasında bircc_toolchain_suite
hedefi belirtir ve--crosstool_top
seçeneğini kullanarak Bazel'i hedefe yönlendirir.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
ilecc_toolchain_suite.toolchains
özelliğindeki ilgili girişi seçer. Bazel, karşılık gelen bir giriş bulamazsa hata verir.--compiler
seçeneği belirtilmezse Bazel, yalnızca--cpu
ilecc_toolchain_suite.toolchains
özelliğinden ilgili girişi seçer.Herhangi 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 fazla 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 veya C++ kurallarıyla etkileşime girmesine ve derlemeye yeni derleme işlemleri ve girişler (ör. header_modules
veya thin_lto
) eklemesine izin vermek kadar basit 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. Diğer bir deyişle, Bazel sürümü, bu 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 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 veyafeatures
kural özelliği aracılığıyla bu özelliği 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ına özgü anlaşmazlıkları yönetir. Araç zinciri spesifikasyonu, doğrudan özellik desteğini ve genişletmesini 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ıt | Açıklama |
requires = [ feature_set (features = [ 'feature-name-1', 'feature-name-2' ]), ] |
Özellik düzeyinde. Bu özellik yalnızca belirtilen gerekli özelliklerin etkin olması durumunda 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, bir dizi özellikten (ör. dezenfektanların ortak parçaları) ortak işlev alt kümelerini çıkarabilme olanağı da sağlar. Varsayılan ö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 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üzeyi. 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şleme 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 tek bir işlem türünü (ör. derleme veya bağlama) 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çin kullanılır.
|
assemble
|
Önceden işleme olmadan birleştirin. Genellikle .s dosyaları için kullanılır.
|
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. |
Bağlantı işlemleri
İşlem | Açıklama |
c++-link-dynamic-library
|
Tüm bağımlılıkları içeren bir paylaşılan kitaplığı bağlayın. |
c++-link-nodeps-dynamic-library
|
Yalnızca cc_library kaynakları içeren bir paylaşılan kitaplığı bağlayın.
|
c++-link-executable
|
Çalıştırılmaya hazır nihai kitaplığı bağlayın. |
AR işlemleri
AR işlemleri, nesne dosyalarını ar
aracılığıyla arşiv kitaplıklarında (.a
dosyaları) bir araya getirir 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 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 işlemin karşılık geldiği Bazel işlemi. 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ğe 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ği birden fazla action_config
ile paylaşmak 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 açıkça 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 |
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 bir with_feature
kümesi içeren bir araç bulunana kadar bir action_config
üzerindeki tools
özelliğinde iterasyon yapılarak bir araç seçilir (daha fazla bilgi için bu sayfanın başları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 bitirmeniz gerekir.
Örnek kullanım
Bazel işlemlerini farklı platformlar arası anlamlarla uygulamak için özellikler ve işlemler 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 ardından uygulama paketini ve Xcode tarafından kullanılabilen .plist
dosyalarını oluşturmak için bu arşivin sıkıştırmasının kaldırılması gerekir.
Bazel'de bu işlem, 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 (
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ç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(
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 toplamanı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_execpath}"],
)
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şkenleri 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 derleme metni yayınladığında (genellikle --save_temps işaretçisi kullanıldığında) geçerlidir. İçerikler 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 dahil edilen başlıkları aradığı dizin sırası.
|
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 gelen 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ğlantı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ı 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ğ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şturucu 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.
|
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 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
|
derleme, bağlantı | FDO enstrümantasyon profilini depolayan dizinin yolu. |
fdo_profile_path
|
compile | FDO profiline giden yol. |
fdo_prefetch_hints_path
|
compile | Önbelleğe ö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 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 geçerli derleme modu --fission işaretinde belirtilirse 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. Bazel'in statik kitaplıklar oluşturması gerekmediğinden bu, derlemeyi hızlandırır.
|
supports_interface_shared_libraries
|
Etkinleştirilirse (ve --interface_shared_objects seçeneği ayarlanırsa) Bazel, linkstatic değerinin Yanlış (varsayılan olarak cc_test ) olarak ayarlandığı hedefleri arayüz paylaşılan kitaplıklarına bağlar. Bu sayede artımlı yeniden bağlantı 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ğ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ç seti, 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şırdefault_compile_flags
özelliğini araç zincirinin en üstüne taşırdependency_file
(varsa) özelliğini araç zincirinin başına eklerpic
(varsa) özelliğini araç zincirinin başına eklerper_object_debug_info
(varsa) özelliğini araç zincirinin başına eklerpreprocessor_defines
(varsa) özelliğini araç zincirinin başına eklerincludes
(varsa) özelliğini araç zincirinin başına eklerinclude_paths
(varsa) özelliğini araç zincirinin başına eklerfdo_instrument
(varsa) özelliğini araç zincirinin başına eklerfdo_optimize
(varsa) özelliğini araç zincirinin başına eklercs_fdo_instrument
(varsa) özelliğini araç zincirinin başına eklercs_fdo_optimize
(varsa) özelliğini araç zincirinin başına eklerfdo_prefetch_hints
(varsa) özelliğini araç zincirinin başına eklerautofdo
(varsa) özelliğini araç zincirinin başına eklerbuild_interface_libraries
(varsa) özelliğini araç zincirinin başına eklerdynamic_library_linker_tool
(varsa) özelliğini araç zincirinin başına eklershared_flag
(varsa) özelliğini araç zincirinin başına eklerlinkstamps
(varsa) özelliğini araç zincirinin başına ekleroutput_execpath_flags
(varsa) özelliğini araç zincirinin başına eklerruntime_library_search_directories
(varsa) özelliğini araç zincirinin başına eklerlibrary_search_directories
(varsa) özelliğini araç zincirinin başına eklerarchiver_flags
(varsa) özelliğini araç zincirinin başına eklerlibraries_to_link
(varsa) özelliğini araç zincirinin başına eklerforce_pic_flags
(varsa) özelliğini araç zincirinin başına ekleruser_link_flags
(varsa) özelliğini araç zincirinin başına eklerlegacy_link_flags
(varsa) özelliğini araç zincirinin başına eklerstatic_libgcc
(varsa) özelliğini araç zincirinin başına eklerfission_support
(varsa) özelliğini araç zincirinin başına eklerstrip_debug_symbols
(varsa) özelliğini araç zincirinin başına eklercoverage
(varsa) özelliğini araç zincirinin başına eklerllvm_coverage_map_format
(varsa) özelliğini araç zincirinin başına eklergcc_coverage_map_format
(varsa) özelliğini araç zincirinin başına eklerfully_static_link
(varsa) özelliğini araç zincirinin alt kısmına ekleruser_compile_flags
(varsa) özelliğini araç zincirinin alt kısmına eklersysroot
(varsa) özelliğini araç zincirinin alt kısmına eklerunfiltered_compile_flags
(varsa) özelliğini araç zincirinin alt kısmına eklerlinker_param_file
(varsa) özelliğini araç zincirinin alt kısmına eklercompiler_input_flags
(varsa) özelliğini araç zincirinin alt kısmına eklercompiler_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.