Değişken Oluşturma

Sorun bildirin.2 3}10 4.0312/}2}212}3 Kaynağı göster

"Marka" değişkenleri, "'Değişken yap" değişikliğine tabi" olarak işaretlenmiş özelliklerde kullanılabilen özel bir genişletilebilir dize değişkeni 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ğımlı hedefler tarafından kullanılabilen özel değişkenler sağlar.

"Yap" teriminin tarihinin nedeni eskidir: Bu değişkenlerin söz dizimi ve anlamı başlangıçta GNU Markası ile eşleşecek şekilde tasarlanmıştır.

Kullan

"'Değişken yap' değişikliğine tabi" olarak işaretlenmiş özellikler "Marka" değişkenine FOO aşağıdaki gibi başvurabilir:

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 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.

Adı @ gibi harf olmayan simge olan "Make" değişkenlerine, parantez olmadan yalnızca dolar işareti kullanılarak da referans verilebilir. Örneğin:

my_attr = "prefix $@ suffix"

$ öğesini düz dize değeri olarak yazmak (ör. değişken genişlemesini önlemek) için $$ yazın.

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

Önceden tanımlanmış "Marka" değişkenlerine, herhangi bir hedefte "'Değişken yap" değişikliğine tabi" olarak işaretlenmiş herhangi bir özellik tarafından referans verilebilir.

Bu değişkenlerin listesini ve belirli bir derleme seçeneği kümesi için değerlerini görmek istiyorsanız aşağıdaki komutu çalıştırın:

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 mimari için oluşturulan ikili ağacın tabanı.

    Çapraz derlemeyi desteklemek amacıyla, ana makine mimarisinde derleme sırasında çalışan programlar için farklı bir ağacın kullanılabileceğini unutmayın.

    genrule içinden bir araç ç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 temeli.

Makine mimarisi değişkenleri

  • TARGET_CPU: Hedef mimarinin CPU'su, ör. k8.

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

Aşağıdakiler, özellikle genrule öğesinin cmd özelliği için kullanılabilir ve bu özelliğin çalışması açısından genellikle önemlidir.

Önceden tanımlanmış genel değişkenlerle ilgili bir örneği inceleyin.

  • OUTS: genrule adlı grubun outs listesi. Yalnızca bir çıkış dosyanız varsa $@ komutunu da kullanabilirsiniz.
  • SRCS: genrule öğesinin srcs listesi (veya daha kesin bir ifadeyle: srcs listesindeki etiketlere karşılık gelen dosyaların yol adları). Yalnızca bir kaynak dosyanız varsa $< öğesini de kullanabilirsiniz.
  • <: Tek bir dosyaysa SRCS. Aksi takdirde bir derleme hatası tetiklenir.
  • @: Tek bir dosyaysa OUTS. Aksi takdirde bir derleme hatası tetikler.
  • RULEDIR: Hedefin çıkış dizinidir. genfiles veya bin ağacı altında, hedefi içeren paketin adına karşılık gelen dizindir. //my/pkg:my_genrule için bu, //my/pkg:my_genrule çıktıları alt dizinlerde olsa bile her zaman my/pkg ile biter.

  • @D: Çıkış dizini. outs'ta bir giriş varsa bu giriş, ilgili dosyayı içeren dizine genişletilir. Dosyada birden fazla giriş varsa tüm çıkış dosyaları aynı alt dizinde olsa bile bu dize, paketin genfiles ağacındaki kök dizinine genişletilir.

    Not: RULEDIR daha basit anlamlara sahip olduğundan ve çıkış dosyası sayısından bağımsız olarak aynı şekilde davrandığından @D yerine RULEDIR kullanın.

    Genrule'ın geçici ara dosyalar oluşturması gerekiyorsa (örneğin, derleyici gibi başka bir araç kullanılması nedeniyle) dosyaları @D içine yazmayı denemeli (ancak /tmp de yazılabilir) ve bitirmeden önce bunları kaldırmalıdır.

    Özellikle giriş içeren dizinlere yazmaktan kaçının. Salt okunur dosya sistemlerinde olabilirler. Aksi takdirde, kaynak ağacı çöpe atılı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 bu, Workspace kök dosyanıza göre belirlenen 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şkenleriyle ilgili bir örneği inceleyin.

  • execpath: Bazel'in derleme işlemlerini çalıştırdığı execroot komutunun altındaki yolu belirtir.

    Yukarıdaki örnekte Bazel, Workspace kök dizininizde bazel-myproject sembolik bağlantısıyla bağlanan dizindeki tüm derleme işlemlerini çalıştırır. empty.source kaynak dosyası, bazel-myproject/testapp/empty.source yoluna bağlanmıştır. Yani yönetici 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ı benzer şekilde hazırlanır ancak aynı zamanda bazel-out/cpu-compilation_mode/bin alt yolunun (veya bazel-out/cpu-opt-exec-hash/bin araçlarının çıkışları için) ön ek olarak eklenir. Yukarıdaki örnekte //testapp:app, show_app_output tools özelliğinde göründüğü için bir araçtır. Bu durumda çıkış dosyası app, bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app adresine yazılır. Dolayısıyla yönetici yolu bazel-out/cpu-opt-exec-hash/bin/testapp/app şeklindedir. Bu ek önek, sonuçların birbirini engellemesine gerek kalmadan aynı derlemedeki iki farklı CPU için aynı hedefi oluşturmayı mümkün kılar.

    Bu değişkene iletilen etiket tam olarak bir dosyayı temsil etmelidir. Bu, kaynak dosyaları temsil eden etiketler için 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ıysa derleme bir hatayla başarısız olur.

  • rootpath: Derlenen bir ikili programın, ana depoya karşılık gelen çalıştırma dosyaları dizininin alt dizinine göre çalışma zamanında bir bağımlılığı bulmak için kullanabileceği yolu belirtir. Not: Bu özellik yalnızca --enable_runfiles etkinse çalışır. Bu durum, Windows'da varsayılan olarak geçerli değildir. Platformlar arası destek için rlocationpath kullanın.

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

    repo kimlikli harici depodaki bir dosyanın rootpath öğesi, ../repo/ ile başlar ve depoya bağlı yol izler.

    Bu kuruluş, execpath ile aynı "yalnızca bir çıkış" koşullarına sahiptir.

  • rlocationpath: Derlenen bir ikili programın, runfiles dizininde (varsa) veya runfiles manifestini kullanarak çalışma zamanında bir bağımlılık bulmak için runfiles kitaplığının Rlocation işlevine geçirebileceği yol.

    Bu, yapılandırma ön eklerini içermemesi açısından rootpath ile benzerdir. Ancak her zaman deponun adıyla başlaması açısından farklıdır. Yukarıdaki örnekte bu, empty.source ve app değerlerinin şu yollarla sonuçlandığı anlamına gelir: myproject/testapp/empty.source ve myproject/testapp/app.

    repo kimlikli harici depodaki bir dosyanın rlocationpath öğesi, repo/ ile başlar ve depoya bağlı yol izler.

    Bu yolu, Runfiles kitaplıklarını kullanarak bir ikili programa iletmek ve dosya sistemi yoluna çözümlemek, çalışma zamanında bağımlılıkları bulmak için tercih edilen yaklaşımdır. rootpath ile karşılaştırıldığında, tüm platformlarda ve runfiles dizini kullanılamadığında bile çalışması avantajına sahiptir.

    Bu kuruluş, execpath ile aynı "yalnızca bir çıkış" koşullarına sahiptir.

  • location: Genişletilen özelliğe bağlı olarak execpath veya rootpath ile eş anlamlıdır. Bu, Starlark'tan önceki 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 kelimelerinin çoğul varyasyonlarıdır. Birden fazla çıkış üreten etiketleri desteklerler. Bu durumda her çıktı bir boşlukla ayrılmış olarak listelenir. Sıfır çıkış kuralları ve hatalı biçimlendirilmiş etiketler derleme hataları oluşturur.

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

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

Özelleştirilebilen değişkenler

Özel "Marka" değişkenlerine, "'Değişken yap" değişikliğine tabi" olarak işaretlenmiş herhangi bir özellik tarafından referans verilebilir, ancak bu değişken yalnızca bu değişkenleri tanımlayan diğer hedeflere bağlı olan hedeflerde kullanılabilir.

En iyi uygulama olarak, temel Bazel'in kapsamına almak için iyi bir neden olmadığı sürece tüm değişkenler özel olmalıdır. Bu sayede Bazel, tüketen taret'lerin önemsemeyeceği değişkenler sağlamak için pahalı olabilecek 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"] ayarlayan tüm kurallarda kullanılabilir. java_binary gibi bazı kurallar, kural tanımlarına dolaylı olarak C++ araç zincirini dahil eder. Bu değişkenleri otomatik olarak devralırlar.

Yerleşik C++ kuralları, "üzerinde derleyiciyi çalıştırma" kuralından çok daha karmaşıktır. Yerleşik kurallar; *SAN ve ThinLTO gibi çeşitli derleme modlarını (modüllü/modül olmadan) ve birden fazla platformda hızlı çalışan testlerle aynı anda dikkatlice optimize edilmiş ikili programları desteklemek için, dahili olarak oluşturulmuş olabilecek 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 gereken tüm imkanları sunar.

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

  • 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 hizmetini her zaman CC ile birlikte kullanmanızı önemle tavsiye ederiz. Aksi takdirde tüm risk size aittir.

  • CC_FLAGS: C/C++ derleyicinin Genrules tarafından kullanılabilmesi için gereken minimum işaret grubu. Özellikle de CC birden fazla mimariyi destekliyorsa doğru mimariyi seçmeniz için işaretler yer alır.
  • NM: Crosstool'daki "nm" komutu.
  • OBJCOPY: C/C++ derleyiciyle aynı pakette bulunan 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ı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") değerini ayarlayan tüm kurallar tarafından 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 yukarı akış araçlarının ifade edebileceğinden çok daha gelişmiş yaklaşımlar kullanır. Bunlara örnek olarak arayüz Kavanozları, başlık arayüzü Kavanozları, yüksek düzeyde optimize edilmiş Jar paketleme ve birleştirme uygulamaları gösterilebilir.

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

  • JAVA: "Java" komutu (bir Java sanal makinesi). Bundan kaçının ve mümkünse bunun yerine 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 yakalamanız gerekir.
  • JAVABASE: Java yardımcı programlarını içeren temel dizin. Göreli bir yol olabilir. "bin" alt dizini olur.

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

Kural ve araç zinciri yazarları, TemplateVariableInfo sağlayıcı döndürerek tamamen özelleştirilebilen değişkenler tanımlayabilir. Böylece, toolchains özelliği aracılığıyla bunlara bağlı olan tüm kurallar değerlerini okuyabilir:

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