0

関数の引数として指定された場合など、ルールの一部として使用されるコンパイラ フラグを追跡する必要があります。Shake には、そのようなフラグを と同じように入力として追跡する方法がありneedますか? 些細な例として、.oルールが変更されたときに Shake がすべてのファイルを再構築し-O2て、-O0.

4

1 に答える 1

0

最適化を使用するかどうかなどを追跡するには、2 つのアプローチがあります。

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/objetc) には、プロファイル フラグあり、なし、プロファイル フラグあり、およびテスト フラグありで.oビルドされたバイナリとファイルがあります。や のように、コンパイラ フラグに依存しないファイルを生成するものもあります。-Obuild/debugbuild/profilebuild/testbuild/docbuild/hsc

このアプローチの利点は、すべてのファイルを一度にキャッシュしたままにできることと、デバッグまたはテスト ビルドを更新しても、選択したビルドが破棄されないことです。欠点は、ハードコードされた一連のフラグのみを対象としていることです。しかし、新しいモードを追加することも難しくありません。新しい (ディレクトリ、フラグ) ペアが必要なだけです。

于 2019-04-26T12:44:40.593 に答える