"Marka" Değişkenleri

"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

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 öğesinin tools ö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ın outs listesi. Yalnızca bir çıkış dosyanız varsa $@ politikasını da kullanabilirsiniz.
  • SRCS: genrule'in srcs 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 veya bin 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 zaman my/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 bile genfiles 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 yerine RULEDIR 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 yolu bazel-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 yerine rlocationpath kullanın.

    Bu, execpath özelliğine benzer ancak yukarıda açıklanan yapılandırma ön eklerini çıkarır. Yukarıdaki örnekte bu, hem empty.source hem de app'nin sadece çalışma alanına bağlı yolları kullandığı anlamına gelir: testapp/empty.source ve testapp/app.

    Harici repo deposundaki dosyanın rootpath 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ın Rlocation 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 ve app'nin şu yollarla sonuçlandığı anlamına gelir: myproject/testapp/empty.source ve myproject/testapp/app.

    Harici repo deposundaki dosyanın rlocationpath 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ı olarak execpath veya rootpath 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 zaman CC 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 bir java_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:

Starlark tanımlı değişkenlerle ilgili bir örneği inceleyin.