- Kullanım
- Önceden tanımlanmış değişkenler
- Önceden tanımlanmış genel değişkenler
- Önceden tanımlanmış kaynak/çıkış yolu değişkenleri
- Özelleştirilebilen değişkenler
"Marka" değişkenleri, "'Değişken yap" değişikliğine tabi" olarak işaretlenmiş özelliklerde kullanılabilen özel bir genişletilebilir dize değişkeni 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 de bağımlılık hedeflerinde tanımlanan ve yalnızca bunlara bağımlı hedefler tarafından kullanılabilen özel değişkenler sağlar.
"Yap" teriminin tarihinin nedeni eskidir: Bu değişkenlerin söz dizimi ve anlamı başlangıçta GNU Markası ile eşleşecek şekilde tasarlanmıştır.
Kullan
"'Değişken yap' değişikliğine tabi" olarak işaretlenmiş özellikler "Marka" değişkenine FOO
aşağıdaki gibi başvurabilir:
my_attr = "prefix $(FOO) suffix"
Başka bir deyişle, $(FOO)
ile eşleşen tüm alt dizeler FOO
değerine genişletilir. Bu değer "bar"
ise nihai dize şu şekilde olur:
my_attr = "prefix bar suffix"
FOO
, tüketen hedef tarafından bilinen bir değişkene karşılık gelmiyorsa Bazel, bir hatayla başarısız olur.
Adı @
gibi harf olmayan simge olan "Make" değişkenlerine, parantez olmadan yalnızca dolar işareti kullanılarak da referans verilebilir. Örneğin:
my_attr = "prefix $@ suffix"
$
öğesini düz dize değeri olarak yazmak (ör. değişken genişlemesini önlemek) için $$
yazın.
Önceden tanımlanmış değişkenler
Önceden tanımlanmış "Marka" değişkenlerine, herhangi bir hedefte "'Değişken yap" değişikliğine tabi" olarak işaretlenmiş herhangi bir özellik tarafından referans verilebilir.
Bu değişkenlerin listesini ve belirli bir derleme seçeneği kümesi için değerlerini görmek istiyorsanız aşağıdaki komutu çalıştırın:
bazel info --show_make_env [build options]
ve büyük harfle yazılmış en üstteki çıkış satırlarına bakın.
Önceden tanımlanmış değişkenlerle ilgili bir örneği inceleyin.
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 amacıyla, ana makine mimarisinde derleme sırasında çalışan programlar için farklı bir ağacın kullanılabileceğini unutmayın.
genrule
içinden bir araç çalıştırmak istiyorsanız aracın yolunu almak için önerilen yol$(execpath toolname)
şeklindedir. Burada araç adı,genrule
öğesinintools
özelliğinde listelenmelidir. GENDIR
: Hedef mimari için oluşturulan kod ağacının temeli.
Makine mimarisi değişkenleri
-
TARGET_CPU
: Hedef mimarinin CPU'su, ör.k8
.
Önceden tanımlanmış genel değişkenler
Aşağıdakiler, özellikle genrule
öğesinin cmd
özelliği için kullanılabilir ve bu özelliğin çalışması açısından genellikle önemlidir.
Önceden tanımlanmış genel değişkenlerle ilgili bir örneği inceleyin.
OUTS
:genrule
adlı grubunouts
listesi. Yalnızca bir çıkış dosyanız varsa$@
komutunu da kullanabilirsiniz.-
SRCS
:genrule
öğesininsrcs
listesi (veya daha kesin bir ifadeyle:srcs
listesindeki etiketlere karşılık gelen dosyaların yol adları). Yalnızca bir kaynak dosyanız varsa$<
öğesini de kullanabilirsiniz. -
<
: Tek bir dosyaysaSRCS
. Aksi takdirde bir derleme hatası tetiklenir. -
@
: Tek bir dosyaysaOUTS
. Aksi takdirde bir derleme hatası tetikler. -
RULEDIR
: Hedefin çıkış dizinidir.genfiles
veyabin
ağacı altında, hedefi içeren paketin adına karşılık gelen dizindir.//my/pkg:my_genrule
için bu,//my/pkg:my_genrule
çıktıları alt dizinlerde olsa bile her zamanmy/pkg
ile biter. -
@D
: Çıkış dizini. outs'ta bir giriş varsa bu giriş, ilgili dosyayı içeren dizine genişletilir. Dosyada birden fazla giriş varsa tüm çıkış dosyaları aynı alt dizinde olsa bile bu dize, paketingenfiles
ağacındaki kök dizinine genişletilir.Not:
RULEDIR
daha basit anlamlara sahip olduğundan ve çıkış dosyası sayısından bağımsız olarak aynı şekilde davrandığından@D
yerineRULEDIR
kullanın.Genrule'ın geçici ara dosyalar oluşturması gerekiyorsa (örneğin, derleyici gibi başka bir araç kullanılması nedeniyle) dosyaları
@D
içine yazmayı denemeli (ancak/tmp
de yazılabilir) ve bitirmeden önce bunları kaldırmalıdır.Özellikle giriş içeren dizinlere yazmaktan kaçının. Salt okunur dosya sistemlerinde olabilirler. Aksi takdirde, kaynak ağacı çöpe atılı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 dosyalar için bu, Workspace kök dosyanıza göre belirlenen yoldur. Kuralların çıktısı olan dosyalar için dosyanın çıkış yoludur (aşağıdaki çıkış dosyalarının açıklamasına bakın).
Önceden tanımlanmış yol değişkenleriyle ilgili bir örneği inceleyin.
-
execpath
: Bazel'in derleme işlemlerini çalıştırdığı execroot komutunun altındaki yolu belirtir.Yukarıdaki örnekte Bazel, Workspace kök dizininizde
bazel-myproject
sembolik bağlantısıyla bağlanan dizindeki tüm derleme işlemlerini çalıştırır.empty.source
kaynak dosyası,bazel-myproject/testapp/empty.source
yoluna bağlanmıştır. Yani yönetici yolu (kökün altındaki alt yol)testapp/empty.source
şeklindedir. Bu, derleme işlemlerinin dosyayı bulmak için kullanabileceği yoldur.Çıktı dosyaları benzer şekilde hazırlanır ancak aynı zamanda
bazel-out/cpu-compilation_mode/bin
alt yolunun (veyabazel-out/cpu-opt-exec-hash/bin
araçlarının çıkışları için) ön ek olarak eklenir. Yukarıdaki örnekte//testapp:app
,show_app_output
tools
özelliğinde göründüğü için bir araçtır. Bu durumda çıkış dosyasıapp
,bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
adresine yazılır. Dolayısıyla yönetici yolubazel-out/cpu-opt-exec-hash/bin/testapp/app
şeklindedir. Bu ek önek, sonuçların birbirini engellemesine gerek kalmadan aynı derlemedeki iki farklı CPU için aynı hedefi oluşturmayı mümkün kılar.Bu değişkene iletilen etiket tam olarak bir dosyayı temsil etmelidir. Bu, kaynak dosyaları temsil eden etiketler için otomatik olarak doğrudur. Kuralları temsil eden etiketler için kuralın tam olarak bir çıkış oluşturması gerekir. Bu değer yanlışsa veya etiket hatalıysa derleme bir hatayla başarısız olur.
-
rootpath
: Derlenen bir ikili programın, ana depoya karşılık gelen çalıştırma dosyaları dizininin alt dizinine göre çalışma zamanında bir bağımlılığı bulmak için kullanabileceği yolu belirtir. Not: Bu özellik yalnızca--enable_runfiles
etkinse çalışır. Bu durum, Windows'da varsayılan olarak geçerli değildir. Platformlar arası destek içinrlocationpath
kullanın.Bu,
execpath
özelliğine benzer ancak yukarıda açıklanan yapılandırma ön eklerini kaldırır. Yukarıdaki örnekte bu, hemempty.source
hem deapp
ürününün çalışma alanına bağlı yolları kullandığı anlamına gelir:testapp/empty.source
vetestapp/app
.repo
kimlikli harici depodaki bir dosyanınrootpath
öğesi,../repo/
ile başlar ve depoya bağlı yol izler.Bu kuruluş,
execpath
ile aynı "yalnızca bir çıkış" koşullarına sahiptir. -
rlocationpath
: Derlenen bir ikili programın, runfiles dizininde (varsa) veya runfiles manifestini kullanarak çalışma zamanında bir bağımlılık bulmak için runfiles kitaplığınınRlocation
işlevine geçirebileceği yol.Bu, yapılandırma ön eklerini içermemesi açısından
rootpath
ile benzerdir. Ancak her zaman deponun adıyla başlaması açısından farklıdır. Yukarıdaki örnekte bu,empty.source
veapp
değerlerinin şu yollarla sonuçlandığı anlamına gelir:myproject/testapp/empty.source
vemyproject/testapp/app
.repo
kimlikli harici depodaki bir dosyanınrlocationpath
öğesi,repo/
ile başlar ve depoya bağlı yol izler.Bu yolu, Runfiles kitaplıklarını kullanarak bir ikili programa iletmek ve dosya sistemi yoluna çözümlemek, çalışma zamanında bağımlılıkları bulmak için tercih edilen yaklaşımdır.
rootpath
ile karşılaştırıldığında, tüm platformlarda ve runfiles dizini kullanılamadığında bile çalışması avantajına sahiptir.Bu kuruluş,
execpath
ile aynı "yalnızca bir çıkış" koşullarına sahiptir. -
location
: Genişletilen özelliğe bağlı olarakexecpath
veyarootpath
ile eş anlamlıdır. Bu, Starlark'tan önceki eski davranıştır ve belirli bir kural için ne işe yaradığını gerçekten bilmiyorsanız önerilmez. Ayrıntılar için bkz. #2475.
execpaths
, rootpaths
, rlocationpaths
ve locations
, sırasıyla execpath
, rootpath
, rlocationpaths
velocation
kelimelerinin çoğul varyasyonlarıdır. Birden fazla çıkış üreten etiketleri desteklerler. Bu durumda her çıktı bir boşlukla ayrılmış olarak listelenir. Sıfır çıkış kuralları ve hatalı biçimlendirilmiş etiketler derleme hataları oluşturur.
Başvurulan tüm etiketler tüketen hedefin srcs
, çıkış dosyaları veya deps
öğesinde görünmelidir. Aksi takdirde derleme başarısız olur. C++ hedefleri, data
içindeki etiketlere de başvurabilir.
Etiketlerin standart biçimde olması gerekmez: foo
, :foo
ve //somepkg:foo
.
Özelleştirilebilen değişkenler
Özel "Marka" değişkenlerine, "'Değişken yap" değişikliğine tabi" olarak işaretlenmiş herhangi bir özellik tarafından referans verilebilir, ancak bu değişken yalnızca bu değişkenleri tanımlayan diğer hedeflere bağlı olan hedeflerde kullanılabilir.
En iyi uygulama olarak, temel Bazel'in kapsamına almak için iyi bir neden olmadığı sürece tüm değişkenler özel olmalıdır. Bu sayede Bazel, tüketen taret'lerin önemsemeyeceği değişkenler sağlamak için pahalı olabilecek bağımlılıkları yüklemek zorunda kalmaz.
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"]
ayarlayan tüm kurallarda kullanılabilir. java_binary
gibi bazı kurallar, kural tanımlarına dolaylı olarak C++ araç zincirini dahil eder. Bu değişkenleri otomatik olarak devralırlar.
Yerleşik C++ kuralları, "üzerinde derleyiciyi çalıştırma" kuralından çok daha karmaşıktır. Yerleşik kurallar; *SAN ve ThinLTO gibi çeşitli derleme modlarını (modüllü/modül olmadan) ve birden fazla platformda hızlı çalışan testlerle aynı anda dikkatlice optimize edilmiş ikili programları desteklemek için, dahili olarak oluşturulmuş olabilecek birden fazla işlemin her birinde doğru girişlerin, çıkışların ve komut satırı işaretlerinin ayarlanmasını sağlamak amacıyla gereken tüm imkanları sunar.
Bu değişkenler, dil uzmanları tarafından nadir durumlarda kullanılacak bir yedek mekanizmadır. Bu araçları kullanmak isterseniz lütfen önce Bazel geliştiricilerinle iletişim kurun.
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.CC_FLAGS
hizmetini her zamanCC
ile birlikte kullanmanızı önemle tavsiye ederiz. Aksi takdirde tüm risk size aittir. CC_FLAGS
: C/C++ derleyicinin Genrules tarafından kullanılabilmesi için gereken minimum işaret grubu. Özellikle deCC
birden fazla mimariyi destekliyorsa doğru mimariyi seçmeniz için işaretler yer alır.-
NM
: Crosstool'daki "nm" komutu. -
OBJCOPY
: C/C++ derleyiciyle aynı pakette bulunan objcopy komutu. -
STRIP
: C/C++ derleyiciyle aynı paketteki Strip komutu.
Java araç zinciri değişkenleri
Aşağıdakiler, Java araç zinciri kurallarında tanımlanmıştı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"
) değerini 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 paketleme için yukarı akış araçlarının ifade edebileceğinden çok daha gelişmiş yaklaşımlar kullanır. Bunlara örnek olarak arayüz Kavanozları, başlık arayüzü Kavanozları, yüksek düzeyde optimize edilmiş Jar paketleme ve birleştirme uygulamaları gösterilebilir.
Bu değişkenler, dil uzmanları tarafından nadir durumlarda kullanılacak bir yedek mekanizmadır. Bu araçları kullanmak isterseniz lütfen önce Bazel geliştiricilerinle iletişim kurun.
-
JAVA
: "Java" komutu (bir Java sanal makinesi). Bundan kaçının ve mümkünse bunun yerinejava_binary
kuralı kullanın. Göreli bir yol olabilir.java
komutunu ç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. "bin" alt dizini olur.
Starlark tarafından tanımlanan değişkenler
Kural ve araç zinciri yazarları, TemplateVariableInfo sağlayıcı döndürerek tamamen özelleştirilebilen değişkenler tanımlayabilir. Böylece, toolchains
özelliği aracılığıyla bunlara bağlı olan tüm kurallar değerlerini okuyabilir:
Starlark tarafından tanımlanan değişkenlerle ilgili bir örneğe bakın.