使用环境variables识别Cygwin,Linux,Windows

当生成文件需要在不同的操作系统上运行时,问题就出现了,根据操作系统的不同,应该正确设置不同的设置(转义,path分隔符等)。 第一种方法是使用Windows COMSPEC:

ifneq ($(COMSPEC)$(ComSpec),) ## in windows else ## in linux endif 

这对于Cygwin来说是错误的,因为它会看到Windows的环境variables,并将Cygwin检测为Windows。 然后我们试了一下Linux的PWD:

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

但是,由于现场工具的集成,我们将PWD设置在windows(perl的模块之一)中。 所以,检测再次失败。

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

Cygwin和(在Ubuntu上测试)Linux提供$OSTYPE环境变量,设置为cygwin的Cygwin和(Ubuntu)Linux的linux-gnu

Windows没有这个变量,所以它似乎是你唯一需要的。 我想可能是你的 Linux不提供它,在这种情况下,你可以使用$OSTYPE来区分Windows和Cygwin,然后再回到Cygwin和Linux之间。

区分Windows /不使用SHELL的Windows不适用于我所提议的pkh。 在gmake(我的版本是3.81)运行的makefile中定义了SHELL变量,它等于“sh.exe”。 所以,对于我来说,目前的工作解决方案是通过.exe Windows可执行文件扩展名来区分pkh的思路:

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

假设你所有的机器上都有gcc可用(例如,你正在编译使用你的makefile的东西),你可以使用

 gcc -dumpmachine 

找出gcc构建的操作系统。

你可以使用输出来设置一些像WINDOWSLINUX这样的变量,或者直接存储它来使用这些信息。