【发布时间】:2020-08-24 16:41:28
【问题描述】:
在 linux 上的 Makefile 中,我们可以使用它执行 shell/bash 命令来移动目录或执行其他文件。但是,当将相同的 Makefile 移植到 macOS 时,所有命令都是不可读的(因此路径和执行被破坏)。是否有通用的命令或工作流程可以同时处理这两者?
Makefile 示例
.ONESHELL:
COMMAND ?= none
GIT_HASH ?= githash
alpine:
@cd images/alpine
@make ${COMMAND} GIT_HASH=${GIT_HASH} ALPINE_VERSION=3.6.5 TAG=3.6
所以在 linux 机器中,@CD 和 @MAKE 都被执行,但不是 macOS Catalina。我想让它通用,以便两个系统都尊重随后的适当命令。
【问题讨论】:
-
尝试将 cd 和行合并到:
make -C <dir> <args>;如果前面有.ONESHELL:并且没有空行,则发布的版本可能会起作用 -
@Milag 它已经在
.ONESHELL;上并且 macOS 没有解释它。 -
好的,
.ONESHELL在您更新后现在可见。您在 macOS 上的make版本是什么?实验:用echo $$$$添加2行; pid 相同还是不同? -
您的 MacOS 机器可能使用其默认的 GNU make 版本 (3.81)。不知道为什么 Apple 坚持使用这么旧的版本,但
.ONESHELL是在 3.82 中引入的。使用 Homebrew 或 MacPort 升级。无论如何,最好避免在食谱中使用make,更喜欢$(MAKE),而不是cd; make,您可以使用GNU make 的-C选项:$(MAKE) -C images/alpine ... -
@RenaudPacalet 所以你的建议是升级 GNU,而不是拥有多个 make 文件,只需一个巨大的文件并使用相对路径进行操作?
标签: makefile