如何使用gnuwin32 Makefiles执行powershell/cmd命令?

5
我尝试在Windows中使用类似curl、rm、start等命令的makefile指令,使用了如下的makefile处理器:http://gnuwin32.sourceforge.net/packages/make.htm。然而似乎不可能实现,我的命令集非常有限。有哪些方法可以扩展我的命令集呢?我将非常感激任何帮助,谢谢!

1
这是一个非常老的GNU make版本。您可以轻松地从源代码构建最新版本,或者您可以从Eli Zaretskii的ezwinports项目获取预构建的更新版本:https://sourceforge.net/projects/ezwinports/files/?source=navbar - MadScientist
感谢提供的信息 - 我很感激! - JFFIGK
2个回答

7
如果你满意于只使用Windows系统的解决方案,那么你可以直接从你的Makefile中调用powershell.exe来完成操作,就像在这个答案中所示的那样。
然而,我强烈建议避免使用类Unix的PowerShell命令别名,例如用于Invoke-WebRequest的curl和用于Remove-Item的rm,因为尽管它们的目的在抽象上是相似的,但是它们的语法通常非常不同。为了避免歧义,应该使用PowerShell本机命令名称。
请注意,使用“Shell := ”似乎被你链接的Windows版本的make忽略。
如果你想要跨平台兼容性:
  • either: Use WSL, which offers you a choice of Linux distros in which both make and the standard Unix utilities are natively available - you then need neither cmd.exe nor PowerShell.

  • and/or: Use PowerShell Core and invoke your commands as follows:

    pwsh -noprofile -command <your command> 
    
    • In a cross-platform solution that uses WSL on Windows, you can simplify invocations by declaring SHELL := pwsh -NoProfile at the top of the MakeFile, after which you can invoke PowerShell (Core) commands directly.

1
感谢您的进一步建议,也许我会选择Powershell Core,因为它具有更主观直观的命令结构,并且在当前用例中明确不适合Linux依赖(即使只是WSL)。我已经删除了该命令。 - JFFIGK
一个被 Powershell 咬伤的人发出了晚期警告:实际上并不存在“兼容性”。例如,当你尝试给 gcc 提供 -DTMSTMP=1553521024.52 时,Powershell 无法正确解析命令行,导致你得到完全难以理解的错误信息“找不到 .52 文件”。我放弃了使用 Powershell 来完成这样的任务,因为它与 Unix shell 差异太大,使得兼容性成为一个没有价值的目标。 - Vroomfondel
2
@Vroomfondel,是的,那种行为 - 一个已知的错误 - 是不幸的;解决方法是引用参数('-DTMSTMP=1553521024.52')。还有另一个陷阱:带有嵌入式双引号的参数无法正确传递 - 参见这个答案。总的来说,PowerShell比其他shell要好得多,但我同意这些错误需要尽快修复。 - mklement0

4
你可以通过在相应的命令前加上powershell来使用PowerShell的功能。
例如:
.PHONY: psStuff

psStuff:
    powershell <your command>
    powershell curl google.de
    powershell rm -r folder
    powershell start yourwebsite.de

我不常使用Windows,但将SHELL变量设置为powershell(可能带有适当的路径)是否可行? - MadScientist
1
@MadScientist:建议不错,但似乎在这个 make 的 Windows 版本中完全忽略了 SHELL - mklement0
实际上,我正在寻找一个仅适用于Windows的解决方案,更具体地说,我只想摆脱wingnu32的有限和(未记录?)的功能。所以这是一个解决方案 :) - JFFIGK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接