2017-02-15 51 views
5
$ python gencpp.py 

該命令在工作目錄中生成cpp文件foo.cpp在bazel版本中使用生成的代碼

我想bazel建設能夠包括foo.cppcc_binarysrcs屬性之前運行此命令。

我已經試過:

genrule(
    name = 'foo', 
    outs = ['foo.cpp'], 
    cmd = 'python gencpp.py', 
) 

cc_library(
    srcs = ['foo.cpp'], # tried also with :foo 
    ... 
) 

聲明輸出 '外部/ somelib/Foo.cpp中' 沒有被genrule創建。這可能是因爲genrule實際上沒有創建這個輸出,或者是因爲輸出是一個目錄而genrule是遠程運行的(請注意,只有聲明文件輸出的內容是從遠程運行的genrules複製的)。

我知道有一個解決方案需要gencpp.py稍微修改,但這不是我正在尋找的。

+0

我有一個相當類似的問題[stackoverflow/bazel-automated-generated-cpp-hpp-files](https://stackoverflow.com/questions/44312549/bazel-automatically-generated-cpp-hpp-files)。給出的答案可以完成這裏給出的答案。 –

回答

4

感謝@kristina的the answer

生成後,我必須將foo.cpp複製到outs目錄。

genrule(
    name = 'foo', 
    outs = ['foo.cpp'], 
    cmd = """ 
      python gencpp.py 
      cp foo.cpp [email protected] 
    """, 

) 
+0

複製技巧也適用於我。注意,當你有幾個輸出(我的腳本生成C++代碼,一個hpp文件和一個cpp文件)時,你必須使用:cp file.hpp $(@ D); cp file.cpp $(@ D); –

2

此命令生成在工作目錄以CPP文件foo.cpp

我會建議你改變這一點,所以,要麼:

  • 你寫的輸出由命令行標誌
  • 你寫輸出到標準輸出指定的文件。

然後你genrule命令可以是:分別

python gencpp.py [email protected] 

python gencpp.py > [email protected] 

由於Ulf Adams指出:

巴澤勒並行運行多個動作,而如果同樣的規則是一個工具的依賴,以及一個應用程序,它可能會嘗試在同一時間運行兩個,他們會相互覆蓋,可能會造成很糟糕的結果。

因此,最好避免編寫bazel沒有直接瞭解的輸出文件。

+1

實際上更糟。 Bazel並行運行多個操作,如果同一規則是工具和應用程序的依賴關係,則它可能會嘗試同時運行這兩個操作,並且它們會覆蓋對方,並可能導致非常糟糕的結果。 (雖然沒有啓用沙箱,但不是。) –

+0

@UlfAdams「這實際上更糟糕」,因爲「我的建議更糟糕」,或者「寫作和複製的後果比我建議的更糟糕」。後者是 –

+0

。寫入當前目錄然後複製或移動到目標的後果可能導致無聲破損。 –