今まで私は次のコードを持っていました:
shakeArgsWith opts additionalFlags $ \flags targets -> return $ Just $ do
...
-- Get target arch from command line flags
let givenArch = listToMaybe [v | AFlag v <- flags]
let arch = fromMaybe defArch givenArch
...
-- Set the main target
let outName = masterOutName projType toolchain projName
let mainTgt = (case projType of
Binary _ -> "bin"
Archive -> "lib")
</> prettyShowArch arch
</> show variant
</> outName
-- Set the build directory for the current run
let buildDir = bldDir </> show toolchain </> prettyShowArch arch </> show variant
...
mainTgt %> \out -> do ...
...
buildDir <//> "*.o" %> \out -> do ...
...
つまり、解析中のコマンド ライン フラグに従って作成されたルールの名前です (それらには arch 変数が含まれていました)。
したがって、私が与えた場合、ディレクトリshake --arch=x64
にメインターゲットを構築し、それに応じbin/x64/Release
てフォルダーに中間ビルドファイルを構築していましたtmp/x64/Release
。
しかし、コマンド ライン フラグを使用する代わりに、ルール名を作成するために使用される共有アーチ変数を、コマンドの出力に従って入力する必要があります。たとえば、最上位レベルのアクションを定義できる場合は、次のようになります。
Stdout sout <- quietly $ cmd (EchoStdout False) (EchoStderr False) "gcc -dumpmachine" :: Action (Stdout String)
let foundArch = show (gccTripletToArch sout)
mainTgt
との名前を作成するときに、アーチの代わりに変数 foundArch を使用しますbuildDir
。関数で作成できる唯一の最上位ルールでさえ をaction
返すため、明らかにこれは実行できませんRule ()
。代わりに何ができますか?