本章叙述为GNU程序书写Makefile的惯例。
Makefile的通用惯例
每个Makefile都应该包含这一行:
SHELL = /bin/sh
以避免那些由从环境中继承SHELL变量的系统带来的麻烦。 (GNU make永远不会出现这个问题。)
不要假定`.'出现在用于寻找可执行的命令的路径中。当你需要在make期间运行作为你的 包的一部分的程序时,如果程序是作为make的一部分而创建的,请确保它使用了`./',或者 如果文件是不会被改变的源代码的一部分,请确保它使用了`$(srcdir)/'。
如果运行`configure'时使用了选项`--srcdir',那么`./'与 `$(srcdir)/'之间的区别就十分重要。一下形式的规则:
foo.1 : foo.man sedscript
sed -e sedscript foo.man > foo.1
将在当前目录不是源代码目录的情况下导致错误,这是因为`foo.man'和`sedscript' 不在当前目录中。
在使用GNU make的时候,由于不论源文件在那里,`make'的自动变量`$<' 都将表示它,所以在只存在一个依赖文件的情况下,依靠`VPATH'来寻找源文件仍然是可行的。 (许多版本的make只在隐含规则中设置`$<'。)如下的makefile目标:
foo.o : bar.c
$(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o
将被如下目标所替代:
foo.o : bar.c
$(CC) $(CFLAGS) $< -o $@
以便使`VPATH'能够正确地工作。当目标含有多的依赖文件时,显式地使用`$(srcdir)' 让规则正常工作的最简单办法。例如,上述为`foo.1'而提供的目标最好被写作:
foo.1 : foo.man sedscript
sed -s $(srcdir)/sedscript $(srcdir)/foo.man > foo.1
Makefile中的工具
书写能够在sh,而不是在csh,中运行的Makefile命令(以及任何shell脚本,例如 configure)。不要使用任何ksh或者bash特殊的功能。
为创建和安装而提供的configure脚本和Makefile规则不要直接使用任何工具,除了以下的几个之外:
cat cmp cp echo egrep expr grep
ln mkdir mv pwd rm rmdir sed test touch
坚持使用这些程序通常支持的选项。例如,因为许多系统不支持`mkdir -p',尽管它可能有些方便, 但不要使用它。
为创建和安装而提供的Makefile规则还可以使用编译器和相关的程序,但应该通过make变量以便 用户对它们进行替换。下面是一些我们所说的相关的程序:
ar bison cc flex install ld lex
make makeinfo ranlib texi2dvi yacc
在你使用ranlib的时候,你应该测试它是否存在,并且仅仅在它存在的情况下运行它,以使得发布 版本在那些没有ranlib的系统中也能够工作。
如果你使用了符号连接,你应该为没有符号连接的系统实现一个替代手段。
你可以在只打算用于特定系统的Makefile的部分(或者脚本)中使用你能够确认在那些系统上存在的工具。
为用户提供的标准目标
所有的GNU程序应该在它们的Makefile中含有下列目标:
`all' 本文来自辣.文,论-文·网原文请找腾讯752018766
编译整个程序。它应该是缺省目标。这个目标不需要重新创建任何文档文件;Info文件被包含在发布版本中, 同时,只有在用户明确地要求创建DVI文件的时候才创建DVI文件。 `install'
上一页 [1] [2] [3] [4] [5] 下一页
计算机源代码编写规范GNU编码规范 第3页下载如图片无法显示或论文不完整,请联系qq752018766