我需要跟踪用作规则一部分的编译器标志,例如,当作为参数提供给函数时。Shake 是否有办法以与 相同的方式跟踪这些标志作为输入need
?作为一个简单的例子,.o
当规则更改为传递-O2
给 C 编译器而不是-O0
.
问问题
16 次
1 回答
0
有两种方法可以跟踪诸如是否使用优化之类的事情。
1) 使用预言机
预言机非常符合您的要求。要跟踪类似
-O0
vs-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 ,已经生成了不依赖于编译器标志的文件。-O
build/debug
build/profile
build/test
build/doc
build/hsc
这种方法的优点是您可以一次缓存所有文件,并且刷新调试或测试版本不会破坏选项。缺点是它仅适用于一组硬编码标志。但是添加一个新模式也不难,你只需要一个新的 (directory, flags) 对。
于 2019-04-26T12:44:40.593 回答