Bazel Build:Glob模式匹配

glob模式

glob模式也被常稱之為shell通配符,是一種特殊的模式匹配,通常用于匹配目錄以及文件,而非文本。

# 匹配任意長度任意字符
*   

# 匹配任意單個字符
?   

# 匹配指定范圍內(nèi)的單個字符
[list]

# 匹配指定范圍外的單個字符
[^list] [!list] 匹配指定范圍外的任意單個字符或字符集合

# 匹配str1或者集合
{str1,[list]}

# 遞歸的任意目錄
**

glob函數(shù)

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

Bazel中的glob函數(shù)是對glob模式匹配實現(xiàn)的簡化版,它在當前包中(不包括子包)匹配所有文件列表。一般地,文件路徑由/分割為多個路徑段組成;其中,*匹配路徑段中的零個或多個任意字符,**匹配任意的路徑段。

目前,Bazel實現(xiàn)的glob函數(shù)依舊不夠完善,它僅支持***的模式匹配,而不支持?,字符集合,及其大括號等模式。

只能匹配源文件,而不匹配派生文件

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

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

排除法

在當前包中,匹配testdata目錄下所有擴展名為txt的文本文件列表,但排除testdata/experimental.txt文件。注意,該規(guī)則不匹配testdata子目錄中的文件列表。

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

遞歸

在當前包中,匹配testdata目錄及子目錄中擴展名為txt的文本文件列表。

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

如果要匹配當前目錄,及其所有子目錄,則以**開頭。例如,當前目錄及其子目錄下所有java文件,當排除路徑名中包括testing的文件列表。

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

動態(tài)規(guī)則

如下代碼,可動態(tài)生成統(tǒng)計測試文件代碼行的規(guī)則列表。

# 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"])]

此時,通過bazel query可查詢出動態(tài)生成的規(guī)則列表。此處,//foo:all表示foo包下的所有規(guī)則,不包括文件。

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

可構建任意目標。執(zhí)行如下命令,將統(tǒng)計a_test.cc文件的代碼行,并將結(jié)果重定向至a_test-linecount.txt之中。

$ bazel build //foo:count_lines_a_test

查看結(jié)果,顯示22行。

$ cat bazel-bin/foo/a_test-linecount.txt
      22 foo/a_test.cc

Bazel的動態(tài)性,再加持Shell,可擴展的空間特別大,且語法是類Python的,相對Makefile非常易讀。CMake在可擴展性和可讀性,Bazel技高一籌。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 簡介 Bazel是一個類似于Make,Maven和Gradle的開源構建和測試工具。Bazel支持多種語言混編的項...
    小村醫(yī)閱讀 37,376評論 0 10
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,716評論 0 5
  • 個人學習批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復涉及到...
    Luckykailiu閱讀 4,990評論 0 11
  • 昨天,我是真的怕了。 晚上,在床上翻來覆去地睡不著,腦袋又特別疼。然后是想你,無休止地想你。 想來我是真的做錯了什...
    小頎閱讀 427評論 0 0
  • 【富厚日新】20180107學習力踐行Day89 邏輯狗3頁 英語4次10分鐘 希希讀了我要走了,我讀了另外三本開...
    綠葉上的陽光閱讀 136評論 0 0

友情鏈接更多精彩內(nèi)容