関数の引数として指定された場合など、ルールの一部として使用されるコンパイラ フラグを追跡する必要があります。Shake には、そのようなフラグを と同じように入力として追跡する方法がありneed
ますか? 些細な例として、.o
ルールが変更されたときに Shake がすべてのファイルを再構築し-O2
て、-O0
.
1 に答える
最適化を使用するかどうかなどを追跡するには、2 つのアプローチがあります。
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
etc) には、プロファイル フラグあり、なし、プロファイル フラグあり、およびテスト フラグありで.o
ビルドされたバイナリとファイルがあります。や のように、コンパイラ フラグに依存しないファイルを生成するものもあります。-O
build/debug
build/profile
build/test
build/doc
build/hsc
このアプローチの利点は、すべてのファイルを一度にキャッシュしたままにできることと、デバッグまたはテスト ビルドを更新しても、選択したビルドが破棄されないことです。欠点は、ハードコードされた一連のフラグのみを対象としていることです。しかし、新しいモードを追加することも難しくありません。新しい (ディレクトリ、フラグ) ペアが必要なだけです。