如何构建具有相似名称的多个目标?
How to build multiple targets with similar name?
所以我和下面的问题完全一样,但是没有人回答。
Pattern matching Makefile with multiple executable targets
我正在尝试构建一系列小测试文件,每个文件都有一个 "test*.c" 模式来测试我的库。
我想编写一个 makefile,一次性为每个测试文件构建可执行文件(每个名称:test1、test2、test3..等)。但是,我不确定如何实现这一目标。
到目前为止我有以下内容:
SRC := $(shell find *.c)
ALL_PROG := $(patsubst %.c, %, *.c)
.PHONY: all
all: $(ALL_PROG)
$(ALL_PROG): $(SRC)
-gcc $< -o $@
这是一个糟糕的尝试,因为目标将所有.c 文件作为依赖项,这导致了循环依赖。
使用shell脚本可以很容易地完成工作,但我想知道是否有办法完成同样的工作。
提前致谢。
使用 $(ALL_PROG): %: %.c
而不是 $(ALL_PROG): $(SRC)
。
这是我可能会与 GNU 一起使用的 Makefile 示例 make
:
CC := gcc
CFLAGS := -Wall -O2
LDFLAGS := -lm
PROGS := $(patsubst %.c, %, $(wildcard *.c))
.PHONY: all clean test $(patsubst %, test@%, $(PROGS))
all: $(PROGS)
clean:
rm -f $(PROGS)
$(PROGS): %: %.c
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o $@
$(patsubst %, test@%, $(PROGS)): test@%: %
./$^
test: $(patsubst %, test@%, $(PROGS))
像往常一样,注意缩进应该使用制表符而不是空格; whosebug.com 此处使用的编辑器会自动将它们转换为空格。
PROGS
变量将包含目录中所有 *.c
个文件的名称。
.PHONY:
指令告诉 Make 哪些目标不引用实际文件。 $(patsubst %, test@%, $(PROGS))
扩展为可执行名称列表,每个名称都以 test@
为前缀:如果目录包含文件 foo.c
和 bar.c
,则扩展为 test@foo test@bar
.
$(PROGS): %: %.c
配方将每个 .c 文件编译成相应的二进制文件。
$(patsubst %, test@%, $(PROGS)): test@%: %
配方为每个二进制文件创建一个测试目标。如果我们有文件 foo.c
和 bar.c
,则此规则扩展为 test@foo test@bar: test@%: %
。这意味着对于 test@foo
和 test@bar
目标,相应的 test@%
目标需要 %
二进制文件。 ./$^
依次扩展为 ./%
,因此是二进制名称。 (如果您不希望 Make 显示命令为 运行,请使用 @./$^
。如果您不关心测试是否失败,请使用 -./$^
。)
如果我们有 foo.c
和 bar.c
,test
配方扩展为 test@foo
test@bar
;即所有可能的测试目标。
您可以运行 make clean test
重新编译目录下的所有.c文件,并执行。
如果你只担心一个特定的测试程序,比如foo.c
,你可以运行 make test@foo
,如果foo.c
比新的程序,它将重新编译程序foo
.
你可以的。我正在更新一个构建多个目标的简单 make 文件。您可以根据需要进行修改。
TEST1 = test1.exe
TEST2 = test2.exe
### Executable Program Files ###
all : $(TEST1) $(TEST2)
$(TEST1) : test1.c
gcc -o $(TEST1) test1.c
$(TEST2) : test2.c
gcc -o $(TEST2) test2.c
所以我和下面的问题完全一样,但是没有人回答。
Pattern matching Makefile with multiple executable targets
我正在尝试构建一系列小测试文件,每个文件都有一个 "test*.c" 模式来测试我的库。
我想编写一个 makefile,一次性为每个测试文件构建可执行文件(每个名称:test1、test2、test3..等)。但是,我不确定如何实现这一目标。 到目前为止我有以下内容:
SRC := $(shell find *.c)
ALL_PROG := $(patsubst %.c, %, *.c)
.PHONY: all
all: $(ALL_PROG)
$(ALL_PROG): $(SRC)
-gcc $< -o $@
这是一个糟糕的尝试,因为目标将所有.c 文件作为依赖项,这导致了循环依赖。
使用shell脚本可以很容易地完成工作,但我想知道是否有办法完成同样的工作。
提前致谢。
使用 $(ALL_PROG): %: %.c
而不是 $(ALL_PROG): $(SRC)
。
这是我可能会与 GNU 一起使用的 Makefile 示例 make
:
CC := gcc
CFLAGS := -Wall -O2
LDFLAGS := -lm
PROGS := $(patsubst %.c, %, $(wildcard *.c))
.PHONY: all clean test $(patsubst %, test@%, $(PROGS))
all: $(PROGS)
clean:
rm -f $(PROGS)
$(PROGS): %: %.c
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o $@
$(patsubst %, test@%, $(PROGS)): test@%: %
./$^
test: $(patsubst %, test@%, $(PROGS))
像往常一样,注意缩进应该使用制表符而不是空格; whosebug.com 此处使用的编辑器会自动将它们转换为空格。
PROGS
变量将包含目录中所有 *.c
个文件的名称。
.PHONY:
指令告诉 Make 哪些目标不引用实际文件。 $(patsubst %, test@%, $(PROGS))
扩展为可执行名称列表,每个名称都以 test@
为前缀:如果目录包含文件 foo.c
和 bar.c
,则扩展为 test@foo test@bar
.
$(PROGS): %: %.c
配方将每个 .c 文件编译成相应的二进制文件。
$(patsubst %, test@%, $(PROGS)): test@%: %
配方为每个二进制文件创建一个测试目标。如果我们有文件 foo.c
和 bar.c
,则此规则扩展为 test@foo test@bar: test@%: %
。这意味着对于 test@foo
和 test@bar
目标,相应的 test@%
目标需要 %
二进制文件。 ./$^
依次扩展为 ./%
,因此是二进制名称。 (如果您不希望 Make 显示命令为 运行,请使用 @./$^
。如果您不关心测试是否失败,请使用 -./$^
。)
如果我们有 foo.c
和 bar.c
,test
配方扩展为 test@foo
test@bar
;即所有可能的测试目标。
您可以运行 make clean test
重新编译目录下的所有.c文件,并执行。
如果你只担心一个特定的测试程序,比如foo.c
,你可以运行 make test@foo
,如果foo.c
比新的程序,它将重新编译程序foo
.
你可以的。我正在更新一个构建多个目标的简单 make 文件。您可以根据需要进行修改。
TEST1 = test1.exe
TEST2 = test2.exe
### Executable Program Files ###
all : $(TEST1) $(TEST2)
$(TEST1) : test1.c
gcc -o $(TEST1) test1.c
$(TEST2) : test2.c
gcc -o $(TEST2) test2.c