- Kullanım
- Önceden tanımlanmış değişkenler
- Önceden tanımlanmış genrule değişkenleri
- Önceden tanımlanmış kaynak/çıktı yolu değişkenleri
- Özelleştirilebilen değişkenler
"Make" değişkenleri, ""Make değişkeni" yerine koymaya tabi" olarak işaretlenmiş özelliklerde kullanılabilen genişletilebilir dize değişkenlerinin özel bir 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 hedeflerin kullanabileceği önceden tanımlanmış değişkenler hem de bağımlılık hedeflerinde tanımlanan ve yalnızca bunlara bağlı hedeflerin kullanabileceği özel değişkenler sağlar.
"Make" terimi geçmişten kalmadır: Bu değişkenlerin söz dizimi ve semantiği başlangıçta GNU Make ile eşleşmek için tasarlanmıştır.
Kullan
""Make değişkeni" yerine geçmeye tabi" olarak işaretlenen özellikler, "Make" değişkenine FOO aşağıdaki gibi referans verebilir:
my_attr = "prefix $(FOO) suffix"
Diğer 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.
Adları harf olmayan sembollerden oluşan "Make" değişkenlerine (ör. @) parantez olmadan yalnızca dolar işareti kullanılarak da referans verilebilir. Örneğin:
my_attr = "prefix $@ suffix"
$ değerini dize değişmezi olarak yazmak (yani değişkenin genişletilmesini önlemek) için $$ yazın.
Önceden tanımlanmış değişkenler
Önceden tanımlanmış "Make" değişkenlerine, herhangi bir hedefte "Make değişkeni yerine geçmeye tabi" olarak işaretlenmiş herhangi bir özellik tarafından referans verilebilir.
Belirli bir derleme seçenekleri grubu için bu değişkenlerin listesini ve değerlerini görmek üzere
bazel info --show_make_env [build options]
ve büyük harflerle yazılmış üst çıkış satırlarına bakın.
Önceden tanımlanmış değişken örneğine bakın.
Araç seti seçenek değişkenleri
COMPILATION_MODE:fastbuild,dbgveyaopt. (daha fazla bilgi)
Yol değişkenleri
-
BINDIR: Hedef mimari için oluşturulan ikili ağacın tabanı.Çapraz derlemeyi desteklemek için ana makine mimarisinde derleme sırasında çalıştırılan programlar için farklı bir ağaç kullanılabileceğini unutmayın.
Bir
genruleiçinden bir araç çalıştırmak istiyorsanız yolunu almanın önerilen yolu$(execpath toolname)'dur. Bu yöntemde toolname,genrule'nintoolsö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 öğesinin 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şkenlerine örnek
OUTS:genrule'unoutslistesi. Yalnızca bir çıkış dosyanız varsa$@seçeneğini de kullanabilirsiniz.-
SRCS:genrule'unsrcslistesi (veya daha net bir ifadeyle:srcslistesindeki etiketlere karşılık gelen dosyaların yol adları). Yalnızca bir kaynak dosyanız varsa$<değerini de kullanabilirsiniz. -
<: Tek bir dosyaysaSRCS. Aksi takdirde bir derleme hatası tetiklenir. -
@: Tek bir dosyaysaOUTS. Aksi takdirde bir derleme hatası tetiklenir. -
RULEDIR: Hedefin çıkış dizini, yanigenfilesveyabinağacında hedefi içeren paketin adına karşılık gelen dizin.//my/pkg:my_genruleiçin bu değer,//my/pkg:my_genrule'nin çıkışları alt dizinlerde olsa bile her zamanmy/pkgile biter. -
@D: Çıkış dizini. Çıkışlar parametresinde tek bir giriş varsa bu parametre, söz konusu dosyayı içeren dizine genişletilir. Birden fazla girişi varsa bu, tüm çıkış dosyaları aynı alt dizinde olsa bile paketingenfilesağacındaki kök dizine genişler.Not:
RULEDIRdaha basit bir semantike sahip olduğundan ve çıkış dosyalarının sayısından bağımsız olarak aynı şekilde davrandığından@DyerineRULEDIRkullanın.genrule'un geçici ara dosyalar oluşturması gerekiyorsa (ör. derleyici gibi başka bir aracın kullanılması sonucunda) bunları
@D'e yazmaya çalışmalı (/tmpde yazılabilir olsa da) ve işlemi tamamlamadan önce bunları kaldırmalıdır.Özellikle giriş içeren dizinlere yazmamaya çalışın. Bunlar, salt okunur dosya sistemlerinde olabilir. Aksi takdirde, kaynak ağacı çöp olur.
Önceden tanımlanmış kaynak/çıkış yolu değişkenleri
execpath, execpaths,
rootpath, rootpaths, location ve
locations önceden tanımlanmış 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, çalışma alanı kökünüze göre olan yoldur. Kuralların çıkışı olan dosyalar için bu, dosyanın çıktı yoludur (aşağıdaki çıktı dosyaları açıklamasına bakın).
Önceden tanımlanmış yol değişkenlerine örnek
-
execpath: Bazel'in derleme işlemlerini yürüttüğü, execroot altındaki yolu belirtir.Yukarıdaki örnekte Bazel, tüm derleme işlemlerini Workspace kök dizininizdeki
bazel-myprojectsembolik bağlantısı ile bağlı dizinde çalıştırır.empty.sourcekaynak dosyası,bazel-myproject/testapp/empty.sourceyoluna bağlanmıştır. Dolayısıyla, yürütme yolu (kökün altındaki alt yol)testapp/empty.source'tür. Bu, derleme işlemlerinin dosyayı bulmak için kullanabileceği yoldur.Çıkış dosyaları benzer şekilde sahnelenir ancak önlerine
bazel-out/cpu-compilation_mode/binalt yolu da eklenir (veya araçların çıkışları için:bazel-out/cpu-opt-exec-hash/bin). Yukarıdaki örnekte,show_app_output'ıntoolsözelliğinde göründüğü için//testapp:appbir araçtır. Bu nedenle, çıkış dosyasıapp,bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/appkonumuna yazılır. Bu nedenle, yürütme yolubazel-out/cpu-opt-exec-hash/bin/testapp/appolur. Bu ek ön ek, aynı derlemedeki iki farklı CPU için aynı hedefin, sonuçların birbirini etkilemeden derlenmesini sağlar.Bu değişkene iletilen etiket tam olarak bir dosyayı temsil etmelidir. Kaynak dosyalarını temsil eden etiketler için bu 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ı biçimlendirilmişse derleme hatayla başarısız olur.
-
rootpath: Derlenmiş bir ikili dosyanın, ana depoya karşılık gelen çalıştırma dosyaları dizininin alt dizine göre çalışma zamanında bağımlılık bulmak için kullanabileceği yolu belirtir. Not: Bu yöntem yalnızca--enable_runfilesetkinse çalışır. Windows'ta bu özellik varsayılan olarak etkin değildir. Platformlar arası destek için bunun yerinerlocationpath'ü kullanın.Bu,
execpathile benzer ancak yukarıda açıklanan yapılandırma ön eklerinin kaldırılmasını sağlar. Yukarıdaki örnekte bu, hemempty.sourcehem deapp'ün,testapp/empty.sourcevetestapp/appolmak üzere yalnızca çalışma alanına göreli yollar kullandığı anlamına gelir.Harici bir depodaki dosyanın
rootpathdeğerirepo,../repo/ile başlar ve depoya göreli yol ile devam eder.Bu,
execpathile aynı "yalnızca bir çıkış" koşullarına sahiptir. -
rlocationpath: Derlenmiş bir ikili dosyanın, çalışma zamanında bir bağımlılık bulmak için runfiles kütüphanesininRlocationişlevine iletebildiği yol. Bu yol, runfiles dizininde (varsa) veya runfiles manifest'ini kullanarak bulunabilir.Bu, yapılandırma ön ekleri içermemesi bakımından
rootpathile benzer ancak her zaman deponun adıyla başlaması bakımından farklıdır. Yukarıdaki örnekte bu,empty.sourceveapp'ün aşağıdaki yollarla sonuçlandığı anlamına gelir:myproject/testapp/empty.sourcevemyproject/testapp/app.Harici bir depodaki dosyanın
rlocationpathdeğerirepo,repo/ile başlar ve depoya göreli yol ile devam eder.Bu yolu bir ikili dosyaya iletmek ve runfiles kitaplıklarını kullanarak dosya sistemi yoluna çözümlemek, bağımlılıkların çalışma zamanında bulunması için tercih edilen yaklaşımdır.
rootpathile karşılaştırıldığında, tüm platformlarda ve hatta çalıştırma dosyaları dizini kullanılamadığında bile çalışabilme avantajına sahiptir.Bu,
execpathile aynı "yalnızca bir çıkış" koşullarına sahiptir. -
location: Genişletilen özelliğe bağlı olarakexecpathveyarootpathiçin eş anlamlı bir terimdir. Bu, Starlark öncesi eski bir davranıştır ve belirli bir kural için ne yaptığını gerçekten bilmediğiniz sürece önerilmez. Ayrıntılar için #2475
execpaths, rootpaths, rlocationpaths ve locations, sırasıyla execpath, rootpath, rlocationpath ve location'ın çoğul varyasyonlarıdır. Birden fazla çıkış üreten etiketleri destekler. Bu durumda her çıkış, boşlukla ayrılarak listelenir. Sıfır çıkışlı kurallar ve hatalı biçimlendirilmiş etiketler derleme hataları oluşturur.
Referans verilen tüm etiketler, tüketen hedefin srcs, çıkış dosyalarında veya deps'te görünmelidir. Aksi takdirde derleme başarısız olur. C++ hedefleri, data'teki etiketlere de referans verebilir.
Etiketlerin standart biçimde olması gerekmez: foo, :foo ve //somepkg:foo kullanılabilir.
Özelleştirilebilen değişkenler
Özel "Make" değişkenlerine, "Make değişkeni yerine koyma işlemine tabi" olarak işaretlenmiş herhangi bir özellik tarafından referans verilebilir ancak yalnızca bu değişkenleri tanımlayan diğer hedeflere bağlı hedeflerde referans verilebilir.
En iyi uygulama olarak, temel Bazel'e dahil edilmeleri için gerçekten iyi bir neden olmadığı sürece tüm değişkenler özel olmalıdır. Bu sayede Bazel, hedef tüketen değişkenler için gerekli olabilecek 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"] değerini ayarlayan tüm kurallar tarafından kullanılabilir. java_binary gibi bazı kurallar, kural tanımlarında C++ araç zincirini dolaylı olarak içerir. Bu değişkenler otomatik olarak devralınır.
Yerleşik C++ kuralları, "derleyiciyi çalıştır"dan çok daha karmaşıktır. Birden fazla platformda hızlı test çalıştırırken *SAN, ThinLTO, modüllü/modülsüz ve dikkatlice optimize edilmiş ikili dosyalar gibi çeşitli derleme modlarını desteklemek için yerleşik kurallar, dahili olarak oluşturulan 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 büyük çaba gösterir.
Bu değişkenler, dil uzmanları tarafından nadiren kullanılacak bir yedek mekanizmadır. Bunları kullanmak istiyorsanız lütfen önce Bazel geliştiricileriyle 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.CC_FLAGS'ü her zamanCCile birlikte kullanmanızı önemle Aksi takdirde tüm risk size aittir. CC_FLAGS: C/C++ derleyicisinin genrules tarafından kullanılabilmesi için gereken minimum işaretler. Özellikle,CCbirden fazla mimariyi destekliyorsa doğru mimariyi seçmek için işaretler içerir.-
DUMPBIN: Microsoft Visual Studio'dan Microsoft COFF Binary File Dumper (dumpbin.exe) -
NM: crosstool'daki "nm" komutu. -
OBJCOPY: C/C++ derleyiciyle aynı paketteki 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ımlanır ve toolchains =
["@rules_java//toolchains:current_java_runtime"] (veya ana makine araç zinciri eşdeğeri için "@rules_java//toolchains:current_host_java_runtime") değerini ayarlayan tüm kurallar tarafından kullanılabilir.
JDK'deki araçların çoğu doğrudan kullanılmamalıdır. Yerleşik Java kuralları, Java derleme ve paketleme için yayın öncesi araçların ifade edebileceğinden çok daha gelişmiş yaklaşımlar kullanır (ör. arayüz Jar'ları, başlık arayüzü Jar'ları ve son derece optimize edilmiş Jar paketleme ve birleştirme uygulamaları).
Bu değişkenler, dil uzmanları tarafından nadiren kullanılacak bir yedek mekanizmadır. Bunları kullanmak istiyorsanız lütfen önce Bazel geliştiricileriyle iletişime geçin.
-
JAVA: "java" komutu (Java sanal makinesi). Bu durumdan kaçının ve mümkün olduğunda bunun yerinejava_binarykuralı kullanın. Göreli bir yol olabilir.javaişlevini ç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" adlı bir alt dizin bulunur.
Starlark tarafından tanımlanan değişkenler
Kural ve araç zinciri yazarları, TemplateVariableInfo sağlayıcısı döndürerek tamamen özel değişkenler tanımlayabilir. toolchains özelliği aracılığıyla bunlara bağlı olan tüm kurallar, değerlerini okuyabilir: