0

我需要跟踪用作规则一部分的编译器标志,例如,当作为参数提供给函数时。Shake 是否有办法以与 相同的方式跟踪这些标志作为输入need?作为一个简单的例子,.o当规则更改为传递-O2给 C 编译器而不是-O0.

4

1 回答 1

0

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

1) 使用预言机

预言机非常符合您的要求。要跟踪类似 -O0vs-O2你需要一个跟踪优化级别的预言机:

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)使用不同的输出文件

对于编译器标志,另一种方法是使用不同的构建目录,即 so build/opt(等)具有使用、不使用、使用分析标志和使用测试标志构建的build/opt/obj二进制文件和.o文件。其他一些,比如and ,已经生成了不依赖于编译器标志的文件。-Obuild/debugbuild/profilebuild/testbuild/docbuild/hsc

这种方法的优点是您可以一次缓存所有文件,并且刷新调试或测试版本不会破坏选项。缺点是它仅适用于一组硬编码标志。但是添加一个新模式也不难,你只需要一个新的 (directory, flags) 对。

于 2019-04-26T12:44:40.593 回答