在下面的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
实现目标的正确方法是什么?
问题是,当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
您似乎正在尝试使用特定于目标的变量,尤其是它们的继承功能,以实现您的目标。
但是,由于the documentation中的此语句,这无法正常工作:
与自动变量一样,这些值仅在目标配方的上下文中(以及在其他特定于目标的分配中)可用。
这意味着先决条件中的$(TARGET)
:
wat: $(TARGET).c
在解析makefile时评估,而不是在调用struct
规则时评估,并扩展为:
wat: .c
[我看到Ondrej提供了一个答案,所以我将在这里停止:)