Makefile, возможность компилировать все "примеры" в каталоге? - PullRequest
1 голос
/ 28 марта 2011

Я видел, как это было сделано в различных установщиках, хотя, к сожалению, я не могу найти много информации о том, как это сделать, или вспомнить, какие программы имеют эту функцию, поэтому я могу научиться этому у них.

По сути, я собираюразделяемая библиотека (пока не с autoconf / libtool, просто стандартный make-файл) и желает, чтобы make test просто компилировал все файлы в каталоге примеров, связанные с только что созданной библиотекой (то есть ../bin/libfoo.so.1.0.1)

Что предоставляет формат makefile для этой компиляции с подстановочными знаками?

1 Ответ

1 голос
/ 28 марта 2011

Я знаю, что вы запрашиваете механизм для автоматической сборки всех исходных файлов в каталоге, но мне не нравится такой подход;в какой-то момент в будущем нужно будет отключить один или два отдельных теста, и вам придется делать что-то немного странное, например, переименовывать файл, просто чтобы он не был автоматически скомпилирован.

Я предпочитаю перечислять каждую программу, которую вы намереваетесь собрать в Makefile, но это не должно быть ужасно.С некоторыми суффиксными правилами вы можете легко встроить все свои .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.Но вам нужно только добавить имя, один раз, в одну строку, и оно там навсегда.Если вы хотите отключить его, закомментируйте оскорбительную строку.Это почти так же просто и значительно больше контроля над процессом сборки.

...