如何自动将“.s”添加到我的 Makefile 中的目标?

How can I automatically add '.s' to a target in my Makefile?

我有一个假 debugasm 目标。 debug 通过更新变量 CFLAGS 来工作,然后编译正常目标,它使用这些新的 CFLAGS 来生成调试符号。这按预期工作。

类似地,我想定义 asm 目标,设置 -S 开关并将输出名称从 file 更改为 file.s。但是,最后一部分不起作用,我得到:

$ make asm -B
gcc -fmessage-length=0 -ansi -pedantic -Werror -Wall -Wextra -Wwrite-strings -Winit-self -Wcast-align -Wcast-qual -Wpointer-arith -Wstrict-aliasing -Wformat=2 -Wmissing-declarations -Wmissing-include-dirs -Wno-unused-parameter -Wuninitialized -Wold-style-definition -Wstrict-prototypes -Wmissing-prototypes -Wdouble-promotion  -S -masm=intel file.c -o file

注意最后一部分 [..] -S -masm=intel file.c -o file 带有额外参数但没有 .s 扩展名。

我错过了什么?

生成文件:

TARGET=file
SOURCE=*.c
HEADERS=*.h
TESTS=*.sh
PROJECT=$(TARGET) $(SOURCE) $(HEADERS) $(TESTS) Makefile
CC=gcc
CFLAGS=\
-ansi \
-pedantic \
-Wall \

# makefile-rules that don't produce files directly
.PHONY: default  all debug asm

default: $(TARGET) 


# Compile 
$(TARGET): $(SOURCE) $(HEADERS) $(TESTS)
    $(CC) $(CFLAGS) $< -o $@

debug: CFLAGS += -DDEBUG -ggdb
debug: $(TARGET)

asm: CFLAGS +=-S -masm=intel
asm: TARGET +=.s <------------------ THIS LINE !!!!!!
asm: $(TARGET) 

您可以只向规则添加一个 $(TARGET).s 目标并在 asm:

中使用它
$(TARGET) $(TARGET).s: $(SOURCE) $(HEADERS) $(TESTS)
    $(CC) $(CFLAGS) $< -o $@

asm: CFLAGS += -S -masm=intel
asm: $(TARGET).s