- 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,dbgveyaopt. (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ı
genruleiç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:genruleadlı kullanıcınınoutslistesi. Yalnızca bir çıkış dosyanız varsa$@politikasını da kullanabilirsiniz.-
SRCS:genrule'insrcslistesi (veya daha kesin belirtmek gerekirse:srcslistesindeki 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,genfilesveyabinağ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_genruleiçin bu her zamanmy/pkgile 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 bilegenfilesağacında paketin kök dizinine genişletilir.Not:
RULEDIRdaha basit semantiklere sahip olduğundan ve çıkış dosyası sayısından bağımsız olarak aynı şekilde davrandığından@DyerineRULEDIRkullanı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/tmpde 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-myprojectsembolik bağlantısıyla bağlı dizindeki tüm derleme işlemlerini çalıştırır.empty.sourcekaynak dosyası,bazel-myproject/testapp/empty.sourceyolunda 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/binalt yolunun (veya araçların çıkışlarının) ön ekine sahiptir. Yukarıdaki örnekte//testapp:app,show_app_outputtoolsözelliğinde göründüğü için bir araçtır.bazel-out/cpu-opt-exec-hash/binDolayısıyla, çıkış dosyasıappbazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/appdiline 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_runfilesetkinleştirilmişse çalışır. Varsayılan olarak Windows'da geçerli değildir. Platformlar arası destek için bunun yerinerlocationpathkullanın.Bu,
execpathözelliğine benzer ancak yukarıda açıklanan yapılandırma ön eklerini çıkarır. Yukarıdaki örnekte bu, hemempty.sourcehem deapp'nin sadece çalışma alanına bağlı yolları kullandığı anlamına gelir:testapp/empty.sourcevetestapp/app.Harici
repodeposundaki dosyanınrootpathalanı../repo/ile başlar ve depoya bağlı yol ile devam eder.Bu özellik,
execpathile 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ınRlocationişlevine iletebileceği yol.Bu, yapılandırma ön eki içermemesiyle birlikte her zaman deponun adıyla başlamasıyla
rootpathile benzerdir. Yukarıdaki örnekte bu,empty.sourceveapp'nin şu yollarla sonuçlandığı anlamına gelir:myproject/testapp/empty.sourcevemyproject/testapp/app.Harici
repodeposundaki dosyanınrlocationpathalanı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.
rootpathile karşılaştırıldığında, runfiles dizini mevcut olmasa bile tüm platformlarda çalışması avantajı vardır.Bu özellik,
execpathile aynı "yalnızca bir çıkış" şartlarına sahiptir. -
location: Genişletilen özelliğe bağlı olarakexecpathveyarootpathile 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_FLAGSyönergesini her zamanCCile 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,CCbirden 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_binarykuralı kullanın. Göreli bir yol olabilir.javakomutunu ç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: