使用环境变量识别Cygwin、Linux和Windows

3
问题出现在需要在不同的操作系统上运行makefile,并且根据操作系统设置正确的设置(转义、路径分隔符等)。第一种方法是使用Windows COMSPEC:
ifneq ($(COMSPEC)$(ComSpec),)
## in windows
else 
## in linux
endif

这是Cygwin的误报,因为它看到了Windows的环境变量,并将Cygwin检测为Windows。然后我们尝试了Linux PWD:

ifeq ($(PWD),)
## in windows
else 
## in linux, cygwin
endif

然而,由于我们整合了外部工具,我们在Windows中设置了PWD(Perl的一个模块)。因此,检测再次失败。

我想知道,使用环境变量区分Cygwin、Linux和Windows的最佳方法是什么?


可能是 https://dev59.com/PHRB5IYBdhLWcg3wH0SW 的重复问题。 - Alexander Torstling
谢谢,那可能将来也会对我有所帮助。实际上,这不是重复的问题,因为那个问题没有涉及Windows。 - pmod
4个回答

5
在Cygwin和(在Ubuntu上测试过的)Linux中,提供了一个名为$OSTYPE的环境变量,对于Cygwin设置为cygwin,对于(Ubuntu)Linux设置为linux-gnu
Windows没有这个变量,因此它似乎是你唯一需要的。我想可能会有你的Linux没有提供它的情况,这种情况下你可以使用$OSTYPE来区分Windows和Cygwin,然后对于Cygwin vs. Linux使用uname作为备选方案。

更新了一个看起来完全符合您需求的答案。 - pkh
根据问题描述,这个解决方案似乎是最适合的 - 接受它吧。 PS 看起来可以通过$OS环境变量的存在来区分是否为Windows操作系统。 - pmod
“Windows does not have this variable” - 这并不完全准确:git-bash也提供了自己的$OSTYPE shim(值为msys),因此如果您依赖其缺失进行检测,则可能错误地将Windows检测为非Windows。 - Eliran Malka

1

使用SHELL区分Windows和非Windows并不像pkh建议的那样对我起作用。看起来,由gmake运行的makefile中定义了SHELL变量(我的版本是3.81),它等于“sh.exe”。因此,对我来说,目前有效的解决方案是通过区分.exe Windows可执行文件扩展名来扩展pkh的想法:

ifneq ($(findstring .exe,$(SHELL)),)
    $(warning In Windows)
else
    $(warning In Linux/Cygwin)
endif

0
在Cygwin上,需要导出OSTYPE环境变量以便make命令能够识别它。

0
假设您的所有计算机上都有gcc可用(即,您正在使用makefile编译某些内容),则可以使用以下命令:
gcc -dumpmachine

查找gcc编译的操作系统。

您可以使用输出来设置一些变量,如WINDOWSLINUX,或直接存储以便使用这些信息。


我使用另一个编译器(专有的),检查了它的帮助文档,但没有找到类似的选项。实际上,这个问题涉及到使用环境变量和进行make操作。不管怎样,谢谢你的回答,如果我们切换到gcc,它可能会有所帮助。 - pmod
我刚有个想法,即使我们不使用gcc作为编译器,我们可能仅出于这个原因使用它——“识别操作系统”。使用编译器来检测操作系统是不是很奇怪?在我的网站上,对于Windows它显示为“mingw32”,对于Cygwin则显示为“i686-pc-cygwin”。所以,我想知道这个输出会有多么不同,用这个输出来区分操作系统是否会有问题? - pmod
你可以设置变量,例如WINDOWSLINUX,根据gcc -dumpmachine命令的已知结果来(un)set这些变量。比如,mingw32i686-pc-cygwin会设置WINDOWS变量,而x86_64-linux-gnu类似的结果会设置LINUX变量。当然,你也可以通过查找子字符串来简化这个过程。之后,你可以在你的makefile(s)的其余部分中使用这些变量。 - Veger

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