Değişken Oluşturma

. Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

"Yap" değişkenler, genişletilebilir dize değişkenlerinin özel bir sınıfıdır "'Değişken yap'a tabi" olarak işaretlenmiş özelliklere değiştirme".

Bunlar örneğin, belirli araç zinciri yollarının kullanıcı tarafından oluşturulan derleme işlemleridir.

Bazel, tüm reklamverenler tarafından kullanılabilen önceden tanımlanmış hedefleri ve bağımlılık hedeflerinde tanımlanan özel değişkenleri ve yalnızca onlara bağımlı olan hedefler tarafından kullanılabilir.

"Yap" teriminin nedeni tarihseldir: söz diziminin ve anlamının bu değişkenlerin başlangıçta GNU ile Oluştur'u tıklayın.

Kullan

"'Değişken yap'a tabi" olarak işaretlenen özellikler " "Marka" öğesine FOO değişkeni şu şekildedir:

my_attr = "prefix $(FOO) suffix"

Yani $(FOO) ile eşleşen tüm alt dizeler genişletilir FOO değerine ayarlayın. Bu değer "bar" ise son dize şu hale gelir:

my_attr = "prefix bar suffix"

FOO, tüketen kullanıcı tarafından bilinen bir değişkene karşılık gelmiyorsa Bazel bir hata vererek başarısız olur.

"Yap" Örneğin, @, yalnızca dolar işareti kullanılarak da referans alınabilir, yalnızca dolar işareti kullanılmadan parantez içine alın. Örneğin:

my_attr = "prefix $@ suffix"

$ değerini bir dize sabit değeri olarak yazmak (ör. değişkeni önlemek amacıyla) genişletme) için $$ yazın.

Önceden tanımlanmış değişkenler

Önceden tanımlanmış "Marka" değişkenlerine, "'Değişken oluştur' konusuyla ilgili değiştirme" hatasını düzeltmesi gerekir.

Bu değişkenlerin listesini ve belirli bir derleme kümesi için değerlerini görmek isterseniz seçenekler, koşma

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

Yol değişkenleri

  • BINDIR: Hedef için oluşturulan ikili ağacın tabanı bahsedeceğim.

    sırasında çalışan programlar için farklı bir ağacın kullanılabileceğini kullanarak çapraz derlemeyi desteklemek için ana makine mimarisini geliştirebilirsiniz.

    Bir aracı genrule içinden çalıştırmak isterseniz yolunu almak için önerilen yol $(execpath toolname) Burada araç adı, genrule öğesinin tools özelliği.

  • 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ış genel değişkenler

Aşağıdakiler genrule adlı çocuğa özel olarak kullanılabilir cmd özelliğine ait ve bu özelliğin çalışmasında genel olarak önemlidir.

Önceden tanımlanmış genel değişkenlerin bir örneğine bakın.

  • OUTS: genrule adlı grubun outs listesi. Mevcut yalnızca bir çıkış dosyası varsa $@ kullanabilirsiniz.
  • SRCS: genrule adlı kanalın srcs listesi (veya daha fazlası tam olarak: Google Etiket Yöneticisi'ndeki etiketlere karşılık gelen dosyaların srcs listesi). Yalnızca bir kaynak dosyanız varsa $< öğesini de kullanabilirsiniz.
  • <: Tek bir dosyaysa SRCS. Diğer tetikleyiciler hata içeriyor.
  • @: Tek bir dosyaysa OUTS. Aksi takdirde derleme hatası.
  • RULEDIR: Hedefin çıkış dizini, yani hedefi içeren paketin adına karşılık gelen dizin "genfiles veya bin ağacı altında. Örneğin, //my/pkg:my_genrule bu her zaman my/pkg ile biter, Hatta //my/pkg:my_genrule ürününün çıkışları alt dizinlerde olsa bile geçerlidir.

  • @D: Çıkış dizini. Eğer outs tek bir giriş içerir. bu dosyayı içeren dizine genişler. Birden fazla Bu işlem, paketin genfiles ağacı, tüm çıkış dosyaları aynı olsa bile alt dizininiz olur.

    Not: @D yerine RULEDIR kullanın, çünkü RULEDIR daha basit anlamlara sahiptir ve aynı şekilde davranır. veya çıkış dosyası sayısından bağımsız olarak değiştirilebilir.

    Genrule'ın geçici ara dosyalar oluşturması gerekiyorsa (örneğin veya derleyici gibi başka bir aracın kullanılması sonucunda ortaya çıkıyorsa) bunları @D adresine yaz (yine de /tmp, yazın) ve bitirmeden önce bunları kaldırın.

    Özellikle giriş içeren dizinlere yazmaktan kaçının. Açık olabilir salt okunur dosya sistemleridir. Aksi takdirde, kaynak ağacı çöpe atılır.

Önceden tanımlanmış kaynak/çıkış yolu değişkenleri

Önceden tanımlanmış execpath, execpaths değişkenleri rootpath, rootpaths, location ve locations, etiket parametrelerini (ör. $(execpath //foo:bar)) alır ve bu etiketle belirtilen dosya yollarının yerine geçer.

Kaynak dosyalar için bu, Workspace kök dosyanıza göre belirlenen yoldur. Kuralların çıktısı olan dosyalar için bu, 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: execroot çalıştırması için bir örnek oluşturabilirsiniz.

    Yukarıdaki örnekte Bazel, bağlı dizindeki tüm derleme işlemlerini çalıştırır. çalışma alanı kökünüzdeki bazel-myproject sembolik bağlantısı tarafından. İlgili içeriği oluşturmak için kullanılan empty.source adlı kaynak dosya yola bağlı bazel-myproject/testapp/empty.source. Yönetici yolu (yani kökün altındaki alt yoldur) testapp/empty.source şeklindedir. Bu derleme işlemlerinin dosyayı bulmak için kullanabileceği yoldur.

    Çıkış dosyaları benzer şekilde hazırlanır ancak aynı zamanda alt yolun önekine de sahiptir bazel-out/cpu-compilation_mode/bin (veya araçlar: bazel-out/cpu-opt-exec-hash/bin). Yukarıdaki örnekte, //testapp:app, show_app_output adlı kullanıcının tools özelliği. Dolayısıyla çıkış dosyası app, bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app. Dolayısıyla yönetici yolu bazel-out/cpu-opt-exec-hash/bin/testapp/app şeklindedir. Bu ekstra önek Örneğin iki farklı CPU için aynı hedefi birbirine engel olmadan aynı derlemeyi

    Bu değişkene iletilen etiket tam olarak bir dosyayı temsil etmelidir. Örneğin, (kaynak dosyaları temsil eden etiketler) bu otomatik olarak doğrudur. Etiketler için kuralının tam olarak bir çıkış oluşturması gerekir. Bu false veya etiket bozuksa derleme bir hatayla başarısız olur.

  • rootpath: Derlenen bir ikili programın çalışma zamanında çalıştırma dosyalarının alt dizinine göre bir bağımlılık bul dizini oluşturur. Not: Bu yalnızca --enable_runfiles etkinleştirildi, bu durum şurada geçerli değil: Varsayılan olarak Windows. Şunun için bunun yerine rlocationpath kullanın: destek alın.

    Bu, execpath etiketine benzer ancak yapılandırmayı kaldırır önekleridir. Yukarıdaki örnekte bu, empty.source ve app tamamen çalışma alanına bağlı yollar: testapp/empty.source ve testapp/app.

    Harici bir depodaki dosyanın rootpath öğesi repo, ../repo/ ile başlayacak ve ardından depoya bağlı yolunu izler.

    Bu öğede aynı "yalnızca bir çıkış" bulunur execpath olarak kabul edersiniz.

  • rlocationpath: Derlenen bir ikili programın, aşağıdaki konumda bağımlılık bulmak için Runfiles kitaplığının Rlocation işlevine geçirebileceği yol veya Runfiles manifest'ini içerir.

    Bu, rootpath özelliğine benzer, çünkü içermemesi ön ekleriyle başlar, ancak her zaman seçeceğim. Yukarıdaki örnekte bu, empty.source ve app değerlerinin şu şekilde sonuçlandığı anlamına gelir: yollar: myproject/testapp/empty.source ve myproject/testapp/app.

    Harici bir depodaki dosyanın rlocationpath öğesi repo, repo/ ile başlayacak ve ardından depoya bağlı yolunu izler.

    Bu yolu bir ikili programa iletme ve yolu Runfiles kitaplıklarını kullanarak bağımlılıkları bulmak için tercih edilen yaklaşımdır. belirler. rootpath ile kıyaslandığında daha avantajlı tüm platformlarda çalışır ve Runfiles dizini kullanılabilir.

    Bu öğede aynı "yalnızca bir çıkış" bulunur execpath olarak kabul edersiniz.

  • location: execpath veya rootpath (genişletilen özelliğe bağlı olarak). Bu önceden Starlark'tan gelen eski davranıştır. Bu davranışla ilgili aynı şey söz konusu. Bkz. #2475 inceleyebilirsiniz.

execpaths, rootpaths, rlocationpaths, locations, execpath kelimesinin çoğul varyasyonlarıdır rootpath, rlocationpaths velocation, tıklayın. Etiketlerin birden fazla çıktı üretmesini destekler. her çıkış boşlukla ayrılmış olarak listelenir. Sıfır çıkış kuralları ve bozuk etiketler yapı hataları oluşturur.

Başvurulan tüm etiketler, tüketen hedefin srcs içinde görünmelidir. veya deps. Aksi takdirde derleme başarısız olur. C++ hedefleri data içindeki etiketlere de başvuruyor.

Etiketlerin standart biçimde olması gerekmez: foo, :foo ve //somepkg:foo sorun yok.

Özelleştirilebilen değişkenler

Özel "Marka" değişkenlerine, "'Değişken oluştur' konusuyla ilgili yalnızca bu filtrenin kullanıldığı hedeflerde bu değişkenleri tanımlayan diğer hedeflere bağlıdır.

En iyi uygulama olarak gerçekten iyi bir dönüşüm oranı olmadığı sürece tüm değişkenler temel Bazel'in içine katmayı düşündük. Bu, Bazel'i yükleme zahmetinden kurtarır yüksek maliyetli bağımlılıklar yaratabilir. önem vermez.

C++ araç zinciri değişkenleri

Aşağıdakiler, C++ araç zinciri kurallarında tanımlanmıştır ve tüm kurallar tarafından kullanılabilir toolchains = ["@bazel_tools//tools/cpp:current_cc_toolchain"] değerini ayarlayan java_binary gibi bazı kurallar, dolaylı olarak C++ araç zincirini kural tanımlarına dahil etmelidir. Bu değişkenleri devralırlar otomatik olarak oluşturur.

Yerleşik C++ kuralları, "derleyiciyi şurada çalıştırmaya kıyasla çok daha karmaşıktır: . *SAN, ThinLTO gibi çeşitli derleme modlarını desteklemek için aynı anda dikkatlice optimize edilmiş ikili programları, birden çok platformda testler çalışırsa yerleşik kurallar size çok iyi sonuç verir. giriş, çıkış ve komut satırı işaretlerinin doğru ayarlandığından emin olmak için uzunluklarını ayarlayın. dahili olarak oluşturulmuş birden fazla işlemin her birinde Google Analytics'i kullanabilirsiniz.

Bu değişkenler, bir dili kullanan dil uzmanları tarafından nadiren kullanılır. Bu araçları kullanmak isterseniz lütfen önce Bazel geliştiricilerinle iletişim kurun.

  • ABI: C++ ABI sürümü.
  • AR: "ar" komutudur.
  • C_COMPILER: C/C++ derleyici tanımlayıcısı, ör. llvm.
  • CC: C ve C++ derleyici komutu.

    Şuralarda her zaman CC_FLAGS kullanmanızı önemle tavsiye ederiz: CC ile kombinasyonu. Aksi takdirde tüm risk size aittir.

  • CC_FLAGS: C/C++ için minimal bir işaret grubu derleyici tarafından kullanılabilmesini sağlar. Bu, özellikle de CC birden fazla özelliği destekliyorsa doğru mimariyi seçin inceleyebilirsiniz.
  • NM: "nm" komutudur.
  • OBJCOPY: C/C++ ile aynı paketteki objcopy komutu derleyici olarak da adlandırılır.
  • STRIP: C/C++ ile aynı paketteki şerit komutu derleyici olarak da adlandırılır.

Java araç zinciri değişkenleri

Aşağıdakiler Java araç zinciri kurallarında tanımlanmıştır ve tüm kurallar tarafından kullanılabilir toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"] (veya "@bazel_tools//tools/jdk:current_host_java_runtime" (ana makine araç zinciri eşdeğeri için).

JDK'daki araçların çoğu doğrudan kullanılmamalıdır. Yerleşik Java kuralları, Java derleme ve paketleme işlemleri için çok daha karmaşık yaklaşımlar kullanır. veya yukarı akış araçlarının ifade edebileceğinden çok daha fazlasını içerir. Kavanozlar ve son derece optimize edilmiş Jar paketleme ve birleştirme uygulamaları.

Bu değişkenler, bir dili kullanan dil uzmanları tarafından nadiren kullanılır. Bu araçları kullanmak isterseniz lütfen önce Bazel geliştiricilerinle iletişim kurun.

  • JAVA: "Java" komutu (Java sanal için kullanılabilir). Bundan kaçının ve java_binary kuralı kullanın . Göreli bir yol olabilir. Değişiklik yapmanız gerekiyorsa java çağırmadan önce dizinleri yakalamanız gerekir, çalışma dizinini inceleyin.
  • JAVABASE: Şunu içeren temel dizin: Java yardımcı programları. Göreli bir yol olabilir. Bir "bin" olacaktır alt dizine eklenir.

Starlark tarafından tanımlanan değişkenler

Kural ve araç zinciri yazarları, döndürerek tamamen özelleştirilebilen değişkenleri TemplateVariableInfo sağlar. Böylece toolchains özelliği, değerlerini okuyabilir:

Starlark tarafından tanımlanan değişkenlerle ilgili bir örneğe bakın.