如何在摇动中构建变体?
How to do build variants in shake?
如何在shake中传递参数,然后在我们的规则中使用?我想做一些等价物:
make ARCH=x86_64
或
make DEBUG=YES
等...
现在我一直在使用环境变量和 getEnv
函数来模拟这些。
我怎样才能依赖给定的参数(环境变量),以便它可以在构建中读取一次,将它存储在某个地方并从多个规则访问它?
例如现在我在多个规则中多次执行 getEnv 但在编译期间环境变量可能会改变。另外,例如,调试标志可以同时更改编译器和 linker 标志,这意味着信息需要在 link 和编译输出规则中可用。
您现有的使用环境变量的方法应该有效,并且由于环境变量已经被 Shake 跟踪,一种方法是解析 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 = ...
由于环境变量是进程(及其子进程)的本地变量,因此这可能会正常工作。
当然,在环境变量中存储这样的信息有点难看。您可以创建自己的 oracle 来存储信息:
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
将其存储在 oracle 中,它仍将被跟踪并且不会与任何其他环境变量冲突件.
如何在shake中传递参数,然后在我们的规则中使用?我想做一些等价物:
make ARCH=x86_64
或
make DEBUG=YES
等...
现在我一直在使用环境变量和 getEnv
函数来模拟这些。
我怎样才能依赖给定的参数(环境变量),以便它可以在构建中读取一次,将它存储在某个地方并从多个规则访问它?
例如现在我在多个规则中多次执行 getEnv 但在编译期间环境变量可能会改变。另外,例如,调试标志可以同时更改编译器和 linker 标志,这意味着信息需要在 link 和编译输出规则中可用。
您现有的使用环境变量的方法应该有效,并且由于环境变量已经被 Shake 跟踪,一种方法是解析 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 = ...
由于环境变量是进程(及其子进程)的本地变量,因此这可能会正常工作。
当然,在环境变量中存储这样的信息有点难看。您可以创建自己的 oracle 来存储信息:
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
将其存储在 oracle 中,它仍将被跟踪并且不会与任何其他环境变量冲突件.