首页 > 解决方案 > makefile:: *** 无法在配方中定义先决条件。停止

问题描述

我正在从以下帖子中实现脚本。由于它有点旧,我想打开这个新线程,因为我在运行 makefile 时遇到问题。

基本上我已经创建了一个顶级makefile,它将在子文件夹中编译一组docker镜像。

makefile - 构建具有多个目标的多个文件

# Assuming each subdirectory containins a Dockerfile
IMAGES  := $(patsubst %/,%,$(dir $(wildcard */Dockerfile)))
BUILD_TARGS = $(patsubst %,build_%,$(IMAGES))
TEST_TARGS = $(patsubst %,test_%,$(IMAGES))
PUSH_TARGS = $(patsubst %,push_%,$(IMAGES))

VERSION := 1 # $(shell git rev-parse --short=12 --verify HEAD)
DOCKER_REPO_URL := david.io/reponame

define docker_build =
build_$(1):
    @echo "Building $(1)"
    #docker build -t $(1) --force-rm $(1)
endef

define docker_test =
test_$(1):
    @echo "Testing $(1)"
    #docker inspect $(1)
    #docker run --rm $(1) help
endef

define docker_push =
push_$(1):
    @echo "Pushing $(1)"
    #docker tag $(1) $(DOCKER_REPO_URL):$(1)-$(VERSION)
    #docker push $(DOCKER_REPO_URL):$(1)-$(VERSION)
    #docker tag $$@ $(DOCKER_REPO_URL):$(1)
    #docker push $(DOCKER_REPO_URL):$(1)
endef

.PHONY: all build test release clean $(IMAGES) $(BUILD_TARGS) $(TEST_TARGS) $(PUSH_TARGS)

all: build test release

build: $(BUILD_TARGS)
    $(foreach image,$(IMAGES),$(eval $(call docker_build,$(image))))

#test: $(TEST_TARGS)
#    $(foreach image,$(IMAGES),$(eval $(call docker_test,$(image))))

#release: $(PUSH_TARGS)
#    $(foreach image,$(IMAGES),$(eval $(call docker_push,$(image))))

我有以下错误:

makefile:37: *** prerequisites cannot be defined in recipes.  Stop.

标签: makefilegnu-make

解决方案


正如错误所说,您无法从配方中评估整个规则。

您需要在 make 解析 makefile 时执行此操作。

删除foreach循环之前的 TAB 字符,以便它们不在配方中。


推荐阅读