Никак не получается создать правило средствами gnu make, которое собирало бы несколько целей со схожими именами.
Например, пусть есть проект с такой структурой (на самом деле файлов намного больше, но отдельные правила под каждый создавать не хочется)
exe
/obj
src
/lib/lib.c
/tests
/test-1.c
/test-2.c
makefile
подкаталоги «exe» пока пустые, о них позже.
имеющиеся файлы:
// lib.c
#include <stdio.h>
void print_nothing() {
printf("nothing ");
}
// test-1.c
#include <stdio.h>
void print_nothing();
int main() {
print_nothing();
printf("to say\n");
return 0;
}
// test-2.c
#include <stdio.h>
void print_nothing();
int main() {
print_nothing();
printf("to say again\n");
return 0;
}
и собственно сам makefile:
$ cat makefile
#!/usr/bin/make
MAKEFLAGS = -j 1
CC = gcc
#DOBJ = exe/obj/
#DMOD = exe/mod/
#DEXE = exe/
DOBJ = src/tests/
DMOD = src/tests/
DEXE = src/tests/
MKDIRS = $(DOBJ) $(DMOD) $(DEXE)
#auxiliary variables
COTEXT = "Compile $(<F)"
LITEXT = "Assemble $@"
DTESTS=src/tests/
TESTS=$(basename $(notdir $(wildcard $(DTESTS)/*.c)))
TESTSOBJ=$(addsuffix .o, $(TESTS))
$(info TESTS: $(TESTS))
$(info TESTSOBJ: $(TESTSOBJ))
all: $(DEXE)$(TESTS)
#building rules
$(DEXE)$(TESTS): %: $(MKDIRS) %.o
@echo $(LITEXT)
@$(CC) $(DOBJ)*.o -o $@
#compiling rules
$(DOBJ)lib.o: src/lib/lib.c
@echo $(COTEXT)
@$(CC) -c $< -o $@
$(DOBJ)$(TESTSOBJ): %.o: %.c \
$(DOBJ)lib.o
@echo $(COTEXT)
@$(CC) -c $< -o $@
– этот попытка использовать Static Pattern Rules.
Но в результате собирается только test-2
:
$ make
TESTS: test-2 test-1
TESTSOBJ: test-2.o test-1.o
Compile lib.c
Compile test-2.c
Assemble src/tests/test-2
make: *** No rule to make target 'test-1.c', needed by 'test-1.o'. Stop.
Уже пару дней не могу сообразить как это сделать, а создавать под сотню правил очень не хочется.
А вот теперь о подкаталогах в exe
: в makefile есть закоментированные строки
#DOBJ = exe/obj/
#DMOD = exe/mod/
#DEXE = exe/
и их предплагается использовать, взамен того, что используется ниже. То есть на самом деле всё ещё и усложняется тем, что цели объектных файлов и исполняемых файлов предполагается хранить отдельно от исходников.