【已解决】在makefile中判断是cygwin还是Linux系统

【背景】

折腾:

【已解决】docbook中去make webhelp编译webhelp结果出错:Error: Could not find or load main class com.nexwave.nquindexer.IndexerMain

期间,需要去判断在makefile中,判断是否是cygwin

最好也要能判断出是否是Linux

【解决过程】

1.关于判断系统类型,之前就在makefile中见到很多个。

2.但是自己没有真正写过。

现在去找找,如何写比较通用,靠谱。

3.自己先去试了试:

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$ uname -r
1.7.24s(0.270/5/3)

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$ uname -a
CYGWIN_NT-6.1-WOW64 PC-20130611GART 1.7.24s(0.270/5/3) 20130830 16:14:01 i686 Cygwin

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$ uname
CYGWIN_NT-6.1-WOW64

4.参考:

Re: Newbie question – testing for OS. . .

去试试:

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$ uname -s
CYGWIN_NT-6.1-WOW64

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$ uname -r
1.7.24s(0.270/5/3)

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$ uname -m
i686

5.参考:

Re: check if cygwin in makefiles?

去试试:

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$ uname -o
Cygwin

6.然后,对于uname的各种参数,还是先要去搞清楚:

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$ uname --help
用法:uname [选项]...
输出一组系统信息。如果不跟随选项,则视为只附加-s 选项。

  -a, --all                     以如下次序输出所有信息。其中若-p 和
                                -i 的探测结果不可知则被省略:
  -s, --kernel-name             输出内核名称
  -n, --nodename                输出网络节点上的主机名
  -r, --kernel-release          输出内核发行号
  -v, --kernel-version          输出内核版本
  -m, --machine         输出主机的硬件架构名称
  -p, --processor               输出处理器类型或"unknown"
  -i, --hardware-platform       输出硬件平台或"unknown"
  -o, --operating-system        输出操作系统名称
      --help            显示此帮助信息并退出
      --version         显示版本信息并退出

请向bug-coreutils@gnu.org 报告uname 的错误
GNU coreutils 的主页:<http://www.gnu.org/software/coreutils/>
GNU 软件一般性帮助:<http://www.gnu.org/gethelp/>
请向<http://translationproject.org/team/zh_CN.html> 报告uname 的翻译错误
要获取完整文档,请运行:info coreutils 'uname invocation'

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$

然后就清楚了:

  • o==operating-system:操作系统类型
    • 所以此处是cygwin,是正常的
    • 估计Linux下,输出对应的类型
    • 猜测是Ubuntu输出是Ubuntu
  • r==kernel-release:内核发行版
  • m==machine:硬件架构
  • i==hardware-platform:
    • 此处我的cygwin下输出就是:unknown

7.所以,还是-o靠谱,输出是Cygwin。

但是,即使可以确定是Cygwin,但是也最好,先去全部转换为小写的cygwin,然后再去判断和”cygwin”是否相同,

所以要去:

【已解决】makefile中把字符串转换为小写或大写

 

【总结】

然后最后通过:

OS_NAME = $(shell uname -o)
LC_OS_NAME = $(shell echo $(OS_NAME) | tr '[A-Z]' '[a-z]')
ifeq ($(LC_OS_NAME), cygwin)
CUR_OS = "current os is cygwin"
else
CUR_OS = "current os not cygwin"
endif

checkos:
	echo $(CUR_OS)

实现了,判断出当前os是cygwin还是其他(比如linux):

当然cygwin下,可以判断出来是cygwin:

Administrator@PC-20130611GART /cygdrive/e/Dev_Root/docbook/tools/docbook-xsl-ns-1.78.1/webhelp
$ make checkos
echo "current os is cygwin"
current os is cygwin


发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量