有条件地使用.exe扩展与Shake构建系统

时间:2013-09-10 06:56:47

标签: haskell shake-build-system

使用精彩的Shake构建系统,我想以一种与主机操作系统无关的方式编译项目。

我无法检测到二进制文件的存在,因为它们在系统之间具有不同的扩展名(即:Windows使用.exe)。

如果我使用need子句来检测是否存在所需的二进制文件,我该如何检查MainMain.exe,具体取决于主机是Linux还是Windows?

1 个答案:

答案 0 :(得分:3)

您所使用的功能是Development.Shake.FilePath.exe,它在Windows上评估为"exe",在所有其他平台上评估为""。你通常写道:

want ["MyExecutable" <.> exe]
"MyExecutable" <.> exe *> \out ->
    cmd "MyCompiler" "-o" [out]

有关示例,请参阅Examples.Self.Main,它在Linux上构建Main,在Windows上构建Main.exe

唯一可能的问题是*>左侧的所有文件模式都必须是唯一的。如果你定义"//*" <.> exe *> ...,那么在Windows上只会匹配可执行文件(好)但在Linux上会匹配每个文件,与所有其他模式(坏)冲突。解决方案是使可执行名称以某种方式区分,例如,将它们放在一个特殊的输出目录中,将名称硬编码为"Main" <.> exe等。或者,您可以依赖于只有可执行文件在Linux上没有扩展名的事实:

(\x -> drop 1 (takeExtension x) == exe) ?> \out ->
    ...