我如何在 Windows 上的 GNU Make 运行 中配置永久 shell?

How do I configure a permanent shell in GNU Make running on Windows?

我正在维护一个包含数百个 C 和 C++ 文件的跨平台项目 (Linux/Windows/32/64)。为此,我使用了一个使用 GNU Make 的 makefile。 我在 Windows 中编译时出现问题,因为 Visual Studio (cl) 编译器强制我通过调用 vcvarsall.bat [platform_type] 来设置环境,并且每次都会执行此过程我编译了一个文件,整个过程在时间上非常昂贵。

部分生成文件

# C object file generation rule
../int/$(PROJECT)/%.o: ../%.c 
ifeq ($(OS),Windows_NT)
    @vcvarsall.bat x86 & cl $(CFLAGS) -c $(subst /,\,$<)
else
    @gcc $(CFLAGS) -c $<
endif
    

@vcvarsall.batx86这句,每编译一个文件就执行一次。有没有办法让这个语句只执行一次并且所有后续的 shell 都继承这个?

谢谢!

这确实是 Windows 开发中真正烦人的事情之一。

shell 无法在退出后将其值“传递”给下一个 shell。 make 也不可能启动一个 shell 然后 运行 那个 shell.

中的所有规则的食谱

您所能做的就是在父 shell 中设置一次值,然后从那里调用 make。最简单的方法是有一个 .bat 文件来做正确的事情,然后调用 make。您可以在 POSIX 系统上有一个类似名称的 shell 脚本,它除了调用 make 之外什么都不做。

如果您真的不想这样做,那么唯一的选择是使用递归 make 调用,其中顶级 make 将 运行 vcvarsall 脚本然后调用子 - make 这将编译所有的东西。