【问题标题】:makefile: second dependency not executemakefile:第二个依赖项不执行
【发布时间】:2020-06-04 17:35:43
【问题描述】:

目标first-deploy 中的第二个依赖项未执行。

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

生成文件:


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 只构建一次,但是我如何在 2 个目标中使用其他参数重用它的代码?

【问题讨论】:

  • 这真的是完整的makefile吗?
  • @G.M.,不,更新了 makefile。

标签: makefile


【解决方案1】:

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}

【讨论】:

  • 谢谢。这就是我所寻找的。​​span>
【解决方案2】:

由于build-proxy-basebuild-node-base 都没有配方,而且两者实际上都是假的,因此不清楚您是如何得出结论build-node-base 实际上不是构建的。

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

【讨论】:

  • 对不起。更新 makefile。
  • @tannerman,添加的 makefile 细节对这个答案没有任何影响。他们既没有澄清您的主张,也没有要求对我已经说过的内容进行任何更改。
  • 好的,build-docker-base 构建一次。那么如何避免代码重复(重用 build-docker-base 和参数)?
  • 抱歉,我翻了答案,我编辑错了:(
猜你喜欢
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2022-01-25
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多