下一主题: DESTDIR, 上一主题: Makefile 中的实用程序, 上级主题: Makefile 约定 [目录][索引]
Makefile 应该提供变量来覆盖某些命令、选项等等。
特别是,您应该通过变量运行大多数实用程序。因此,如果您使用 Bison,请设置一个名为 BISON
的变量,其默认值设置为 ‘BISON = bison’,并在需要使用 Bison 时使用 $(BISON)
来引用它。
诸如 ln
、rm
、mv
等文件管理实用程序,不需要以这种方式通过变量引用,因为用户不需要用其他程序替换它们。
每个程序名变量都应该附带一个选项变量,用于为程序提供选项。将 ‘FLAGS’ 追加到程序名变量名,以获得选项变量名——例如,BISONFLAGS
。(C 编译器的名称 CFLAGS
,yacc 的名称 YFLAGS
以及 lex 的名称 LFLAGS
是此规则的例外,但我们保留它们,因为它们是标准的。)在任何运行预处理器的编译命令中使用 CPPFLAGS
,并在任何执行链接的编译命令以及任何直接使用 ld
时使用 LDFLAGS
。
如果有某些文件必须使用的 C 编译器选项才能正确编译,请不要将其包含在 CFLAGS
中。用户希望能够自由地指定 CFLAGS
。相反,通过在编译命令中显式编写或定义隐式规则,安排将必要的选项传递给 C 编译器,使其独立于 CFLAGS
,例如:
CFLAGS = -g ALL_CFLAGS = -I. $(CFLAGS) .c.o: $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
请在 CFLAGS
中包含 ‘-g’ 选项,因为它不是正确编译所必需的。您可以将其视为仅推荐的默认值。如果软件包的设置默认使用 GCC 编译,那么您不妨在 CFLAGS
的默认值中包含 ‘-O’。
将 CFLAGS
放在编译命令的最后,放在其他包含编译器选项的变量之后,以便用户可以使用 CFLAGS
来覆盖其他选项。
CFLAGS
应该在每次调用 C 编译器时使用,包括那些执行编译和执行链接的调用。
每个 Makefile 都应该定义变量 INSTALL
,它是将文件安装到系统中的基本命令。
每个 Makefile 还应该定义变量 INSTALL_PROGRAM
和 INSTALL_DATA
。(INSTALL_PROGRAM
的默认值应该是 $(INSTALL)
;INSTALL_DATA
的默认值应该是 ${INSTALL} -m 644
。)然后它应该将这些变量用作实际安装的命令,分别用于可执行文件和非可执行文件。这些变量的最小用法如下:
$(INSTALL_PROGRAM) foo $(bindir)/foo $(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a
但是,最好支持目标文件上的 DESTDIR
前缀,如下一节所述。
可以在一个命令中安装多个文件,最后一个参数是一个目录,这是可以接受的,但不是必需的,例如:
$(INSTALL_PROGRAM) foo bar baz $(bindir)
下一主题: DESTDIR, 上一主题: Makefile 中的实用程序, 上级主题: Makefile 约定 [目录][索引]