当生成文件需要在不同的操作系统上运行时,问题就出现了,根据操作系统的不同,应该正确设置不同的设置(转义,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构建的操作系统。
你可以使用输出来设置一些像WINDOWS
, LINUX
这样的变量,或者直接存储它来使用这些信息。