Makefile-将值设置为来自另一个规则的变量

问题描述 投票:0回答:2

在下面的makefile中,wat规则用于从.wat文件生成.c文件。

CC=emcc
CFLAGS= -O2 -s WASM=1 -s SIDE_MODULE=1
# flags are for not generating any emscripten glue code

# makes a .wat version of a .c file of specified name
# TARGET must be specified from command line
wat: $(TARGET).c
    $(CC) $(CFLAGS) -o $(TARGET).wasm $(TARGET).c && wasm2wat $(TARGET).wasm > $(TARGET).wat && rm $(TARGET).wasm

struct: TARGET = struct
struct: wat

clear:
    rm -f *.wasm *.wat

这样称呼,可以正常工作:

[user@pc]$ make wat TARGET=struct
emcc -O2 -s WASM=1 -s SIDE_MODULE=1 -o struct.wasm struct.c && wasm2wat struct.wasm > 
struct.wat && rm struct.wasm

[现在我想要一个更具体的规则,struct,如您所见。本质上,我想重用wat规则,只需确保在运行前将TARGET设置为“ struct”即可。但是,运行make struct会给我emcc一个no input file错误,好像TARGET的值不存在:

[user@pc]$ make struct
emcc -O2 -s WASM=1 -s SIDE_MODULE=1       -o .c
shared:ERROR: no input files

实现目标的正确方法是什么?

makefile pattern-matching
2个回答
1
投票

问题是,当make评估如何制定目标以及先决条件是什么时,TARGET未定义,因此规则说:wat需要.c。您可以尝试递归并说出类似这样的内容:

struct:
        $(MAKE) TARGET=struct wat

开头确实不是那么好,因为实际上没有文件生成wat,因此目标总是过时的,Makefile实际上只是一个美化的shell脚本。

您可能应该考虑编写一个模式规则,如何从.wat构建.c,类似(根据您的示例):

%.wat: %.c
        $(CC) $(CFLAGS) -o $(*F).wasm $< \
                && wasm2wat $(*F).wasm > [email protected] \
                && rm $(*F).wasm

然后您可以呼叫make struct.wat,如果您仍然想要(为方便起见)仅拥有struct目标,则可以添加:

.PHONY: struct

struct: struct.wat

1
投票

您似乎正在尝试使用特定于目标的变量,尤其是它们的继承功能,以实现您的目标。

但是,由于the documentation中的此语句,这无法正常工作:

与自动变量一样,这些值仅在目标配方的上下文中(以及在其他特定于目标的分配中)可用。

这意味着先决条件中的$(TARGET)

wat: $(TARGET).c

在解析makefile时评估,而不是在调用struct规则时评估,并扩展为:

wat: .c

[我看到Ondrej提供了一个答案,所以我将在这里停止:)

© www.soinside.com 2019 - 2024. All rights reserved.