linux运行windows环境变量,使用环境变量识别Cygwin,Linux,Windows

当需要在不同的OS上运行makefile并根据OS正确设置各种设置(转义,路径分隔符等)时,就会出现问题。

第一种方法是使用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的最佳方法是什么?

可能重复的stackoverflow.com/questions/714100/os-detecting-makefile

谢谢,这也有可能对我有帮助。 实际上,这不是重复的,因为该问题不包括Windows。

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

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

+1,因为您的解决方案是目前最好的解决方案

更新后的内容似乎完全可以满足您的需求。

根据问题,此解决方案似乎是最合适的-接受它。 PS似乎是Windows,可以通过$ OS环境变量的存在来区分。

" Windows没有此变量"-并不是完全准确:git-bash还提供了自己的填充$OSTYPE(值为msys),因此如果您依赖于它,您可能会错误地将窗口检测为非窗口没有检测到。

如pkh所建议的那样,在Windows /非Windows之间使用SHELL进行区分对我不起作用。似乎SHELL变量是在gmake运行的makefile中定义的(mine是版本3.81),它等于" sh.exe"。因此,对我来说,当前可行的解决方案是通过.exe Windows可执行文件扩展名来区分扩展pkh的想法:

ifneq ($(findstring .exe,$(SHELL)),)

$(warning In Windows)

else

$(warning In Linux/Cygwin)

endif

在Cygwin上,需要导出OSTYPE环境变量以供make查看。

假设您的所有机器上都有可用的gcc(即您正在使用makefile进行编译),则可以使用

gcc -dumpmachine

找出gcc构建的操作系统。

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

我使用了另一个编译器(提示性编译器),检查了它的帮助,没有找到任何类似的选项。实际上,问题是关于使用环境变量和进行操作。无论如何,谢谢,如果我们切换到gcc可能会有所帮助。

我刚刚想到,即使我们不将gcc用作编译器,也只能出于这个原因使用它-"识别OS"。使用编译器检测OS似乎很奇怪。对于Windows,在我的网站上显示" mingw32",对于Cygwin显示" i686-pc-cygwin"。因此,我想知道这个输出可能有多大变化,并且通过此输出来区分是否会有问题?

好吧,您可以为gcc -dumpmachine命令的已知结果设置(取消)诸如WINDOWS或LINUX的变量,即mingw32和i686-pc-cygwin将设置WINDOWS变量,而诸如x86_64-linux-gnu的变量将LINUX变量。当然,您可以寻找子字符串来简化此过程。之后,您可以在其余makefile中使用这些变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值