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(perl 的模块之一)中设置了 PWD。因此,检测再次失败。

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

4

4 回答 4

5

Cygwin 和(在 Ubuntu 上测试)Linux 提供了一个$OSTYPE环境变量,设置为cygwin用于 Cygwin 和linux-gnu(Ubuntu)Linux。

Windows 没有此变量,因此它似乎是您唯一需要的变量。我想您的Linux 可能不提供它,在这种情况下,您可以使用$OSTYPE区分 Windows 和 Cygwin,然后回退到unameCygwin 与 Linux。

于 2010-06-23T18:31:11.663 回答
1

正如 pkh 所建议的那样,使用 SHELL 区分 Windows/非 Windows 对我不起作用。看来SHELL变量是在gmake运行的makefile中定义的(我的是3.81版),它等于“sh.exe”。所以,对我来说,目前的工作解决方案是通过 .exe Windows 可执行文件扩展名来扩展 pkh 的想法:

ifneq ($(findstring .exe,$(SHELL)),)
    $(warning In Windows)
else
    $(warning In Linux/Cygwin)
endif
于 2010-06-24T06:21:46.167 回答
0

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

gcc -dumpmachine

找出 gcc 构建的操作系统。

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

于 2010-06-25T08:11:03.483 回答
0

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

于 2018-12-06T01:18:54.303 回答