当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的最佳方法是什么?
答案 0 :(得分:5)
Cygwin和(在Ubuntu上测试)Linux提供了一个$OSTYPE
环境变量,对于Cygwin设置为cygwin
,为(Ubuntu)Linux设置为linux-gnu
。
Windows没有此变量,因此它似乎是您唯一需要的变量。我想有可能你的 Linux没有提供它,在这种情况下你可以使用$OSTYPE
来区分Windows和Cygwin然后再回到uname
来获取Cygwin vs Linux。
答案 1 :(得分:1)
根据pkh的提议,区分Windows /不使用SHELL的Windows不适用于我。看来SHELL变量是在gmake运行的makefile中定义的(我的版本是3.81),它等于“sh.exe”。因此,对我来说当前的工作解决方案是通过.exe Windows可执行文件扩展名来区分pkh的想法:
ifneq ($(findstring .exe,$(SHELL)),)
$(warning In Windows)
else
$(warning In Linux/Cygwin)
endif
答案 2 :(得分:0)
假设您的所有机器上都有gcc(即您使用makefile编译某些内容),您可以使用
gcc -dumpmachine
找出gcc构建的操作系统。
您可以使用输出设置一些变量,例如WINDOWS
,LINUX
或直接存储它们以便使用这些信息。
答案 3 :(得分:0)
在Cygwin上,需要导出OSTYPE环境变量以使make可以看到它。