下一主题: , 上一主题: , 上级主题: Makefile 约定   [目录][索引]


7.2.3 用于指定命令的变量

Makefile 应该提供变量来覆盖某些命令、选项等等。

特别是,您应该通过变量运行大多数实用程序。因此,如果您使用 Bison,请设置一个名为 BISON 的变量,其默认值设置为 ‘BISON = bison’,并在需要使用 Bison 时使用 $(BISON) 来引用它。

诸如 lnrmmv 等文件管理实用程序,不需要以这种方式通过变量引用,因为用户不需要用其他程序替换它们。

每个程序名变量都应该附带一个选项变量,用于为程序提供选项。将 ‘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_PROGRAMINSTALL_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)

下一主题: , 上一主题: , 上级主题: Makefile 约定   [目录][索引]