- Kullan
- Önceden tanımlanmış değişkenler
- Önceden tanımlanmış ithal değişkenler
- Önceden tanımlanmış kaynak/çıkış yolu değişkenleri
- Özelleştirilebilen değişkenler
"Oluştur" değişkenleri, "Değişken oluştur" yerine geçer olarak işaretlenen özellikler için kullanılabilen özel bir genişletilebilir dize değişkenleri sınıfıdır.
Bunlar, örneğin kullanıcı tarafından oluşturulan derleme işlemlerine belirli araç zinciri yolları eklemek için kullanılabilir.
Bazel hem tüm hedeflerde kullanılabilen önceden tanımlanmış değişkenler hem bağımlı hedeflerde tanımlanıp yalnızca bunlara bağımlı hedefler için kullanılabilen özel değişkenler sağlar.
"Marka" teriminin nedeni geçmiştir: Bu değişkenlerin söz dizimi ve anlamları, başlangıçta GNU Make ile eşleşecektir.
Kullanım
""Değişken oluştur" yerine geçer" olarak işaretlenen özellikler, "Marka" değişkenine FOO
aşağıdaki gibi başvurabilir:
my_attr = "prefix $(FOO) suffix"
Diğer bir deyişle, $(FOO)
ile eşleşen tüm alt dizeler FOO
değerine genişler. Bu değer "bar"
ise son dize şöyle olur:
my_attr = "prefix bar suffix"
FOO
, tüketen hedef olarak bilinen bir değişkene karşılık gelmiyorsa Bazel hata vererek başarısız olur.
Adlarında harf olmayan simgeler (ör. @
) içeren "Marka" değişkenlerine, parantez işareti olmadan yalnızca dolar işareti kullanılarak da referans verilebilir. Örneğin:
my_attr = "prefix $@ suffix"
Dize değişmez değeri olarak (değişken genişlemesini önlemek için) $
yazmak için $$
yazın.
Önceden tanımlanmış değişkenler
Önceden tanımlanmış "Marka" değişkenlerine, herhangi bir hedefte ""Değişken oluştur" değişikliği" olarak işaretlenen herhangi bir özellik tarafından referans verilebilir.
Bu değişkenlerin listesini ve belirli bir derleme seçenekleri grubu için değerlerini görmek isterseniz
bazel info --show_make_env [build options]
üst harfleri büyük harfle yazın.
Önceden tanımlanmış değişkenler örneğine bakın.
Araç zinciri seçenek değişkenleri
COMPILATION_MODE
:fastbuild
,dbg
veyaopt
. (daha fazla bilgi)
Yol değişkenleri
-
BINDIR
: Hedef mimari için oluşturulan ikili ağacın tabanı.Çapraz derlemeyi desteklemek için, derleme mimarisinde ana makine mimarisinde çalışan programlar için farklı bir ağaç kullanılabilir.
genrule
içinden bir araç çalıştırmak istiyorsanız tercih edilen yolu$(execpath toolname)
bulabilirsiniz. Bu durumda araç adı,genrule
içindekitools
özelliğinde listelenmelidir. GENDIR
: Hedef mimari için oluşturulan kod ağacının tabanı.
Makine mimarisi değişkenleri
-
TARGET_CPU
: Hedef mimarinin CPU'su, ör.k8
.
Önceden tanımlanmış kafes değişkenleri
Aşağıdakiler, genrule
cmd
özelinde özellikle kullanılabilir ve bu özelliğin çalışması için genellikle önemlidir.
Önceden tanımlanmış davet değişkenleri örneğine bakın.
OUTS
:genrule
listesininouts
listesi. Yalnızca bir çıkış dosyanız varsa$@
öğesini de kullanabilirsiniz.-
SRCS
:genrule
öğesininsrcs
listesi (veya daha doğrusu:srcs
listesindeki etiketlere karşılık gelen dosyaların yol adları). Tek bir kaynak dosyanız varsa$<
dosyasını da kullanabilirsiniz. -
<
: Tek bir dosyaysaSRCS
. Aksi takdirde derleme hatası tetiklenir. -
@
: Tek bir dosyaysaOUTS
. Aksi takdirde derleme hatası tetiklenir. -
RULEDIR
: Hedefin çıkış dizini, yanigenfiles
veyabin
ağacının altında hedefi içeren paketin adına karşılık gelen dizin.//my/pkg:my_genrule
çıktıları alt dizinlerde olsa bile//my/pkg:my_genrule
için bu her zamanmy/pkg
ile biter. -
@D
: Çıkış dizini. outs'un tek bir girişi varsa bu dosya, ilgili dosyayı içeren dizine genişler. Birden fazla girişi varsa bu, tüm çıkış dosyaları aynı alt dizinde olsa bilegenfiles
ağacında paketin kök dizinine genişler.Not:
RULEDIR
işlevi, daha basit anlamlara sahip olduğu ve çıkış dosyalarının sayısından bağımsız olarak aynı şekilde davranacağı için@D
yerineRULEDIR
kullanın.Bölgenin geçici ara dosyalar oluşturması gerekiyorsa (örneğin, derleyici gibi başka bir araç kullanılması sonucunda) bu dosyaları
@D
alanına yazmaya çalışmalıdır (ancak/tmp
yazılabilir olsa da) ve tamamlamadan önce dosyaları kaldırmalıdır.Özellikle giriş içeren dizinlere yazmaktan kaçının. Bu dosyalar salt okunur dosya sistemlerinde olabilir. Aksi takdirde kaynak ağaç çöp kutusuna taşınır.
Önceden tanımlanmış kaynak/çıkış yolu değişkenleri
Önceden tanımlanmış execpath
, execpaths
,
rootpath
, rootpaths
, location
ve locations
değişkenleri etiket parametrelerini (ör. $(execpath
//foo:bar)
) alır ve bu etiketle belirtilen dosya yollarını değiştirir.
Kaynak dosyalarda bu, çalışma alanı kökünüze göre sağlanan yoldur. Kural çıkışı olan dosyalar için bu, dosyanın çıkış yolu'dur (aşağıdaki çıkış dosyalarının açıklamasına bakın).
Önceden tanımlanmış yol değişkenleri örneğine göz atın.
-
execpath
: Bazel'ın derleme işlemleri çalıştırdığı execroot öğesinin altındaki yolu gösterir.Yukarıdaki örnekte Bazel, çalışma alanı kökünüzdeki
bazel-myproject
sembol bağlantısıyla bağlı dizindeki tüm derleme işlemlerini çalıştırır.empty.source
kaynak dosyası,bazel-myproject/testapp/empty.source
yolunda bağlandı. Dolayısıyla, yürütme yolu (kökün altındaki alt yoldur)testapp/empty.source
şeklindedir. Bu, derleme işlemlerinin dosyayı bulmak için kullanabileceği yoldur.Çıkış dosyaları da benzer şekilde düzenlenir ancak ön ek olarak
bazel-out/cpu-compilation_mode/bin
alt yolu (veya araçların çıkışları içinbazel-out/cpu-opt-exec-hash/bin
) ön eki kullanılır. Yukarıdaki örnekte//testapp:app
,show_app_output
öğesinintools
özelliğinde göründüğü için bir araçtır. Bu nedenle,app
çıkış dosyasıbazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
diline yazılır. Bu nedenle, yürütme yolubazel-out/cpu-opt-exec-hash/bin/testapp/app
şeklindedir. Bu ekstra önek, aynı derlemede iki farklı CPU için aynı hedefi birleştirmeyi mümkün kılar ve sonuçlar birbirine karışmaz.Bu değişkene iletilen etiket, tam olarak bir dosyayı temsil etmelidir. Kaynak dosyaları temsil eden etiketler için bu durum otomatik olarak geçerlidir. Kuralları temsil eden etiketler için kuralın tam olarak bir çıkışı oluşturması gerekir. Bu yanlışsa veya etiket hatalı biçimlendirilmişse hata vererek derleme başarısız olur.
-
rootpath
: Derlenen bir ikili programın ana dosya deposuna karşılık gelen Runfiles dizininin alt dizinine göre çalışma zamanında bir bağımlı bulmak için kullanabileceği yolu belirtir. Not: Bu özellik yalnızca Windows'da varsayılan olarak geçerli olmasa da--enable_runfiles
etkinse çalışır. Platformlar arası destek için bunun yerinerlocationpath
kullanın.Bu
execpath
öğesine benzer ancak yukarıda açıklanan yapılandırma öneklerini çıkarır. Yukarıdaki örnekte hemempty.source
hem deapp
, çalışma alanına özgü yollardan faydalanır:testapp/empty.source
vetestapp/app
.Harici bir depodaki bir dosyanın
rootpath
repo
,../repo/
ile başlar ve ardından depoya bağlı yol gelir.Bu politika,
execpath
ile aynı "yalnızca bir çıkış" koşuluna sahiptir. -
rlocationpath
: Yerleşik bir ikili programın, Runfiles dizininde (varsa) veya Runfiles manifestini kullanarak çalışma zamanında bir bağımlılık bulmak için Runfile kitaplığınınRlocation
işlevine iletebileceği yol.rootpath
ön ekinin olması, yapılandırma ön ekleri içermemesi ancak her zaman deponun adıyla başlaması açısından farklıdır. Yukarıdaki örnekte bu,empty.source
veapp
kodlarının şu yollara yol açtığı anlamına gelir:myproject/testapp/empty.source
vemyproject/testapp/app
.Harici bir depodaki bir dosyanın
rlocationpath
repo
,repo/
ile başlar ve ardından depoya bağlı yol gelir.Çalışma zamanında bağımlıları bulmak için tercih edilen yaklaşım, bu yolu bir ikili programa iletmek ve Runfile kitaplıklarını kullanarak bir dosya sistemi yoluna çözümlemektir.
rootpath
ile karşılaştırıldığında, tüm dosyalarda ve Runfiles dizini kullanılamadığında bile çalışma avantajına sahiptir.Bu politika,
execpath
ile aynı "yalnızca bir çıkış" koşuluna sahiptir. -
location
: Genişletilen özelliğe bağlı olarakexecpath
veyarootpath
için eş anlamlıdır. Bu, eski Starlark davranışıdır ve belirli bir kural için ne işe yaradığını gerçekten bilmiyorsanız önerilmez. Ayrıntılar için #2475 bölümüne bakın.
execpaths
, rootpaths
, rlocationpaths
ve locations
, sırasıyla execpath
, rootpath
, rlocationpaths
ve location
'nın çoğul varyasyonlarıdır. Birden fazla çıkış oluşturan etiketleri desteklerler. Bu durumda, her çıkış bir boşlukla ayrılmış olarak listelenir. Sıfır çıkış kuralları ve hatalı biçimlendirilmiş etiketler derleme hataları üretir.
Başvurulan tüm etiketler, tüketen hedefin srcs
, çıkış dosyalarında veya deps
'de görünmelidir. Aksi takdirde derleme başarısız olur. C++ hedefleri, data
içindeki etiketlere da başvurabilir.
Etiketlerin standart biçimde olması gerekmez: foo
, :foo
ve //somepkg:foo
herhangi bir sorun oluşturmaz.
Özelleştirilebilen değişkenler
Özel "Marka" değişkenlerine, "Değişken oluştur" yerine kullanılabilir" verilebilir. Ancak bu değişkenleri, tanımlayan diğer hedeflere bağlı olan hedeflerde kullanabilirsiniz.
En iyi uygulama, temel Bazel'da pişirilmesi için gerçekten iyi bir neden olmadığı sürece tüm değişkenlerin özel olması gerekir. Böylece, Bazel'ın taret tüketen değişkenleri önemsemeyeceği değişkenleri sağlamak için pahalı olabilecek bağımlılıkları yüklemek zorunda kalmaması sağlanıyor.
C++ araç zinciri değişkenleri
Aşağıdakiler, C++ araç zinciri kurallarında tanımlanır ve toolchains =
["@bazel_tools//tools/cpp:current_cc_toolchain"]
(veya ana makine araç zinciri eşdeğeri için "@bazel_tools//tools/cpp:current_cc_host_toolchain"
) ayarlayan tüm kurallar tarafından kullanılabilir. java_binary
gibi bazı kurallar, kural tanımlarına dolaylı olarak C++ araç zincirini de ekler. Bu değişkenleri otomatik olarak devralır.
Yerleşik C++ kuralları "derleyiciyi çalıştırmak"tan çok daha karmaşıktır. *SAN, ThinLTO gibi modüller içeren/olmayan derleme modlarını ve birden fazla platformda hızlı çalışan testlerle aynı zamanda dikkatlice optimize edilmiş ikili programları desteklemek amacıyla, yerleşik kurallar, dahili olarak oluşturulan ve bağımsız olarak gerçekleştirilen her işlemin doğru giriş, çıkış ve komut satırı işaretlerinin ayarlandığından emin olmak için elimizden gelenin en iyisini yapar.
Bu değişkenler, nadir durumlarda dil uzmanları tarafından kullanılan bir yedek mekanizmadır. Bunları kullanmak istiyorsanız lütfen önce Bael devleriyle iletişime geçin.
ABI
: C++ ABI sürümü.-
AR
: Crosstool'daki "ar" komutu. -
C_COMPILER
: C/C++ derleyici tanımlayıcısı, ör.llvm
. -
CC
: C ve C++ derleyici komutu.Her zaman
CC
ile birlikteCC_FLAGS
kullanmanızı önemle tavsiye ederiz. Bunu yapma riski size aittir. CC_FLAGS
: C/C++ derleyicinin genel kurallar tarafından kullanılabilmesi için en az bir işaret grubudur. Bu, özellikleCC
birden fazla mimariyi destekliyorsa doğru mimariyi seçecek işaretleri içerir.-
NM
: Crosstool'daki "nm" komutu. -
OBJCOPY
: C/C++ derleyiciyle aynı paketten objcopy komutu. -
STRIP
: C/C++ derleyiciyle aynı pakette bulunan strip komutu.
Java araç zinciri değişkenleri
Aşağıdakiler, Java araç zinciri kurallarında tanımlanır ve toolchains =
["@bazel_tools//tools/jdk:current_java_runtime"]
(veya ana makine araç zinciri eşdeğeri için "@bazel_tools//tools/jdk:current_host_java_runtime"
) ayarlayan tüm kurallar tarafından kullanılabilir.
JDK'daki araçların çoğu doğrudan kullanılmamalıdır. Yerleşik Java kuralları, Java derleme ve paketlemeye yönelik, üst düzey araçların (ör. arayüz Jars, başlık arayüzü Jars ve son derece optimize edilmiş Jar paketleme ve birleştirme uygulamaları) ifade edebileceğinden çok daha gelişmiş yaklaşımlar kullanır.
Bu değişkenler, nadir durumlarda dil uzmanları tarafından kullanılan bir yedek mekanizmadır. Bunları kullanmak istiyorsanız lütfen önce Bael devleriyle iletişime geçin.
-
JAVA
: "Java" komutu (Java sanal makinesi). Bu durumdan kaçının ve mümkünse birjava_binary
kuralı kullanın. Göreli bir yol olabilir.java
çağırmadan önce dizinleri değiştirmeniz gerekiyorsa, çalışma dizinini değiştirmeden önce yakalamanız gerekir. JAVABASE
: Java yardımcı programlarını içeren temel dizin. Göreli bir yol olabilir. Bir "bin" alt dizini olacaktır.
Starlark tarafından tanımlanan değişkenler
Kural ve araç zinciri yazarları, bir TemplateVariableInfo sağlayıcısı döndürerek tamamen özelleştirilebilen değişkenler tanımlayabilir. Daha sonra, toolchains
özelliği aracılığıyla bunlara bağlı kurallar, değerlerini okuyabilir: