İşlevler

Sorun bildirin Kaynağı göster

İçindekiler

paket

package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)

Bu işlev, paketteki her kural için geçerli olan meta verileri bildirir. Bir paket (BUILD dosyası) içinde en fazla bir kez kullanılır.

Meta verinin tüm depodaki her kurala uygulandığını bildiren meta veri deposu için deponuzun kök kısmındaki REPO.bazel dosyasında bulunan repo() işlevini kullanın. repo() işlevi, package() ile tam olarak aynı bağımsız değişkenleri alır.

package() işlevi, dosyanın üst kısmındaki tüm load() ifadelerinden hemen sonra, herhangi bir kuraldan önce çağrılmalıdır.

Bağımsız değişkenler

Özellik Açıklama
default_applicable_licenses

default_package_metadata için takma ad.

default_visibility

Etiket listesi; varsayılan değer: []

Bu paketteki kuralların varsayılan görünürlüğü.

Bu paketteki her kural, bu özellikte belirtilen görünürlüğe sahiptir (aksi belirtilmedikçe kuralın visibility özelliğinde). Bu özelliğin söz dizimi hakkında ayrıntılı bilgi için görünürlük belgelerine bakın. Paketin varsayılan görünürlüğü, varsayılan olarak herkese açık olan exports_files için geçerli değildir.

default_deprecation

Dize; varsayılan değer: ""

Bu paketteki tüm kurallar için varsayılan deprecation mesajını ayarlar.

default_package_metadata

Etiket listesi; varsayılan değer: []

Paketteki diğer tüm hedefler için geçerli olan meta veri hedeflerinin varsayılan listesini ayarlar. Bunlar genellikle OSS paketi ve lisans beyanlarıyla ilgili hedeflerdir. Örnekler için rules_license öğesine bakın.

default_testonly

Boole; belirtilenler hariç varsayılan değer False

Bu paketteki tüm kurallar için varsayılan testonly özelliğini ayarlar.

javatests altındaki paketlerde varsayılan değer True değeridir.

features

Liste dizeleri; varsayılan değer: []

Bu DERLEME dosyasının anlamını etkileyen çeşitli işaretler ayarlar.

Bu özellik genellikle özel işlem gerektiren paketleri etiketlemek için derleme sisteminde çalışan kişiler tarafından kullanılır. Derleme sistemi üzerinde çalışan biri tarafından açıkça istenmediği sürece bunu kullanmayın.

Örnekler

Aşağıdaki beyanda, bu paketteki kuralların yalnızca //foo:target paket grubunun üyeleri tarafından görülebileceği belirtilmektedir. Bir kuraldaki bağımsız görünürlük bildirimleri (varsa), bu spesifikasyonu geçersiz kılar.
package(default_visibility = ["//foo:target"])

package_group

package_group(name, packages, includes)

Bu işlev, bir paket grubunu tanımlar ve bir etiketi grupla ilişkilendirir. Etikete visibility özelliklerinde referans verilebilir.

Paket grupları temel olarak görünürlük kontrolü için kullanılır. Herkese açık bir hedefe, kaynak ağaçtaki her paketten referans verilebilir. Gizli olarak görünür bir hedefe yalnızca kendi paketinde referans verilebilir (alt paketlere izin verilmez). Bu uç noktalar arasında bir hedef, kendi paketine ve bir veya daha fazla paket grubu tarafından tanımlanan herhangi bir pakete erişime izin verebilir. Görünürlük sistemiyle ilgili daha ayrıntılı açıklama için görünürlük özelliğine bakın.

Belirli bir paket, packages özelliğiyle eşleşiyor veya includes özelliğinde belirtilen diğer paket gruplarından birinde bulunuyorsa grupta olarak kabul edilir.

Paket grupları teknik olarak hedeflerdir ancak kurallar tarafından oluşturulmaz ve görünürlük korumasına sahip değildir.

Bağımsız değişkenler

Özellik Açıklama
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

packages

Dize listesi; varsayılan: []

Sıfır veya daha fazla paket özelliğinden oluşan bir liste.

Her paket spesifikasyonu dizesi, aşağıdaki biçimlerden birine sahip olabilir:

  1. Paketin, deposu olmadan çift eğik çizgiyle başlayan tam adı. Örneğin //foo/bar, bu ada sahip olan ve paket grubuyla aynı depoda bulunan paketi belirtir.
  2. Yukarıdaki gibi, ancak /... ile birlikte. Örneğin //foo/..., //foo grubunu ve tüm alt paketlerini belirtir. //... mevcut depodaki tüm paketleri belirtir.
  3. Sırasıyla her paketi veya hiçbir paketi belirten public veya private dizeleri. (Bu form, --incompatible_package_group_has_public_syntax işaretinin ayarlanmasını gerektirir.)

Ayrıca ilk iki paket spesifikasyonu türünün, ters tutulduklarını belirtmek için önünde - öneki bulunabilir.

Paket grubu, pozitif özelliklerinden en az biriyle eşleşen ancak negatif özelliklerinden hiçbiriyle eşleşen bir paket içeriyor. Örneğin [//foo/..., -//foo/tests/...] değeri, aynı zamanda //foo/tests alt paketleri olmayan tüm //foo alt paketlerini içerir. (//foo'ın kendisi dahil edilir ancak //foo/tests kendisi dahil değildir.)

Herkese açık görünürlük dışında, mevcut deponun dışındaki paketleri doğrudan belirtmenin bir yolu yoktur.

Bu özellik eksikse boş bir listeye ayarlamak, yalnızca private içeren bir listeye ayarlamakla aynı şeydir.

Not: Bazel 6.0'dan önce //... spesifikasyonunun eski davranışı public ile aynıydı. Bu davranış, Bazel 6.0'dan sonra varsayılan olarak geçerli olan --incompatible_fix_package_group_reporoot_syntax etkinleştirildiğinde sabittir.

Not: Bu özellik, Bazel 6.0'dan önce bazel query --output=proto (veya --output=xml) öğesinin bir parçası olarak serileştirildiğinde baştaki eğik çizgiler atlanır. Örneğin //pkg/foo/..., \"pkg/foo/...\" olarak çıktı verir. Bu davranış, Bazel 6.0'dan sonra varsayılan olarak geçerli olan --incompatible_package_group_includes_double_slash etkinleştirildiğinde düzeltilir.

includes

Etiket listesi; varsayılan değer: []

Buna dahil olan diğer paket grupları.

Bu özellikteki etiketler diğer paket gruplarına referans vermelidir. Başvurulan paket gruplarındaki paketler, bu paket grubunun parçası olarak alınır. Bu, geçişli bir durumdur. a paket grubu b paket grubunu, b paket grubunu da c paket grubunu içeriyorsa c içindeki her paket de a grubunun üyesi olur.

Reddedilen paket özellikleriyle birlikte kullanıldığında, her bir grup için paket grubunun önce bağımsız olarak hesaplandığını ve daha sonra sonuçların birlikte birleştirildiğini unutmayın. Bu, bir gruptaki reddedilen spesifikasyonların başka bir gruptaki spesifikasyonlar üzerinde herhangi bir etkisi olmadığı anlamına gelir.

Örnekler

Aşağıdaki package_group bildirimi, tropik meyveler içeren "tropik" adlı bir paket grubunu belirtir.

package_group(
    name = "tropical",
    packages = [
        "//fruits/mango",
        "//fruits/orange",
        "//fruits/papaya/...",
    ],
)

Aşağıdaki bildirimler kurgusal bir uygulamanın paket gruplarını belirtir:

package_group(
    name = "fooapp",
    includes = [
        ":controller",
        ":model",
        ":view",
    ],
)

package_group(
    name = "model",
    packages = ["//fooapp/database"],
)

package_group(
    name = "view",
    packages = [
        "//fooapp/swingui",
        "//fooapp/webui",
    ],
)

package_group(
    name = "controller",
    packages = ["//fooapp/algorithm"],
)

exports_files

exports_files([label, ...], visibility, licenses)

exports_files(), diğer paketlere aktarılan, bu pakete ait dosyaların listesini belirtir.

Bir paketin DERLEME dosyası, yalnızca exports_files() ifadesiyle açıkça dışa aktarılan başka bir pakete ait kaynak dosyalara doğrudan başvuruda bulunabilir. Dosyaların görünürlüğü ile ilgili daha fazla bilgi edinin.

Eski bir davranış olarak, bir kurala girdi olarak bahsedilen dosyalar da --incompatible_no_implicit_file_export işareti açılana kadar varsayılan görünürlükle dışa aktarılır. Ancak bu davranışa güvenilmemeli ve etkin bir şekilde taşınmamalıdır.

Bağımsız değişkenler

Bağımsız değişken, geçerli paketteki dosyaların adlarının bir listesidir. Görünürlük bildirimi de belirtilebilir. Bu durumda, dosyalar belirtilen hedefler tarafından görülebilir. Görünürlük belirtilmezse package işlevinde paketin varsayılan görünürlüğü belirtilmiş olsa bile dosyalar her paket tarafından görülebilir. Lisanslar da belirtilebilir.

Örnek

Aşağıdaki örnek, test_data paketinden bir metin dosyası olan golden.txt'i dışa aktarır. Böylece diğer paketler bu dosyayı örneğin, testlerin data özelliğinde kullanabilir.

# from //test_data/BUILD

exports_files(["golden.txt"])

yerküre

glob(include, exclude=[], exclude_directories=1, allow_empty=True)

Glob, belirli yol kalıplarıyla eşleşen tüm dosyaları bulan ve bunların yollarının yeni, değişebilir ve sıralanmış bir listesini döndüren yardımcı bir işlevdir. Glob yalnızca kendi paketindeki dosyaları arar ve yalnızca kaynak dosyaları (oluşturulan dosyaları veya diğer hedefleri değil) arar.

Dosyanın pakete bağlı yolu, include kalıplarından herhangi biriyle eşleşir ancak exclude kalıplarından hiçbiriyle eşleşirse kaynak dosyanın Etiketi sonuca dahil edilir.

include ve exclude listeleri, mevcut paketle göreli olan yol kalıpları içerir. Her kalıp, bir veya daha fazla yol segmentinden oluşabilir. Unix yollarında olduğu gibi bu segmentler / ile ayrılır. Kalıptaki segmentler, yolun segmentleriyle eşleştirilir. Segmentler, * joker karakterini içerebilir. Bu, dizin ayırıcısı / hariç olmak üzere yol segmentindeki herhangi bir alt dizeyle (boş alt dize dahil) eşleşir. Bu joker karakter, bir yol segmentinde birden fazla kez kullanılabilir. Buna ek olarak, ** joker karakteri sıfır veya daha fazla tam yol segmentiyle eşleşebilir ancak bağımsız bir yol segmenti olarak açıklanmalıdır.

Örnekler:
  • foo/bar.txt, bu paketteki foo/bar.txt dosyasıyla tam olarak eşleşir (foo/ bir alt paket değilse)
  • Dosya .txt ile bitiyorsa foo/*.txt, foo/ dizinindeki her dosyayla eşleşir (foo/ bir alt paket değilse)
  • foo/a*.htm*, foo/ dizinindeki a ile başlayan, rastgele bir dizeye sahip (boş olabilir), ardından .htm içeren ve başka bir rastgele dizeyle biten (foo/ alt paket olmadığı sürece) tüm dosyalarla eşleşir (ör. foo/axx.htm ve foo/a.html veya foo/axxx.html).
  • foo/*, foo/ dizinindeki her dosyayla eşleşir (foo/ bir alt paket değilse); exclude_directories değeri 0 olarak ayarlanmış olsa bile foo dizininin kendisiyle eşleşmez.
  • foo/**, paketin birinci düzey alt dizini olan foo/ altında, alt paket olmayan her alt dizindeki her dosyayla eşleşir. exclude_directories 0 olarak ayarlanırsa foo dizininin kendisi de kalıpla eşleşir. Bu durumda, ** dizininin sıfır yol segmentleriyle eşleştiği kabul edilir
  • **/a.txt, bu paketin dizinindeki a.txt dosya ve alt paket olmayan alt dizinler ile eşleşir.
  • **/bar/**/*.txt, bu paketin alt paket olmayan her bir alt dizinindeki her .txt dosyasıyla eşleşir. Sonuçta ortaya çıkan yoldaki en az bir dizin bar olarak adlandırılırsa (örneğin, xxx/bar/yyy/zzz/a.txt veya bar/a.txt) (** ifadesinin de sıfır segmentle eşleştiğini unutmayın) veya bar/zzz/a.txt
  • **, bu paketin alt paket olmayan her alt dizinindeki her dosyayla eşleşir
  • foo**/a.txt geçersiz bir kalıp, çünkü ** bağımsız bir segment olarak durmalıdır
  • / sonrasında tanımlanan ikinci segment boş bir dize olduğu için foo/ geçersiz bir kalıptır

exclude_directories bağımsız değişkeni etkinleştirilirse (1 olarak ayarlanır) tür dizini dosyaları sonuçlardan çıkarılır (varsayılan 1).

allow_empty bağımsız değişkeni False olarak ayarlanırsa sonuç boş liste olursa glob işlevi hata verir.

Bu konuda bazı önemli sınırlamalar ve uyarılar vardır:

  1. glob(), DERLEME dosyası değerlendirmesi sırasında çalıştığından glob() yalnızca kaynak ağacınızdaki dosyaları eşleştirir, hiçbir zaman oluşturulmamış dosyalarla eşleşir. Hem kaynak hem de oluşturulmuş dosyalar gerektiren bir hedef oluşturuyorsanız oluşturulan dosyaların açık listesini glob'a eklemeniz gerekir. :mylib ve :gen_java_srcs ile ilgili aşağıdaki örneğe bakın.

  2. Bir kural, eşleşen bir kaynak dosya ile aynı ada sahipse dosyayı "gölgelendirir".

    Bunu anlamak için glob() yönteminin bir yollar listesi döndürdüğünü unutmayın.Bu nedenle, diğer kuralların özelliğinde (ör. srcs = glob(["*.cc"])) glob() işlevinin kullanılması, eşleşen yolların açıkça listelenmesiyle aynı etkiye sahiptir. Örneğin, glob() değeri ["Foo.java", "bar/Baz.java"] sonucunu verir ancak pakette "Foo.java" adında bir kural da varsa (Bazel bu konuda uyarsa da buna izin verilir) glob() tüketicisi, "Foo.java" dosyası yerine "Foo.java" kuralını (çıkışları) kullanır. Daha fazla bilgi için GitHub sorunu #10395'e göz atın.

  3. Glob'lar, alt dizinlerdeki dosyaları eşleştirebilir. Alt dizin adlarına da joker karakter eklenebilir. Ancak...
  4. Etiketlerin paket sınırını geçmesine izin verilmez ve glob alt paketlerdeki dosyalarla eşleşmez.

    Örneğin, x/y paket olarak (x/y/BUILD olarak veya paket yolu üzerinde başka bir yerde) mevcutsa x paketindeki **/*.cc glob ifadesi x/y/z.cc içermez. Bu, glob ifadesinin sonucunun aslında DERLEME dosyalarının varlığına bağlı olduğu anlamına gelir. Yani x/y adında bir paket yoksa veya --deleted_packages işareti kullanılarak silindi olarak işaretlenmişse aynı glob ifadesi x/y/z.cc ifadesini içerir.

  5. Yukarıdaki kısıtlama, kullandıkları joker karakterlerden bağımsız olarak tüm glob ifadeleri için geçerlidir.
  6. Dosya adı . ile başlayan bir gizli dosya hem ** hem de * joker karakterleri ile tam olarak eşleşir. Gizli bir dosyayı bileşik kalıpla eşleştirmek istiyorsanız kalıbınızın . ile başlaması gerekir. Örneğin, * ve .*.txt, .foo.txt ile eşleşir ancak *.txt eşleşmez. Gizli dizinler de aynı şekilde eşleştirilir. Gizli dizinler, giriş olarak kullanılması gerekmeyen dosyalar içerebilir ve gereksiz yere glob'a neden olan dosyaların sayısını ve bellek tüketimini artırabilir. Gizli dizinleri hariç tutmak için bunları "hariç tutma" listesi bağımsız değişkenine ekleyin.
  7. "**" joker karakterinin yalnızca bir köşesi vardır: "**" kalıbı, paketin dizin yoluyla eşleşmiyor. Diğer bir deyişle, glob(["**"], exclude_directories = 0) mevcut paketin dizinindeki tüm dosya ve dizinleri geçişli olarak eşleştirir (ancak alt paket dizinlerine inmez; bununla ilgili bir önceki nota bakın).

Genel olarak, glob kalıp için yalnızca '*' kullanmak yerine uygun bir uzantı (ör. *.html) sağlamayı denemeniz gerekir. Daha belirgin olan ad, hem kendini belgelendirir hem de yedek dosyaları veya emacs/vi/... otomatik kaydedilen dosyaları yanlışlıkla eşleştirmenizi önler.

Derleme kuralları yazarken glob'un öğelerini numaralandırabilirsiniz. Bu sayede, örneğin her giriş için ayrı kurallar oluşturabilirsiniz. Aşağıdaki genişletilmiş glob örneği bölümüne bakın.

Yerküre Örnekleri

Bu dizindeki tüm Java dosyalarından ve :gen_java_srcs kuralıyla oluşturulan tüm dosyalardan oluşturulan bir Java kitaplığı oluşturun.

java_library(
    name = "mylib",
    srcs = glob(["*.java"]) + [":gen_java_srcs"],
    deps = "...",
)

genrule(
    name = "gen_java_srcs",
    outs = [
        "Foo.java",
        "Bar.java",
    ],
    ...
)

deneysel.txt hariç tüm txt dosyalarını dizin test verilerine dahil edin. Test verilerinin alt dizinlerindeki dosyaların dahil edilmeyeceğini unutmayın. Bu dosyaların dahil edilmesini istiyorsanız yinelemeli glob (**) kullanın.

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(
        ["testdata/*.txt"],
        exclude = ["testdata/experimental.txt"],
    ),
)

Yinelemeli Küre Örnekleri

Testin, testdata dizinindeki tüm txt dosyalarına ve alt dizinlerinden herhangi birine (ve bunların alt dizinlerine vb.) bağlı olmasını sağlayın. DERLEME dosyası içeren alt dizinler yoksayılır. (Yukarıdaki sınırlamalara ve uyarılara bakın.)

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(["testdata/**/*.txt"]),
)

Bu dizindeki tüm Java dosyalarından ve yolunda test adlı bir dizin bulunanlar hariç tüm alt dizinlerden oluşturulan bir kitaplık oluşturun. Derleme artımlılığını azaltıp derleme sürelerini artırabileceği için bu düzenden mümkünse kaçınılmalıdır.

java_library(
    name = "mylib",
    srcs = glob(
        ["**/*.java"],
        exclude = ["**/testing/**"],
    ),
)

Genişletilmiş Yerküre Örnekleri

Geçerli dizinde, dosyadaki satır sayısını sayan bağımsız bir *_test.cc parametresi oluşturun.

# Conveniently, the build language supports list comprehensions.
[genrule(
    name = "count_lines_" + f[:-3],  # strip ".cc"
    srcs = [f],
    outs = ["%s-linecount.txt" % f[:-3]],
    cmd = "wc -l $< >$@",
 ) for f in glob(["*_test.cc"])]

Yukarıdaki DERLEME dosyası //foo paketindeyse ve paket üç eşleşen dosya içeriyorsa (a_test.cc, b_test.cc ve c_test.cc) bazel query '//foo:all' öğesini çalıştırmak, oluşturulan tüm kuralları listeler:

$ bazel query '//foo:all' | sort
//foo:count_lines_a_test
//foo:count_lines_b_test
//foo:count_lines_c_test

seç

select(
    {conditionA: valuesA, conditionB: valuesB, ...},
    no_match_error = "custom message"
)

select(), bir kural özelliğini yapılandırılabilir hale getiren yardımcı işlevdir. Herhangi bir özellik atamasının neredeyse sağ tarafıyla değiştirilerek değeri, komut satırı Bazel işaretlerine bağlıdır. Örneğin bunu, platforma özel bağımlılıkları tanımlamak veya bir kuralın "geliştirici" ve "sürüm" modunda mı oluşturulduğuna bağlı olarak farklı kaynaklar yerleştirmek için kullanabilirsiniz.

Temel kullanım aşağıdaki gibidir:

sh_binary(
    name = "mytarget",
    srcs = select({
        ":conditionA": ["mytarget_a.sh"],
        ":conditionB": ["mytarget_b.sh"],
        "//conditions:default": ["mytarget_default.sh"]
    })
)

Bu, bir sh_binary öğesinin srcs özelliğini, yapılandırma koşullarını eşleşen değerlerle eşleyen bir select çağrısıyla normal etiket listesi atamasını değiştirerek yapılandırılabilir hale getirir. Her koşul, config_setting veya constraint_value için bir etiket referansıdır ve hedefin yapılandırması beklenen bir değer grubuyla eşleşirse bu durum "eşleşir". Ardından mytarget#srcs değeri, mevcut çağrıyla eşleşen etiket listesi olur.

Notlar:

  • Herhangi bir çağrıda tam olarak bir koşul seçilir.
  • Birden çok koşul eşleşiyorsa ve biri diğerlerinin uzmanlığıysa uzmanlık öncelikli olur. B koşulu, A ile tamamen aynı işaret ve kısıtlama değerlerine ve bazı ek işaretlere veya kısıtlama değerlerine sahipse B koşulu, A koşulunun uzmanlığı olarak kabul edilir. Bu, uzmanlık çözümünün aşağıdaki 2. Örnek'te gösterildiği gibi bir sıralama oluşturmak için tasarlanmadığı anlamına da gelir.
  • Birden çok koşul eşleşirse ve bir koşul diğer tüm koşulların uzmanlığı değilse Bazel, tüm koşullar aynı değere çözülmediği sürece bir hatayla başarısız olur.
  • Eşleşen başka bir koşul yoksa //conditions:default özel sözde etiket ile eşleşiyor olarak kabul edilir. Bu koşul dışarıda bırakılırsa hatadan kaçınmak için diğer kuralların eşleşmesi gerekir.
  • select, daha büyük bir özellik atamasının içine yerleştirilebilir. Dolayısıyla, srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...}) ve srcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]}) geçerli ifadelerdir.
  • select, hepsiyle olmasa da çoğu özellikle çalışır. Uyumsuz özellikler dokümanlarında nonconfigurable olarak işaretlenmiştir.

    alt paketler

    subpackages(include, exclude=[], allow_empty=True)

    subpackages(), dosyalar ve dizinler yerine alt paketleri listeleyen glob() işlevine benzer şekilde bir yardımcı işlevdir. glob() ile aynı yol kalıplarını kullanır ve şu anda yüklenen BUILD dosyasının doğrudan alt öğesi olan herhangi bir alt paketle eşleşebilir. Ayrıntılı açıklama ve dahil etme ve hariç tutma kalıplarına ilişkin örnekler için glob'a bakın.

    Döndürülen alt paketlerin sonuç listesi, sıralı düzendedir ve exclude içindekilerle değil, include içindeki belirtilen kalıplarla eşleşen geçerli yükleme paketine göre yollar içerir.

    Örnek

    Aşağıdaki örnekte foo/BUILD paketi için tüm doğrudan alt paketler listelenmektedir

    # The following BUILD files exist:
    # foo/BUILD
    # foo/bar/baz/BUILD
    # foo/bar/but/bad/BUILD
    # foo/sub/BUILD
    # foo/sub/deeper/BUILD
    #
    # In foo/BUILD a call to
    subs1 = subpackages(include = ["**"])
    
    # results in subs1 == ["sub", "bar/baz", "bar/but/bad"]
    #
    # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of
    # 'foo'
    
    subs2 = subpackages(include = ["bar/*"])
    # results in subs2 = ["bar/baz"]
    #
    # Since 'bar' is not a subpackage itself, this looks for any subpackages under
    # all first level subdirectories of 'bar'.
    
    subs3 = subpackages(include = ["bar/**"])
    # results in subs3 = ["bar/baz", "bar/but/bad"]
    #
    # Since bar is not a subpackage itself, this looks for any subpackages which are
    # (1) under all subdirectories of 'bar' which can be at any level, (2) not a
    # subpackage of another subpackages.
    
    subs4 = subpackages(include = ["sub"])
    subs5 = subpackages(include = ["sub/*"])
    subs6 = subpackages(include = ["sub/**"])
    # results in subs4 and subs6 being ["sub"]
    # results in subs5 = [].
    #
    # In subs4, expression "sub" checks whether 'foo/sub' is a package (i.e. is a
    # subpackage of 'foo').
    # In subs5, "sub/*" looks for subpackages under directory 'foo/sub'. Since
    # 'foo/sub' is already a subpackage itself, the subdirectories will not be
    # traversed anymore.
    # In subs6, 'foo/sub' is a subpackage itself and matches pattern "sub/**", so it
    # is returned. But the subdirectories of 'foo/sub' will not be traversed
    # anymore.
    

    Genel olarak, kullanıcıların bu işlevi doğrudan çağırmak yerine skylib'in "alt paketler" modülünü kullanması tercih edilir.