2017-06-02 26 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是您必须自行实施并需要生成清理文件列表的规则。