- Kullanım
- Önceden tanımlanmış değişkenler
- Önceden tanımlanmış genrule değişkenleri
- Önceden tanımlanmış kaynak/çıkış yolu değişkenleri
- Özelleştirilebilen değişkenler
"Make" değişkenleri, "'Değişken değiştirme' değişikliğine tabi" olarak işaretlenmiş özellikler tarafından kullanılabilen özel 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 de bağımlılık hedeflerinde tanımlanan ve yalnızca bunlara bağlı olan hedefler tarafından kullanılabilen özel değişkenler sağlar.
"Make" teriminin nedeni geçmişe dönüktür: Bu değişkenlerin söz dizimi ve anlamları başlangıçta GNU Make ile eşleşecek şekilde tasarlanmıştır.
Kullan
"'Değişken değiştirme' değişikliğine tabi" olarak işaretlenen özellikler, "Yapma" değişkenine FOO
aşağıdaki gibi referans verebilir:
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 son dize şu şekilde olur:
my_attr = "prefix bar suffix"
FOO
, tüketici hedefi tarafından bilinen bir değişkene karşılık gelmezse Bazel bir hatayla başarısız olur.
Adları harf olmayan simgelerden (@
gibi) oluşan "Make" değişkenlerine, parantez olmadan yalnızca dolar işareti kullanılarak da referans verilebilir. Örneğin:
my_attr = "prefix $@ suffix"
$
değerini dize sabit değeri olarak yazmak (değişken genişletmesini önlemek için) $$
yazın.
Önceden tanımlanmış değişkenler
Önceden tanımlanmış "Marka" değişkenlerine, herhangi bir hedefte "'Değişkenin değiştirilmesine tabi" olarak işaretlenmiş herhangi bir özellik tarafından referans verilebilir.
Bu değişkenlerin listesini ve belirli bir derleme seçeneği grubu için değerlerini görmek üzere
bazel info --show_make_env [build options]
ve büyük harfle en üst çıkış satırlarına bakın.
Önceden tanımlanmış değişkenler örneğini inceleyin.
Araç zinciri seçeneği değişkenleri
COMPILATION_MODE
:fastbuild
,dbg
veyaopt
. (diğer ayrıntılar)
Yol değişkenleri
-
BINDIR
: Hedef mimari için oluşturulan ikili ağacın tabanı.Çapraz derlemeyi desteklemek amacıyla, ana makine mimarisi üzerinde derleme sırasında çalışan programlar için farklı bir ağacın kullanılabileceğini unutmayın.
Bir aracı
genrule
içinden ç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 tabanı.
Makine mimarisi değişkenleri
-
TARGET_CPU
: Hedef mimarinin CPU'su, ör.k8
.
Önceden tanımlanmış genrule değişkenleri
Aşağıdakiler genrule
'in cmd
özelliği için özel olarak kullanılabilir ve genellikle bu özelliğin çalışması için önemlidir.
Önceden tanımlanmış genrule değişkenleri örneğini inceleyin.
OUTS
:genrule
adlı kullanıcınınouts
listesi. Yalnızca bir çıkış dosyanız varsa$@
politikasını da kullanabilirsiniz.-
SRCS
:genrule
'insrcs
listesi (veya daha kesin belirtmek gerekirse:srcs
listesindeki etiketlere karşılık gelen dosyaların yol adları). Tek bir kaynak dosyanız varsa$<
öğesini de kullanabilirsiniz. -
<
:SRCS
(tek bir dosyaysa). Aksi takdirde derleme hatası tetiklenir. -
@
:OUTS
(tek bir dosyaysa). Aksi takdirde derleme hatası tetiklenir. -
RULEDIR
: Hedefin çıkış dizini. Bir başka deyişle,genfiles
veyabin
ağacının altında hedefi içeren paketin adına karşılık gelen dizindir.//my/pkg:my_genrule
çıktıları alt dizinlerde olsa bile//my/pkg:my_genrule
için bu her zamanmy/pkg
ile sona erer. -
@D
: Çıkış dizini. outs'ta bir giriş varsa bu giriş, ilgili dosyayı içeren dizine genişler. Birden fazla giriş varsa tüm çıkış dosyaları aynı alt dizinde olsa bilegenfiles
ağacında paketin kök dizinine genişletilir.Not:
RULEDIR
daha basit semantiklere sahip olduğundan ve çıkış dosyası sayısından bağımsız olarak aynı şekilde davrandığından@D
yerineRULEDIR
kullanın.genrule'un geçici ara dosyalar oluşturması gerekiyorsa (örneğin, derleyici gibi başka bir araç kullanmanın sonucunda), bunları
@D
öğesine yazmayı denemelidir (ancak/tmp
de yazılabilir olabilir) ve bitirmeden önce bunları kaldırmalıdır.Özellikle giriş içeren dizinlere yazmaktan kaçının. Salt okunur dosya sistemlerinde olabilirler. Aksi halde, bu işlem kaynak ağacını çöp kutusuna taşı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 çalışma alanı kök dizininizle göreli 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şkenleri örneğini inceleyin.
-
execpath
: execroot'un altında Bazel'ın derleme işlemlerini çalıştırdığı yolu belirtir.Yukarıdaki örnekte Bazel, çalışma alanı kök dizininizdeki
bazel-myproject
sembolik 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ğlı. Dolayısıyla exec 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ı da benzer şekilde hazırlanır ancak aynı zamanda
bazel-out/cpu-compilation_mode/bin
alt yolunun (veya araçların çıkışlarının) ön ekine sahiptir. Yukarıdaki örnekte//testapp:app
,show_app_output
tools
özelliğinde göründüğü için bir araçtır.bazel-out/cpu-opt-exec-hash/bin
Dolayısıyla, çıkış dosyasıapp
bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
diline yazılır. Dolayısıyla, exec yolubazel-out/cpu-opt-exec-hash/bin/testapp/app
şeklindedir. Bu ekstra ön ek, örneğin aynı derlemedeki iki farklı CPU için aynı hedefin derlenmesini sağlar. Sonuçlar birbirini bozmaz.Bu değişkene iletilen etiket tam olarak bir dosyayı temsil etmelidir. Kaynak dosyaları temsil eden etiketler için bu otomatik olarak doğrudur. Kuralları temsil eden etiketler için kuralın tam olarak bir adet çıkış oluşturması gerekir. Bu yanlışsa veya etiket hatalı biçimlendirilmişse derleme bir hatayla başarısız olur.
-
rootpath
: Derlenen bir ikili programın, ana depoya karşılık gelen runfiles dizininin alt dizinine göre çalışma zamanında bir bağımlılık bulmak için kullanabileceği yolu belirtir. Not: Bu işlem yalnızca--enable_runfiles
etkinleştirilmişse çalışır. Varsayılan olarak Windows'da geçerli değildir. Platformlar arası destek için bunun yerinerlocationpath
kullanın.Bu,
execpath
özelliğine benzer ancak yukarıda açıklanan yapılandırma ön eklerini çıkarır. Yukarıdaki örnekte bu, hemempty.source
hem deapp
'nin sadece çalışma alanına bağlı yolları kullandığı anlamına gelir:testapp/empty.source
vetestapp/app
.Harici
repo
deposundaki dosyanınrootpath
alanı../repo/
ile başlar ve depoya bağlı yol ile devam eder.Bu özellik,
execpath
ile aynı "yalnızca bir çıkış" şartlarına sahiptir. -
rlocationpath
: Derlenen bir ikili programın, çalışma zamanında runfiles dizininde (varsa) veya runfiles manifestini kullanarak bir bağımlılık bulmak için runfiles kitaplığınınRlocation
işlevine iletebileceği yol.Bu, yapılandırma ön eki içermemesiyle birlikte her zaman deponun adıyla başlamasıyla
rootpath
ile benzerdir. Yukarıdaki örnekte bu,empty.source
veapp
'nin şu yollarla sonuçlandığı anlamına gelir:myproject/testapp/empty.source
vemyproject/testapp/app
.Harici
repo
deposundaki dosyanınrlocationpath
alanırepo/
ile başlar ve depoya bağlı yol ile devam eder.Çalışma zamanında bağımlılıkları bulmak için bu yolun bir ikili programa iletilmesi ve runfiles kitaplıklarını kullanarak dosya sistemi yoluna çözümlenmesi tercih edilen yaklaşımdır.
rootpath
ile karşılaştırıldığında, runfiles dizini mevcut olmasa bile tüm platformlarda çalışması avantajı vardır.Bu özellik,
execpath
ile aynı "yalnızca bir çıkış" şartlarına sahiptir. -
location
: Genişletilen özelliğe bağlı olarakexecpath
veyarootpath
ile eş anlamlı. Bu, Starlark öncesi 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
terimlerinin çoğul varyasyonlarıdır. Bu etiketler, birden fazla çıkış üreten etiketleri destekler. Bu durumda, her çıktı bir boşlukla ayrılmış olarak listelenir. Sıfır çıkışlı kurallar ve hatalı etiketler derleme hatalarına neden olur.
Referans verilen tüm etiketler, tüketen hedefin srcs
, çıkış dosyaları veya deps
etiketlerinde görünmelidir. Aksi takdirde derleme başarısız olur. C++ hedefleri, data
içindeki etiketlere de referans verebilir.
Etiketlerin standart biçimde olması gerekmez: foo
, :foo
ve //somepkg:foo
kullanılabilir.
Özelleştirilebilen değişkenler
Özel "Marka" değişkenlerine, "'Değişkenin değiştirilmesine tabi" şeklinde işaretlenmiş herhangi bir özellik referans verilir, ancak bu değişkenler yalnızca bu değişkenleri tanımlayan diğer hedeflere bağlı olan hedeflerde kullanılabilir.
En iyi uygulama olarak, değişkenleri temel Bazel'da kullanmak için gerçekten geçerli bir neden olmadığı sürece tüm değişkenler özel olmalıdır. Bu sayede Bazel, taretleri tüketen değişkenleri sağlamak için potansiyel olarak pahalı 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"]
(veya ana makine araç zinciri eşdeğeri için "@bazel_tools//tools/cpp:current_cc_host_toolchain"
) belirleyen tüm kurallarda kullanılabilir. java_binary
gibi bazı kurallar, kural tanımına dolaylı olarak C++ araç zincirini ekler. Bu değişkenleri otomatik olarak devralırlar.
Yerleşik C++ kuralları, "derleyiciyi üzerinde çalıştır" kurallarından çok daha karmaşıktır. Yerleşik kurallar; *SAN, ThinLTO gibi modüllü/modülsüz derleme gibi çeşitli derleme modlarını ve birden çok platformda hızlı çalışan testlerle aynı anda dikkatlice optimize edilmiş ikili programları desteklemek amacıyla, dahili olarak oluşturulmuş olası birden fazla işlemde doğru giriş, çıkış ve komut satırı işaretlerinin ayarlanmasını sağlar.
Bu değişkenler, dil uzmanları tarafından nadir durumlarda kullanılan yedek mekanizmadır. Bunları kullanmak isterseniz lütfen önce Bazel geliştiricileriyle iletişim kurun.
ABI
: C++ ABI sürümü.-
AR
: Çapraz araçtaki "ar" komutu. -
C_COMPILER
: C/C++ derleyici tanımlayıcısı, ör.llvm
. -
CC
: C ve C++ derleyici komutu.CC_FLAGS
yönergesini her zamanCC
ile birlikte kullanmanızı önemle tavsiye ederiz. Aksi takdirde, tüm riskler size aittir. CC_FLAGS
: C/C++ derleyicisi için genrule'lar tarafından kullanılabilecek minimal bir işaret grubu. Özellikle,CC
birden fazla mimariyi destekliyorsa bu, doğru mimariyi seçmek için kullanılan işaretleri içerir.-
NM
: Çapraz araçtaki "nm" komutu. -
OBJCOPY
: C/C++ derleyicisiyle aynı paketten objcopy komutu. -
STRIP
: C/C++ derleyicisiyle aynı paketten şerit 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"
) belirleyen tüm kurallarda 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 arayüz Kavanozları, başlık arayüzü Kavanozları ve yüksek düzeyde optimize edilmiş Kavanoz paketleme ve birleştirme uygulamaları gibi yayın öncesi araçların ifade edebileceğinden çok daha karmaşık yaklaşımlar kullanır.
Bu değişkenler, dil uzmanları tarafından nadir durumlarda kullanılan yedek mekanizmadır. Bunları kullanmak isterseniz lütfen önce Bazel geliştiricileriyle iletişim kurun.
-
JAVA
: "Java" komutu (Java sanal makinesi). Bundan kaçının ve mümkünse bunun yerine birjava_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 kaydetmeniz gerekir. JAVABASE
: Java yardımcı programlarını içeren temel dizin. Göreli bir yol olabilir. Bunun için bir "bin" alt dizini bulunur.
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. toolchains
özelliği aracılığıyla bunlara bağlı olan tüm kurallar, değerlerini okuyabilir: