函数在makefile中定义

时间:2014-01-24 03:51:21

标签: makefile

我有测试项目文件夹结构视图:

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出了什么问题?

1 个答案:

答案 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)