12.9 Make宏外壳
符合Posix制作
在内部使用$(壳牌)
宏生成shell进程并执行Make规则。这个是由提供的内置宏制作
,但可以修改通过makefile或命令行参数。
不是所有的制作
实现定义了这一点壳牌公司
宏。Tru64系列制作
是一个示例;此实现始终使用/垃圾桶/桶
。因此,最好始终定义壳牌公司
在里面您的生成文件。如果使用Autoconf,请执行以下操作
如果您使用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第页