4

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

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

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

4

1 回答 1

3

您所追求的功能是Development.Shake.FilePath.exe,它可以"exe"在 Windows 和""所有其他平台上评估。你通常写:

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

有关示例,请参见Examples.Self.MainMain ,它在 Linux 和Main.exeWindows 上构建。

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

(\x -> drop 1 (takeExtension x) == exe) ?> \out ->
    ...
于 2013-09-10T08:02:23.397 回答