Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile变量的Makefile通配符,用于定义通用规则 背景,我怀疑XY有问题_Makefile_Gnu Make - Fatal编程技术网

Makefile变量的Makefile通配符,用于定义通用规则 背景,我怀疑XY有问题

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

我在目录中有更简单的C模块。我想在子目录
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"