我已经在各种安装程序中看到过这种情况,但不幸的是我实际上找不到如何做到这一点或记住哪些程序具有此功能,所以我可以从中学习。
我基本上正在编译共享库(不是使用autoconf / libtool,只是标准的makefile),并希望make test
能够简单地编译examples目录中的所有文件,链接到刚刚构建的库(即../bin/libfoo.so.1.0.1
)
makefile格式提供了什么来进行通配符编译?
答案 0 :(得分:1)
我知道你要求一种机制来自动构建目录中的所有源文件,但我不喜欢这种方法;在将来的某个时刻,需要禁用一两个单独的测试,并且你会做一些有点奇怪的事情,比如重新命名文件就不会自动编译。
我更喜欢列出您打算在Makefile
中构建的每个程序,但它不一定非常糟糕。对于某些suffix rules,您可以轻松地将所有.c
个文件构建到.o
个文件中,或直接构建到可执行文件中。
这是AppArmor回归测试套件的一个片段,这是典型的这类事情。 (我希望我复制了所有相关的部分,已经有几年了。)
SRC=access.c \
changeprofile.c \
changehat.c \
changehat_fork.c \
changehat_misc.c \
....
unlink.c \
xattrs.c
...
#only do the ioperm/iopl tests for x86 derived architectures
ifneq (,$(findstring $(shell uname -i),i386 i486 i586 i686 x86 x86_64))
SRC+=syscall_ioperm.c syscall_iopl.c
endif
...
LIBIMMUNIX:=$(shell if [ -f /usr/lib/libapparmor.so -o -f /usr/lib64/libapparmor.so ] ; then \
echo -lapparmor ; \
elif [ -f /lib/libimmunix.so.1 -o -f /lib64/libimmunix.so ] ; then \
echo -limmunix ; \
fi )
CFLAGS+=$(CHANGEHAT_FLAGS) -Wall -Wstrict-prototypes
LDLIBS+=$(LIBIMMUNIX)
EXEC=$(SRC:%.c=%)
...
all: $(EXEC) changehat.h
这并不像将新文件放入目录那么容易;您需要将其添加到Makefile
。但是你只需要将名称一次添加到一行,就可以了。如果要禁用它,请注释掉有问题的行。它几乎对构建过程的控制变得简单且显着。