我已经看到这在各种安装程序中完成,但不幸的是,我实际上找不到如何做到这一点或记得哪些程序有这个功能,所以我可以从他们那里了解它。我希望编译一个共享库(不是autoconf/libtool,只是一个标准的makefile),并且希望make test
能简单地编译examples目录下的所有文件,链接到刚建好的库(即../bin/libfoo.so.1.0.1
)Makefile,选择编译目录中的所有“示例”?
makefile格式为通配符编译提供了什么?
我已经看到这在各种安装程序中完成,但不幸的是,我实际上找不到如何做到这一点或记得哪些程序有这个功能,所以我可以从他们那里了解它。我希望编译一个共享库(不是autoconf/libtool,只是一个标准的makefile),并且希望make test
能简单地编译examples目录下的所有文件,链接到刚建好的库(即../bin/libfoo.so.1.0.1
)Makefile,选择编译目录中的所有“示例”?
makefile格式为通配符编译提供了什么?
我知道你正在寻求一种机制来自动构建目录中的所有源文件,但我不喜欢这种方法;在未来的某个时间点,一个或两个单独的测试需要被禁用,并且你会留下一些奇怪的东西,比如重命名一个文件,以免它自动被编译。
我更喜欢列出您打算在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
。但是,您只需要将名称一次添加到一行,并且它在那里很好。如果您想禁用它,请将违规行注释掉。它几乎是简化并显着更多地控制您的构建过程。
这使得现在有了更多的意义,我很欣赏灵活性(将旧的/测试版存储在那里直到需要或删除),我会看看它是如何发展的,谢谢! – 2011-03-28 06:54:53