使用美妙的 Shake 构建系统,我想以一种与主机操作系统无关的方式编译一个项目。
我无法检测二进制文件的存在,因为它们在系统之间具有不同的扩展名(即:Windows 使用.exe
)。
如果我使用need
子句来检测是否存在所需的二进制文件,我如何检查主机是 Linux 还是 Windows Main
?Main.exe
使用美妙的 Shake 构建系统,我想以一种与主机操作系统无关的方式编译一个项目。
我无法检测二进制文件的存在,因为它们在系统之间具有不同的扩展名(即:Windows 使用.exe
)。
如果我使用need
子句来检测是否存在所需的二进制文件,我如何检查主机是 Linux 还是 Windows Main
?Main.exe
您所追求的功能是Development.Shake.FilePath.exe
,它可以"exe"
在 Windows 和""
所有其他平台上评估。你通常写:
want ["MyExecutable" <.> exe]
"MyExecutable" <.> exe *> \out ->
cmd "MyCompiler" "-o" [out]
有关示例,请参见Examples.Self.MainMain
,它在 Linux 和Main.exe
Windows 上构建。
唯一潜在的麻烦是左侧的所有文件模式*>
必须是唯一的。如果您定义"//*" <.> exe *> ...
,那么在 Windows 上将只匹配可执行文件(好),但在 Linux 上将匹配每个文件,与所有其他模式发生冲突(坏)。解决方案是以某种方式使可执行文件名称不同,例如将它们放在特殊的输出目录中,将名称硬编码为"Main" <.> exe
等。或者,您可以依靠只有可执行文件在 Linux 上没有扩展名的事实:
(\x -> drop 1 (takeExtension x) == exe) ?> \out ->
...