在makefile中获取没有扩展名的文件名

时间:2012-12-21 19:17:16

标签: makefile

我的 makefile 如下所示:

SRCS    = $(wildcard *.asm)
OBJS    = ${SRCS:.asm=.o}

# define a suffix rule for .asm -> .o
.asm.o : $(SRCS)
    nasm -f elf $<

all: $(OBJS)
    gcc -o ?? $<
           ^need the name of the target without file extension here ($* is blank)

但是,$*.asm.o内有效,但在all内空白。 如何在没有任何扩展名的情况下将gcc输出文件名设置为目标文件的文件名?

例如,我希望它执行以下操作(在nasm生成 .o 文件之后)

gcc filename filename.o

2 个答案:

答案 0 :(得分:6)

我认为你在寻找

.PHONY: all
all: $(patsubst %.o,%,$(OBJS))
%: %.o
    gcc -o $@ $<

您的尝试将定义一个目标all,它依赖于所有目标文件,就好像它包含所有目标文件一样;我认为你真的希望每个目标文件都是独立的,并且all目标依赖于它们。

(从技术上讲,您现在可以使用$*,因为在这种情况下它与$@相同,但这只是模糊不清。)

这与您现有的nasm规则基本上是同构的,除非没有后缀,否则不能使用后缀语法。换句话说,您的规则等同于

OBJS = $(patsubst %.asm,%.o,$(SRCS))
%.o: %.asm
    nasm -f elf $<

唯一剩下的区别是.PHONY声明,它只记录all不是文件名。

答案 1 :(得分:-1)

Use VAR = $(basename your_file.ext) <=> $(VAR) = your_file

假设您要从.o

中删除test.o
VAR = $(basename test.o)

导致$VAR包含“test”

See More Functions Here