使通配符目标始终得到无所事事

make wildcard target always get Nothing to be done

我编写了一个 makefile,其中包含一些用于构建和 运行ning 的通配符目标。 我的 makefile 内容如下。

ALL_EXES=$(shell ls *.exe 2>/dev/null)
.PHONY:  all clean $(ALL_EXES) foo

CC=gcc
CFLAGS=-g -Wall
GTKFLAGS=$(shell pkg-config --cflags gtk+-3.0)
GTKLIBS=$(shell pkg-config --libs gtk+-3.0)
PWD=$(shell pwd)

clean:
    @echo cleanning
    $(shell sh -c "rm *.exe 2>/dev/null")

%: %.c
    $(CC) $(GTKFLAGS) -o $@ $< $(GTKLIBS) $(CFLAGS) 

%.exe: %
    @echo running $@
    $(shell sh -c "$(PWD)/$@")

我可以 运行 make some-program 成功,但是当我 运行 make some-program.exe.

%: %.c 应该是 %.exe: %.c ,因为这是根据 .c 来源创建 .exe 文件的规则。

%.exe: % 应该是别的东西,例如run: foo.exe .

最后,我的解决方法 makefile 如下。

ALL_EXES=$(shell ls *.exe 2>/dev/null)
.PHONY:  all clean

CC=gcc
CFLAGS=-g -Wall
GTKFLAGS=$(shell pkg-config --cflags gtk+-3.0)
GTKLIBS=$(shell pkg-config --libs gtk+-3.0)
PWD=$(shell pwd)

clean:
    @echo cleanning $(shell ls *.exe 2>/dev/null)
    $(shell sh -c "rm *.exe 2>/dev/null")

%.exe: %.c
    @echo building $<
    $(CC) $(GTKFLAGS) -o $@ $< $(GTKLIBS) $(CFLAGS) 

run_%.exe: %.exe
    @echo running $<
    $(PWD)/$<

example-stack.exe: example-stack.c stack.c
    $(CC) -I. -o $@ $^ $(CFLAGS)