我正在尝试编写一个简单且可移植的
Makefile
,可以使用gmake
和bmake
进行处理,因此我决定坚持使用隐式后缀规则作为避免语法不兼容的最可靠方法,例如所有目标先决条件的 $^
和 $>
变量。它们还共享一组通用变量,例如 CFLAGS
、CPPFLAGS
、LDFLAGS
和 LDLIBS
。
该项目是
dwm
,最终目标是从 dwm
编译的 dwm.c
可执行文件,并且还需要与 util.o
和 drw.o
目标文件链接。
我的第一次尝试是这样的规则:
dwm: util.o drw.o
dwm: LDLIBS += -lX11 -lXft -lfontconfig
我没有指定任何构建规则,只是设置了 FLAG,这与 GNU
make
完美配合。 BSD 给出了几乎相同的命令,除了最后一个命令看起来像这样:
cc -pipe -g -std=c99 -pedantic -Wno-deprecated-declarations -I/usr/include/freetype2 -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"6.4\" -o dwm dwm.c -lX11 -lXft -lfontconfig
即
drw.o
和 util.o
缺失,尽管它们是之前构建的。
原因是 BSD
make
仅使用 ${.IMPSRC}
(或 $<
)作为 .c
后缀规则,但是我真的不明白如何实现最简单的用例而不为每个用例编写自定义链接规则目标。请注意,我构建该项目没有问题,我只是在学习make
。
我对 BSD make 不熟悉。但是,如果二进制文件的默认后缀规则仅使用
$<
(或等效内容),则它已损坏,您必须替换它。您可以(应该能够)将其替换为以下内容:
.o:
$(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)