Makefile变量的Makefile通配符,用于定义通用规则 背景,我怀疑XY有问题
我在目录中有更简单的C模块。我想在子目录Makefile变量的Makefile通配符,用于定义通用规则 背景,我怀疑XY有问题,makefile,gnu-make,Makefile,Gnu Make,我在目录中有更简单的C模块。我想在子目录test/中为它们编写单元测试。这些单元测试只不过是链接到上面一个目录中被测试模块的C程序。我想要一个Makefile,它定义了几个构建目标,并允许我在一个步骤中或单独构建和运行测试可执行文件 我尝试的解决方案 我尝试了以下几点: CC = gcc CFLAGS = -ggdb -Wall -Wextra -Werror -O3 -std=c99 PARAM_LIST_TARGET = parameter_list_test PARAM_LIST_SOU
test/
中为它们编写单元测试。这些单元测试只不过是链接到上面一个目录中被测试模块的C程序。我想要一个Makefile
,它定义了几个构建目标,并允许我在一个步骤中或单独构建和运行测试可执行文件
我尝试的解决方案
我尝试了以下几点:
CC = gcc
CFLAGS = -ggdb -Wall -Wextra -Werror -O3 -std=c99
PARAM_LIST_TARGET = parameter_list_test
PARAM_LIST_SOURCE_FILES = \
../parameter_list.c \
parameter_list_test.c
PARAM_LIST_OBJECT_FILES := $(addsuffix .o,$(basename $(PARAM_LIST_SOURCE_FILES)))
TARGETS = $(PARAM_LIST_TARGET)
all: $(TARGETS)
$(%_TARGET): $(%_OBJECT_FILES)
$(CC) $(CFLAGS) $^ -o $@
.c.o:
$(CC) -c $< -o $@ $(CFLAGS)
clean:
$(RM) *.o $(TARGETS)
test: all
@for t in $(TARGETS) ; do ./$$t ; done
我知道%
适用于文件名,因此尝试在变量上使用它失败:
$(%_TARGET): $(%_OBJECT_FILES)
$(CC) $(CFLAGS) $^ -o $@
我如何编写一个规则,使Makefile变量\u TARGET
与其关联的\u OBJECT\u文件
相匹配,而不为每个测试目标创建一个
或者更重要的是,我应该怎么做完全不同
编辑:我看到了,但是它似乎只对每个可执行文件使用一个源文件。单独定义依赖项似乎有效,这要感谢: 这样就不需要重复规则(每个目标一个)。尽管如此,每个目标的依赖项的定义看起来都是重复的,为这些目标进行模式匹配会更好
除此之外,
OBJECT\u FILES
变量变得不必要。这项工作:
PARAM_LIST_TARGET = parameter_list_test
PARAM_LIST_SOURCE_FILES = \
../parameter_list.c \
parameter_list_test.c
$(PARAM_LIST_TARGET): $(addsuffix .o,$(basename $(PARAM_LIST_SOURCE_FILES))) # The dependencies directly
将最后一行作为所有目标的一条规则仍然感觉不错。类似于“对于以目标结尾的所有变量,构建对同名变量内容的依赖关系,但以源文件结尾。”您始终可以通过构建变量名称来访问
make
变量:
MY_VAR := "my var"
HIS_VAR := "his var"
HER_VAR := "her var"
CATS_VAR := "cats var"
DOGS_VAR := "dogs var"
ALL_PERSONS := MY HIS HER CATS DOGS
ALL_VARS := $(foreach p,$(ALL_PERSONS),$($(p)_VAR))
$(info $(ALL_VARS))
输出:
$ make
"my var" "his var" "her var" "cats var" "dogs var"
MY_VAR := "my var"
HIS_VAR := "his var"
HER_VAR := "her var"
CATS_VAR := "cats var"
DOGS_VAR := "dogs var"
ALL_PERSONS := MY HIS HER CATS DOGS
ALL_VARS := $(foreach p,$(ALL_PERSONS),$($(p)_VAR))
$(info $(ALL_VARS))
$ make
"my var" "his var" "her var" "cats var" "dogs var"