2

パラメータをシェイクで渡し、ルールで使用するにはどうすればよいでしょうか? 以下に相当するものをいくつか作成したいと思います。

make ARCH=x86_64
または
make DEBUG=YES など...

今のところ、環境変数とgetEnv関数を使用してこれらをシミュレートしています。
特定のパラメーター (環境変数) に依存関係を作成して、ビルドで一度読み取ってどこかに保存し、複数のルールからアクセスできるようにするにはどうすればよいですか?

たとえば、今のところ、複数のルールで getEnv を複数回実行していますが、コンパイル時に環境変数が変更される可能性があります。また、たとえば、デバッグ フラグはコンパイラ フラグとリンカー フラグの両方を変更できます。つまり、リンクとコンパイルの両方の出力規則で情報を使用できるようにする必要があります。

4

1 に答える 1

1

環境変数を使用する既存のアプローチは機能するはずです。環境変数は Shake によって既に追跡されているため、1 つのアプローチはDEBUG=YESそれを解析して環境変数に変換することです。例えば:

main = shakeArgsWith shakeOptions [] $ \_ args -> do
    let (vars,files) = partition ('=' `elem`) args
    forM_ vars $ \v -> let (a,'=':b) = break (== '=') v in setEnv a b
    return $ Just $ if null files then rules else want files >> withoutActions rules

rules :: Rules ()
rules = ...

環境変数はプロセス (およびその子プロセス) に対してローカルであるため、これはおそらく問題なく機能します。

もちろん、そのような情報を環境変数に保存するのは少し面倒です。代わりに、独自のオラクルを作成して情報を保存できます。

main = shakeArgsWith shakeOptions [] $ \_ args -> do
    let (vars,files) = partition ('=' `elem`) args
    let vars2 = [(a,b) | v <- vars, let (a,'=':b) = break (== '=') v]
    return $ Just $ do
        global <- addOracle $ \(Global x) -> return $ lookup x vars2
        if null files then rules global else want files >> withoutActions (rules global)

newtype Global = Global String deriving (Show,Typeable,Eq,Hashable,Binary,NFData)

rules :: (Global -> Action (Maybe String)) -> Rules ()
rules global = undefined

ここで、 を使用して環境変数に情報を書き込む代わりに、setEnvを使用してオラクルに情報を保存しaddOracleます。これは引き続き追跡され、他の環境変数と競合することはありません。

于 2015-10-06T20:41:01.280 に答える