在 makefile 中创建相关性。
makedepend [ -DName=Def] [ -DName] [ -IIncludeDir ] [ -YIncludeDir ] [ -a ] [ -fMakeFile ] [ -oObjSuffix ] [ -pObjPrefix ] [ -sString ] [ -wWidth ] [ -v] [ -m ] [ --Options-- ] SourceFile ...
makedepend 命令按顺序读取每个 SourceFile,并且像 C 预处理器那样对其进行语法分析。它处理所有的 #include、#define、#undef、#ifdef、#ifndef、#endif、#if 和 #else 伪指令来确定在编译中需要用到哪些 #include 伪指令。任何 #include 伪指令都能够引用含有其它 #include 伪指令的文件,并且同样在那些文件中进行语法分析。
SourceFile 直接或间接包含的每个文件都被 makedepend 称为一个“相关性”。这些相关性以下列方式写到 makefile 中:在相关性更改时,make 命令能够确定必须重新编译哪些对象文件。
缺省情况下,如果名为 makefile 的文件存在,那么 makedepend 把它的输出就放到这个文件中,否则放到 Makefile 文件中。可以用 -f 标志指定一个备用 makefile。makedepend 首先在可用的文件中搜索这一行:
# DO NOT DELETE THIS LINE - makedepend 取决于它。
或者具有 -s 标志的一行作为相关性输出的定界符。如果它找到这一行,那么它将 makefile 中的这一行后面的所有内容删除,然后把输出放到这一行的后面。如果 makedepend 没有找到这一行,那么它将 makefile 的末尾附加到定界字符串,然后在这个字符串后面放置输出。
对于在命令行上出现的每一个 SourceFile,makedepend 在 makefile 中按以下格式放置各行。
SourceFile.o: dfile ...
其中,SourceFile.o 来自后缀被 .o 取代的命令行的名称,且 dfile 是一个相关性,当对 SourceFile 或其包含的一个文件进行语法分析时,在 #include 伪指令中出现该相关性。
此命令行中所用的算法假定所有通过单一 makefile 编译的文件将被大致以与 -I 和 -D 标志相同的方式编译,且在单一目录中的多数文件大部分包含相同的文件。
如果有这些假定,且在所有的源文件都由出现在命令行上的 makefile 来维护的情况下,makedepend 期望每一个 makefile 都被调用一次。它只对每个源文件和包含文件语法分析一次,且为每个文件维护一个内部符号表。结果是,命令行上的第一个文件花费的时间和正常的 C 预处理器花费的时间成比例。在后继的文件中,如果它遇到已经语法分析过的包含文件,那么它将不会再次语法分析。
例如,设想正在编译 file1.c 和 file2.c 这两个文件,每个文件都包含 header.h 头文件。header.h 文件包含 def1.h 文件和 def2.h 文件。
makedepend file1.c file2.c
那么 makedepend 将首先对 file1.c 进行语法分析,然后依次对 header.h、def1.h 和 def2.h 进行语法分析。然后它决定第一个文件的相关性是:
file1.o: header.h def1.h def2.h
但是当程序对第二个文件 file2.c 进行语法分析时,会发现它也包含 header.h,它并不对该文件进行语法分析,仅把 header.h、def1.h 和 def2.h 添加到 file2.o 的相关性列表。
注:如果没有 cpp(Berkeley C 预处理器)源,那么 makedepend 将以下列的方式编译:不管所有的 #if 伪指令的实际值而把它们都赋值为 False。这将导致错误的 #include 伪指令被赋值。在这些情况下,建议为 #if 表达式写一个新的解析器。下例明显地需要一个新的解析器:设想对 file1.c 和 file2.c 这两个文件进行语法分析,每个文件都包含 def.h 文件。当 def.h 被 file1.c 包含的时间先于它被 file2.c 包含的时间时,def.h 包含的文件列表可能有很大差别。但是一旦 makedepend 到达文件相关性列表时,它的特征便是固定的了。
注:makedepend 命令忽略它不认识的标志。标志的用途与 cc 命令类似。
通常地,makedepend 将用于 makefile 目标中,以便输入 makedepend 可更新 makefile 的相关性。
SRCS=file1.c file2.c ... CFLAGS=-O -DHACK -I../foobar -xyz depend: makedepend -- $(CFLAGS) -- $(SRCS)
cc 命令和 make 命令。