用作规则目标的目标列表,但仅创建第一个目标。(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)
现在键入 make
或 make all
是一样的,make all
构建 test_list
变量中列出的所有目标。
这是
这是 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)
现在键入 make
或 make all
是一样的,make all
构建 test_list
变量中列出的所有目标。