makefile: 第二个依赖关系无法执行

问题描述 投票:0回答:1

目标中的第二个依赖性 first-deploy 不执行。

如果我执行 make first-deploy, 使得只执行第一个依赖 - build-proxy-base 成功后退出。

Makefile。


UID=`id -u`
GID=`id -g`

NODE_N=node
PROXY_N=proxy
PY_N=py

DOCKER_D=docker
PROXY_D=skif-proxy
NODE_D=skif
PY_D=skif-proxy/template-service

# first is default
default: first-deploy docker-compose-up

docker-compose-up:
    cd $(DOCKER_D) && \
        docker-compose up --build && \
        cd ..

build-docker-base:
    docker build \
        --build-arg UID=${UID} \
        --build-arg GID=${GID} \
        -f ${D}/Dockerfile.base \
        --rm \
        -t skif-${SERV_N}-base ${D}

build-node-base: D := ${NODE_D}
build-node-base: SERV_N := ${NODE_N}
build-node-base: build-docker-base

build-proxy-base:D=${PROXY_D}
build-proxy-base:SERV_N=${PROXY_N}
build-proxy-base: build-docker-base

build-py-base: D=${PY_D}
build-py-base: SERV_N=${PY_N}
build-py-base: build-docker-base

first-deploy: build-proxy-base build-py-base build-node-base

UPD我明白 build-docker-base 构建只有一次,但我如何在两个目标中用其他参数重用它的代码?

makefile
1个回答
3
投票

make肯定考虑了第二个依赖关系。 如果它没有 "执行",那么意味着make决定不需要做任何事情来执行它。

我可以看到这一点。

build-proxy-base: build-docker-base
  ...
build-node-base: build-docker-base

这两个目标都把同一个目标列为先决条件,而且它们不做任何其他事情。 在make中,一个给定的目标(比如 build-docker-base)每次调用只会被make建立一次。 一旦make建立了一次,无论有多少其他目标依赖于它,它都会被认为是最新的。

因此,make认为 build-node-base,看到它已经被更新,由于。build-proxy-base并决定没有其他事情可做。

既然你没有真正告诉我们 build-node-base 规则或解释你想做什么,我们不能确定更多的东西。

ETA 根据你更新的 makefile,你似乎试图把目标当作函数,通过把它们列为先决条件来调用。 它们不是,也不能。

在我看来,你只是想用不同的参数多次运行同一个配方。 我认为你应该这样写。

build-node-base build-proxy-base build-py-base:
        docker build \
            --build-arg UID=${UID} \
            --build-arg GID=${GID} \
            -f ${D}/Dockerfile.base \
            --rm \
            -t skif-${SERV_N}-base ${D}

build-node-base: D := ${NODE_D}
build-node-base: SERV_N := ${NODE_N}

build-proxy-base:D=${PROXY_D}
build-proxy-base:SERV_N=${PROXY_N}

build-py-base: D=${PY_D}
build-py-base: SERV_N=${PY_N}

1
投票

既然没有任何配方 build-proxy-basebuild-node-base两者都是假的,不清楚你是如何得出结论的。build-node-base 是不,事实上,建。

我怀疑,实际的观察是,目标 build-docker-base 每次只建一次 make 运行,并且该构建反映了变量的值。DSERV_N 边建边设 build-proxy-base. 这与目标是否 build-node-base 是建成的,和很多的事实有关。make 每个目标每次运行最多建立一次。

© www.soinside.com 2019 - 2024. All rights reserved.