用作规则目标的目标列表,但仅创建第一个目标。(Makefile)

list of targets used as target of a rule, but only the first one is made.. (Makefile)

这是 的后续问题。我改成了递归make风格。
这是 tree 命令输出。

.
|-- build
|   |-- test1
|   |   L-- Makefile.inc
|   L-- test2
|       L-- Makefile.inc
|-- common
|   L-- main.c
|-- Makefile
|-- test1
|   L-- testsrc
|       L-- test.c
|       L-- test.h
L-- test2
    L-- testsrc
        L-- test.c
        L-- test.h

这是文件内容。

./Makefile

test_list := test1 test2

.PHONY : $(test_list)
$(test_list) :
    make -C build/$@ -f Makefile.inc

# I want to merge the clean target but don't know how..
.PHONY: clean
clean:
    rm -f build/*/*.o
    rm -f build/test1/test1
    rm -f build/test2/test2

./common/main.c

#include <stdio.h>
#include "test.h"
extern void print_test();

int main(void)
{
print_test();
printf("X = %d\n", X);
return 0;
}

./test1/testsrc/test.c

#include <stdio.h>

void print_test()
{
printf("this is test1\n");
}

./test1/testsrc/test.h

#define X 1

./test2/testsrc/test.c

#include <stdio.h>

void print_test()
{
printf("this is test2\n");
}

./test2/testsrc/test.h

#define X 2

./build/test1/Makefile.inc

appname     := test1
perapp_srcdir := $(appname)/testsrc
target = $(appname)

$(target): test.o main.o
    echo " [LINK] $<"
    $(CC) $^ -o $@

main.o: ../../common/main.c
    echo " [CC  ] $<"
    $(CC) -c -I../../$(appname)/testsrc $< -o $@

%.o : ../../$(appname)/testsrc/%.c
    $(CC) -c $< -o $@
clean :
    rm -f $(appname) *.o

./build/test2/Makefile.inc

appname     := test2
perapp_srcdir := $(appname)/testsrc
target = $(appname)

$(target): test.o main.o
    echo " [LINK] $<"
    $(CC) $^ -o $@

main.o: ../../common/main.c
    echo " [CC  ] $<"
    $(CC) -c -I../../$(appname)/testsrc $< -o $@

%.o : ../../$(appname)/testsrc/%.c
    $(CC) -c $< -o $@
clean :
    rm -f $(appname) *.o

但是当我make时,只有第一个目标(test1)被创建了。
这是 make 的输出。

$make
make -C build/test1 -f Makefile.inc
make[1]: Entering directory '/home/ckim/testdir/testmake/testcvtestperappsrc/build/test1'
cc -c ../../test1/testsrc/test.c -o test.o
echo " [CC  ] ../../common/main.c"
 [CC  ] ../../common/main.c
cc -c -I../../test1/testsrc ../../common/main.c -o main.o
echo " [LINK] test.o"
 [LINK] test.o
cc test.o main.o -o test1
make[1]: Leaving directory '/home/ckim/testdir/testmake/testcvtestperappsrc/build/test1'

为什么没有启动 test2 的规则? (当我将顺序更改为test2 test1时,只进行了test2。

添加(答案):

According to Renaud Pacalet's answer, the revised top Makefile is like this.  
test_list := test1 test2


.PHONY : all $(test_list)
all : $(test_list)
$(test_list):
    make -C build/$@ -f Makefile.inc

del_list := $(foreach t, $(test_list), build/$(t)/$(t))
.PHONY: clean
clean:
    rm -f build/*/*.o
    rm -f $(del_list)

默认情况下,make 会尝试构建它找到的第一个显式目标(test1 在您的例子中)。添加一个依赖于所有其他目标的虚假目标,并将其置于首位使其成为默认目标:

test_list := test1 test2

.PHONY: all $(test_list)

all: $(test_list)

现在键入 makemake all 是一样的,make all 构建 test_list 变量中列出的所有目标。