使用环境变量识别Cygwin,Linux,Windows

时间:2010-06-23 18:25:10

标签: windows linux makefile environment-variables detection

当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的最佳方法是什么?

4 个答案:

答案 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构建的操作系统。

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

答案 3 :(得分:0)

在Cygwin上,需要导出OSTYPE环境变量以使make可以看到它。