"Değişkenler" Yapın

Sorun bildirin Kaynağı göster

"Oluştur" değişkenleri, "Değişken oluştur" yerine geçer olarak işaretlenen özellikler için kullanılabilen özel bir 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 bağımlı hedeflerde tanımlanıp yalnızca bunlara bağımlı hedefler için kullanılabilen özel değişkenler sağlar.

"Marka" teriminin nedeni geçmiştir: Bu değişkenlerin söz dizimi ve anlamları, başlangıçta GNU Make ile eşleşecektir.

Kullanım

""Değişken oluştur" yerine geçer" olarak işaretlenen özellikler, "Marka" değişkenine FOO aşağıdaki gibi başvurabilir:

my_attr = "prefix $(FOO) suffix"

Diğer bir deyişle, $(FOO) ile eşleşen tüm alt dizeler FOO değerine genişler. Bu değer "bar" ise son dize şöyle olur:

my_attr = "prefix bar suffix"

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

Adlarında harf olmayan simgeler (ör. @) içeren "Marka" değişkenlerine, parantez işareti olmadan yalnızca dolar işareti kullanılarak da referans verilebilir. Örneğin:

my_attr = "prefix $@ suffix"

Dize değişmez değeri olarak (değişken genişlemesini önlemek için) $ yazmak için $$ yazın.

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

Önceden tanımlanmış "Marka" değişkenlerine, herhangi bir hedefte ""Değişken oluştur" değişikliği" olarak işaretlenen herhangi bir özellik tarafından referans verilebilir.

Bu değişkenlerin listesini ve belirli bir derleme seçenekleri grubu için değerlerini görmek isterseniz

bazel info --show_make_env [build options]

üst harfleri büyük harfle yazın.

Önceden tanımlanmış değişkenler örneğine bakın.

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 için, derleme mimarisinde ana makine mimarisinde çalışan programlar için farklı bir ağaç kullanılabilir.

    genrule içinden bir araç çalıştırmak istiyorsanız tercih edilen yolu $(execpath toolname) bulabilirsiniz. Bu durumda araç adı, genrule içindeki 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ış kafes değişkenleri

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

Önceden tanımlanmış davet değişkenleri örneğine bakın.

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

  • @D: Çıkış dizini. outs'un tek bir girişi varsa bu dosya, ilgili dosyayı içeren dizine genişler. Birden fazla girişi varsa bu, tüm çıkış dosyaları aynı alt dizinde olsa bile genfiles ağacında paketin kök dizinine genişler.

    Not: RULEDIR işlevi, daha basit anlamlara sahip olduğu ve çıkış dosyalarının sayısından bağımsız olarak aynı şekilde davranacağı için @D yerine RULEDIR kullanın.

    Bölgenin geçici ara dosyalar oluşturması gerekiyorsa (örneğin, derleyici gibi başka bir araç kullanılması sonucunda) bu dosyaları @D alanına yazmaya çalışmalıdır (ancak /tmp yazılabilir olsa da) ve tamamlamadan önce dosyaları kaldırmalıdır.

    Özellikle giriş içeren dizinlere yazmaktan kaçının. Bu dosyalar salt okunur dosya sistemlerinde olabilir. Aksi takdirde kaynak ağaç çöp kutusuna taşını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 dosyalarda bu, çalışma alanı kökünüze göre sağlanan yoldur. Kural çıkışı olan dosyalar için bu, dosyanın çıkış yolu'dur (aşağıdaki çıkış dosyalarının açıklamasına bakın).

Önceden tanımlanmış yol değişkenleri örneğine göz atın.

  • execpath: Bazel'ın derleme işlemleri çalıştırdığı execroot öğesinin altındaki yolu gösterir.

    Yukarıdaki örnekte Bazel, çalışma alanı kökünüzdeki bazel-myproject sembol 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ğlandı. Dolayısıyla, yürütme yolu (kökün altındaki alt yoldur) testapp/empty.source şeklindedir. Bu, derleme işlemlerinin dosyayı bulmak için kullanabileceği yoldur.

    Çıkış dosyaları da benzer şekilde düzenlenir ancak ön ek olarak bazel-out/cpu-compilation_mode/bin alt yolu (veya araçların çıkışları için bazel-out/cpu-opt-exec-hash/bin) ön eki kullanılır. Yukarıdaki örnekte //testapp:app, show_app_output öğesinin tools özelliğinde göründüğü için bir araçtır. Bu nedenle, app çıkış dosyası bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app diline yazılır. Bu nedenle, yürütme yolu bazel-out/cpu-opt-exec-hash/bin/testapp/app şeklindedir. Bu ekstra önek, aynı derlemede iki farklı CPU için aynı hedefi birleştirmeyi mümkün kılar ve sonuçlar birbirine karışmaz.

    Bu değişkene iletilen etiket, tam olarak bir dosyayı temsil etmelidir. Kaynak dosyaları temsil eden etiketler için bu durum otomatik olarak geçerlidir. Kuralları temsil eden etiketler için kuralın tam olarak bir çıkışı oluşturması gerekir. Bu yanlışsa veya etiket hatalı biçimlendirilmişse hata vererek derleme başarısız olur.

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

    Bu execpath öğesine benzer ancak yukarıda açıklanan yapılandırma öneklerini çıkarır. Yukarıdaki örnekte hem empty.source hem de app, çalışma alanına özgü yollardan faydalanır: testapp/empty.source ve testapp/app.

    Harici bir depodaki bir dosyanın rootpath repo, ../repo/ ile başlar ve ardından depoya bağlı yol gelir.

    Bu politika, execpath ile aynı "yalnızca bir çıkış" koşuluna sahiptir.

  • rlocationpath: Yerleşik bir ikili programın, Runfiles dizininde (varsa) veya Runfiles manifestini kullanarak çalışma zamanında bir bağımlılık bulmak için Runfile kitaplığının Rlocation işlevine iletebileceği yol.

    rootpath ön ekinin olması, yapılandırma ön ekleri içermemesi ancak her zaman deponun adıyla başlaması açısından farklıdır. Yukarıdaki örnekte bu, empty.source ve app kodlarının şu yollara yol açtığı anlamına gelir: myproject/testapp/empty.source ve myproject/testapp/app.

    Harici bir depodaki bir dosyanın rlocationpath repo, repo/ ile başlar ve ardından depoya bağlı yol gelir.

    Çalışma zamanında bağımlıları bulmak için tercih edilen yaklaşım, bu yolu bir ikili programa iletmek ve Runfile kitaplıklarını kullanarak bir dosya sistemi yoluna çözümlemektir. rootpath ile karşılaştırıldığında, tüm dosyalarda ve Runfiles dizini kullanılamadığında bile çalışma avantajına sahiptir.

    Bu politika, execpath ile aynı "yalnızca bir çıkış" koşuluna sahiptir.

  • location: Genişletilen özelliğe bağlı olarak execpath veya rootpath için eş anlamlıdır. Bu, eski Starlark davranışıdır ve belirli bir kural için ne işe yaradığını gerçekten bilmiyorsanız önerilmez. Ayrıntılar için #2475 bölümüne bakın.

execpaths, rootpaths, rlocationpaths ve locations, sırasıyla execpath, rootpath, rlocationpaths ve location'nın çoğul varyasyonlarıdır. Birden fazla çıkış oluşturan etiketleri desteklerler. Bu durumda, her çıkış bir boşlukla ayrılmış olarak listelenir. Sıfır çıkış kuralları ve hatalı biçimlendirilmiş etiketler derleme hataları üretir.

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

Etiketlerin standart biçimde olması gerekmez: foo, :foo ve //somepkg:foo herhangi bir sorun oluşturmaz.

Özelleştirilebilen değişkenler

Özel "Marka" değişkenlerine, "Değişken oluştur" yerine kullanılabilir" verilebilir. Ancak bu değişkenleri, tanımlayan diğer hedeflere bağlı olan hedeflerde kullanabilirsiniz.

En iyi uygulama, temel Bazel'da pişirilmesi için gerçekten iyi bir neden olmadığı sürece tüm değişkenlerin özel olması gerekir. Böylece, Bazel'ın taret tüketen değişkenleri önemsemeyeceği değişkenleri sağlamak için pahalı olabilecek bağımlılıkları yüklemek zorunda kalmaması sağlanıyor.

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") ayarlayan tüm kurallar tarafından kullanılabilir. java_binary gibi bazı kurallar, kural tanımlarına dolaylı olarak C++ araç zincirini de ekler. Bu değişkenleri otomatik olarak devralır.

Yerleşik C++ kuralları "derleyiciyi çalıştırmak"tan çok daha karmaşıktır. *SAN, ThinLTO gibi modüller içeren/olmayan derleme modlarını ve birden fazla platformda hızlı çalışan testlerle aynı zamanda dikkatlice optimize edilmiş ikili programları desteklemek amacıyla, yerleşik kurallar, dahili olarak oluşturulan ve bağımsız olarak gerçekleştirilen her işlemin doğru giriş, çıkış ve komut satırı işaretlerinin ayarlandığından emin olmak için elimizden gelenin en iyisini yapar.

Bu değişkenler, nadir durumlarda dil uzmanları tarafından kullanılan bir yedek mekanizmadır. Bunları kullanmak istiyorsanız lütfen önce Bael devleriyle 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.

    Her zaman CC ile birlikte CC_FLAGS kullanmanızı önemle tavsiye ederiz. Bunu yapma riski size aittir.

  • CC_FLAGS: C/C++ derleyicinin genel kurallar tarafından kullanılabilmesi için en az bir işaret grubudur. Bu, özellikle CC birden fazla mimariyi destekliyorsa doğru mimariyi seçecek işaretleri içerir.
  • NM: Crosstool'daki "nm" komutu.
  • OBJCOPY: C/C++ derleyiciyle aynı paketten objcopy komutu.
  • STRIP: C/C++ derleyiciyle aynı pakette bulunan strip komutu.

Java araç zinciri değişkenleri

Aşağıdakiler, Java araç zinciri kurallarında tanımlanı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") 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 paketlemeye yönelik, üst düzey araçların (ör. arayüz Jars, başlık arayüzü Jars ve son derece optimize edilmiş Jar paketleme ve birleştirme uygulamaları) ifade edebileceğinden çok daha gelişmiş yaklaşımlar kullanır.

Bu değişkenler, nadir durumlarda dil uzmanları tarafından kullanılan bir yedek mekanizmadır. Bunları kullanmak istiyorsanız lütfen önce Bael devleriyle iletişime geçin.

  • JAVA: "Java" komutu (Java sanal makinesi). Bu durumdan kaçının ve mümkünse bir java_binary kuralı kullanın. Göreli bir yol olabilir. java ç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. Bir "bin" alt dizini olacaktır.

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. Daha sonra, toolchains özelliği aracılığıyla bunlara bağlı kurallar, değerlerini okuyabilir:

Starlark tarafından tanımlanan değişkenler örneğine bakın.