直到现在我有以下代码:
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
文件夹中相应地构建我的中间文件。
但是现在我不使用命令行标志,而是希望用于构造规则名称的共享 arch 变量根据某些命令的输出来填充,例如,如果我可以定义一些顶级操作,它将是这样的:
Stdout sout <- quietly $ cmd (EchoStdout False) (EchoStderr False) "gcc -dumpmachine" :: Action (Stdout String)
let foundArch = show (gccTripletToArch sout)
mainTgt
并在构造andbuildDir
名称时使用变量 foundArch 而不是 arch 。显然这是无法做到的,因为即使是可以使用action
函数返回的唯一顶级规则Rule ()
。我能做什么呢?