在Shake Action中跟踪编译器标志

时间:2019-04-26 12:44:41

标签: shake-build-system

我需要跟踪用作规则一部分的编译器标志,例如when supplied as arguments to a function。摇晃是否可以跟踪与输入need相同的标志,如输入?举一个简单的例子,我希望Shake在规则更改为将.o而不是-O2传递给C编译器时重建所有-O0文件。

1 个答案:

答案 0 :(得分:0)

有两种方法可以跟踪诸如是否使用优化之类的事情。

1)使用Oracle

Oracle非常符合您的要求。跟踪类似 -O0-O2相比,您需要一个跟踪优化级别的Oracle:

newtype OptLevel = OptLevel ()
    deriving (Show,Typeable,Eq,Hashable,Binary,NFData)
type instance RuleResult OptLevel = String

rules = do
    addOracle $ \(OptLevel _) -> return $
        if <whatever you use to decide> then "-O0" else "-O2"

    "foo.o" %> \_ -> do
        level <- askOracle $ OptLevel ()
        cmd "gcc" level ...

现在,优化级别是一个跟踪的依赖项,如果有任何更改,它将更新。此示例基于addOracle的文档。

2)使用不同的输出文件

对于编译器标志,另一种方法是使用不同的构建目录,即build/opt(和build/opt/obj等)具有二进制文件和.o文件,这些文件是用-O,{{ 1}}不带,build/debug带概要分析标志,build/profile带测试标志。其他一些文件,例如build/testbuild/doc,已经生成了不依赖于编译器标志的文件。

此方法的优点是您可以保留所有文件一次缓存,并且刷新调试或测试版本不会破坏opt之一。 缺点是它仅适用于一组硬编码 标志。但是添加新的模式也不难,您只需要一个新的 (目录,标志)配对。