【问题标题】:Makefile internal command on linux functional but not macoslinux上的makefile内部命令功能但不是macos
【发布时间】: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


【解决方案1】:

您的 MacOS 机器可能使用其默认的 GNU make 版本 (3.81)。 .ONESHELL 是在 3.82 中引入的。使用 Homebrew 或 MacPort 升级。无论如何,最好避免在食谱中使用make,更喜欢$(MAKE),而不是cd; make,您可以使用GNU make 的-C 选项:$(MAKE) -C images/alpine ...

【讨论】:

  • 对于那些在 macOS 上的用户:brew install make,然后将路径添加到您的 .bashrc 将解决问题,而不是执行 -c make。
猜你喜欢
  • 2015-05-18
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多