我有测试项目文件夹结构视图:
TOPDIR
├── a
│ └── a.c
├── b
│ └── b.c
├── c
│ └── c.c
└── makefile
我写了一个测试makefile:
CC := gcc
LD := ld
MAKE_DIR = $(PWD)
MODULES := a b c
SRC_DIR := $(addprefix ${MAKE_DIR}/,$(MODULES))
SRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.c))
OBJ := $(patsubst %.c,%.o,$(SRC))
INCLUDES := $(addprefix -I,$(SRC_DIR))
vpath %.c $(SRC_DIR)
define make-goal
$1/%.o: %.c
$(CC) $(INCLUDES) -c $$< -o $$@
endef
all:
$(foreach sdir,$(SRC_DIR),$(eval $(call make-goal,$(sdir))))
在制作期间,它只是停止并显示:
makefile:37: *** prerequisites cannot be defined in command scripts. Stop.
第37行是:
$(foreach sdir,$(SRC_DIR),$(eval $(call make-goal,$(sdir))))
我的makefile出了什么问题?
答案 0 :(得分:1)
您正在扩展命令中的make-goal
。把它移到外面:
all: $(OBJ)
$(foreach sdir,$(SRC_DIR),$(eval $(call make-goal,$(sdir))))
请注意,在这种情况下定义配方,然后使用foreach-eval-call
是过度的。模式规则将执行:
all: $(OBJ)
%.o: %.c
$(CC) $(INCLUDES) -c $< -o $@
修改
您甚至可以在没有模式规则的情况下离开,使用Make的隐式规则来编译C文件:
CFLAGS += $(INCLUDES)
all: $(OBJ)