2017-06-02 57 views
0

現在,我有一個非常愚蠢的漂亮打印腳本,它會做一些git-fu來查找文件來格式化(無條件地),然後通過clang格式運行它們-一世。這種方法有幾個缺點:如何集成漂亮打印作爲在bazel中構建的一部分

  1. 有某些文件是巨大的,永遠漂亮打印。
  2. 漂亮的打印總是完成,無論基礎文件是否實際更改。

在過去,我能夠做CMake的事情,有幾個不錯的性能,我想在巴澤爾重現:後

  1. 永遠只能建立代碼它已經通過掉毛了/漂亮的打印/等
  2. 只有皮棉/漂亮的打印/等東西已經改變
  3. 打印出更漂亮的東西,無論它是否是VC下或不

在CMake的土地中,我使用這種策略,通過使用SCons代理目標詭計啓發:

  1. 介紹一個虛擬的目標(例如源 - > source.formatted)。與這個目標關聯的動作做了兩件事:a)運行clang-format -i源代碼,b)輸出/觸摸一個名爲source.formatted的文件(這保證對於合理的文件系統,如果source.formatted比source更新,並不需要重新格式化)

  2. 添加它彙集所有的對應一個特定的庫/可執行目標的來源.formatted文件虛擬的目標(target_name.aggregated_formatted)

  3. 製作庫/可執行目標取決於target_name.aggregated_formatted作爲預構建步驟

任何幫助將不勝感激。

回答

1

您可能可以使用該方面。不確定的話,如果確實有可能的話,Bazel-dev可能會指出這一點。

如果您熟悉規則和動作等,快速和骯髒的方式(類似於CMake hackery)是編寫一個宏。對於例如cc_library你會做:

def clean_cc_library(name, srcs, **kwargs): 
    lint_sources(
     name = "%s_linted" % name, 
     srcs = srcs, 
) 

    pretty_print_sources(
     name = "%s_pretty" % name, 
     srcs = ["%s_linted"], 
) 

    return native.cc_library(
    name = name, 
    srcs = ["%s_pretty"], 
    **kwargs 
) 

那麼你當然需要clean_cc_library更換每cc_library。而lint_sourcespretty_print_sources是您必須自行實施並需要生成清理文件列表的規則。