2017-04-17 184 views
1

我正在嘗試使用Bazel爲TensorFlow設置我的自定義編譯系統。 我需要在配置步驟中創建一個臨時文件,我將在構建步驟中將其用作緩存。 我能在我的.bzl文件來創建它:用Bazel創建和讀取臨時文件

repository_ctx.file(filename) 

而且一個配置後,我可以看到,它裏面的文件夾:

$HOME/.cache/bazel/_bazel_$USERNAME/%MD5%/external/%repository_name% 

其中repository_name實際上是repository_ctx.name

但是在構建時我無法從我的.tpl腳本訪問此路徑。我想通過替換repository_ctx.template從.bzl腳本發送它,但即使在這裏我還沒有找到如何找到這條路!

它看起來並不像我可以使用像bazel-out或bazel-genfiles這樣的符號鏈接來訪問這個文件夾(這聽起來很有前途,但不是......)。我也無法在該文件夾之外創建文件。

這是一個非常簡單的問題,我只是不能相信,還有比硬編碼路徑或find它沒有其他辦法...

回答

1

我猜問題是,你不揭請在回購的BUILD文件中爲您的構建文件使用它。你需要做的是這樣的:

repository_ctx.file('whatever') 
repository_ctx.file('BUILD', 'exports_files(["whatever"])') 

然後你就可以在任何其他構建文件使用@repository_name//:whatever

exports_files用於讓包依賴於來自其他包的源文件。

然後,在你的.bzl文件你在構建時加載的文件添加爲一個屬性,例如,

​​

然後,在規則執行,您可以通過上下文訪問:

def _impl(ctx): 
    print(ctx.file._my_external_src.path) 

.path獲取文件的路徑。

+0

哼,我明白了。所以我必須找到一種方法將這個'@repository_name //:whatever'從BUILD文件發送到tpl文件。我想我接受你的答案,謝謝! – Zakor

+1

沒問題!添加了如何從.bzl文件訪問它。 – kristina