如何比较 Makefile 中的两个 shell 命令输出?

How to compare two shell command output in Makefile?

我的Makefile是:

.PHONY: check
check:
        ifneq $(shell echo 123), $(shell echo 123)
                $(error Not equal)
        endif

当我 运行 时,出现错误:

$ make
Makefile:3: *** Not equal.  Stop.

但这应该只有在它们不同时才会发生,但它们不是。为什么?

ifneq 不能缩进。按照您编写它的方式,它是通过 shell 命令 运行,这意味着 $(error) 首先由 make 命令评估。

我猜您希望 make check 实际上仅在调用 make check 时才 运行 两个命令,并比较它们的输出。你可以这样做:

.PHONY: check
check:
    if [ "`echo 123`" != "`echo 123`" ]; then \
        echo "Not equal"; \
        exit 1; \
    fi

根据GNU Make docs条件部分 不能用于控制shell命令执行,因为条件控制 make 实际上 "sees" 在 makefile.

所以要在编译过程中执行条件,shell语法是首选,例如

SHELL := /bin/bash -e
.PHONY: check
check:
  @test "$(shell echo 123)" = "$(shell echo 123)" \
    || { echo Not equal; exit 2; } \
    && { echo Equal; }