12.9 Make宏外壳

符合Posix制作在内部使用$(壳牌)宏生成shell进程并执行Make规则。这个是由提供的内置宏制作,但可以修改通过makefile或命令行参数。

不是所有的制作实现定义了这一点壳牌公司宏。Tru64系列制作是一个示例;此实现始终使用/垃圾桶/桶。因此,最好始终定义壳牌公司在里面您的生成文件。如果使用Autoconf,请执行以下操作

SHELL=@外壳@

如果您使用Automake,这就为您完成了。

不要强迫外壳=/bin/sh因为这是不对的无处不在。记得,/垃圾桶/桶Posix在许多方面都不兼容系统,如FreeBSD 4、NetBSD 3、AIX 3、Solaris 10或Tru64。此外,DJGPP缺乏/垃圾桶/桶,以及何时GNU(全球导航单元)制作端口看到这样的设置,它会输入一个特殊仿真模式,其中管道和重定向等功能在DOS上模拟命令程序。不幸的是仿真不完整;例如,它不处理命令替换。使用@壳牌公司@意味着您的makefile将从相同的改进外壳中获益,例如猛击科什,这是在配置,所以你不是在与两组不同的shell bug作斗争上下文。

符合Posix制作永远不会获得$(壳牌)来自环境,即使在品牌-e已使用(否则,想想如果外壳=/bin/tcsh).

但并非所有制作实现有这个异常。例如,Tru64制作没有保护壳牌公司,因为它不使用它。

$cat生成文件外壳=/bin/shFOO=FOO全部:@echo$(壳牌)@回声$(FOO)$env SHELL=/bin/tcsh FOO=钢筋品牌-e#Tru64品牌/箱子/tcsh酒吧$env SHELL=/bin/tcsh FOO=bar gmake-e#GNU品牌/垃圾桶/桶酒吧

相反,制作不应将任何更改导出到壳牌公司子进程。同样,许多实现打破此规则:

$cat生成文件全部:@echo$(壳牌)@printenv外壳$env SHELL=sh make-e SHELL=/bin/ksh#BSD品牌,GNU品牌3.80/箱子/ksh/桶/ksh$env SHELL=sh gmake-e SHELL=/bin/ksh#GNU品牌3.81/箱子/ksh第页