当需要在不同的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中使用这些变量。