如何比较 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; }
我的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; }