2011-03-28 44 views
1

我已经看到这在各种安装程序中完成,但不幸的是,我实际上找不到如何做到这一点或记得哪些程序有这个功能,所以我可以从他们那里了解它。我希望编译一个共享库(不是autoconf/libtool,只是一个标准的makefile),并且希望make test能简单地编译examples目录下的所有文件,链接到刚建好的库(即../bin/libfoo.so.1.0.1Makefile,选择编译目录中的所有“示例”?

makefile格式为通配符编译提供了什么?

回答

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。但是,您只需要将名称一次添加到一行,并且它在那里很好。如果您想禁用它,请将违规行注释掉。它几乎是简化并显着更多地控制您的构建过程。

+0

这使得现在有了更多的意义,我很欣赏灵活性(将旧的/测试版存储在那里直到需要或删除),我会看看它是如何发展的,谢谢! – 2011-03-28 06:54:53