使用精彩的Shake构建系统,我想以一种与主机操作系统无关的方式编译项目。
我无法检测到二进制文件的存在,因为它们在系统之间具有不同的扩展名(即:Windows使用.exe
)。
如果我使用need
子句来检测是否存在所需的二进制文件,我该如何检查Main
或Main.exe
,具体取决于主机是Linux还是Windows?
答案 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 ->
...