我需要跟踪用作规则一部分的编译器标志,例如when supplied as arguments to a function。摇晃是否可以跟踪与输入need
相同的标志,如输入?举一个简单的例子,我希望Shake在规则更改为将.o
而不是-O2
传递给C编译器时重建所有-O0
文件。
答案 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/test
和build/doc
,已经生成了不依赖于编译器标志的文件。
此方法的优点是您可以保留所有文件一次缓存,并且刷新调试或测试版本不会破坏opt之一。 缺点是它仅适用于一组硬编码 标志。但是添加新的模式也不难,您只需要一个新的 (目录,标志)配对。