从Makefile执行的Shell if语句的计算结果总是为false



我需要将shell if else语句添加到我的Makefile中,但if表达式的计算结果始终为false。例如下一个代码:

if [1 -eq 1]; then echo "yes"; else echo "no"

打印";CCD_ 2";

唯一评估为true的代码是:

if true; then echo "yes"; else echo "no"

为什么代码中的所有表达式("true"除外(的计算结果都为false?:(我真的很感谢的任何帮助

**请注意-当从Shell 运行时,语句工作正常

原始Makefile的代码片段:

SIMULATION_RUN_CMD =  rm -rf $(TEST_DIR)/* && mkdir -p $(TEST_DIR) && cd $(TEST_DIR) && (cp -rf $(VIVADO_PROJ)/$(PROJECT)/export_for_sim/$(SIMULATOR)/{*.mem,.mif,design.dat,nocattrs.dat,cpm_data_sim.cdo} $(TEST_DIR) || true) && 
ln -sf $(TEST_DIR)/simulation.log $(RUN_DIR)/simulation.log && 
(timeout $(SIM_TIMEOUT) ${SIM_DIR}/simv +UVM_TESTNAME=$(UVM_TESTNAME) $(SIM_FLAGS) -l $(TEST_DIR)/simulation.log -do $(DO_FILE) ; 
if [1 -eq 1]; then echo "if statement yes " >> $(TEST_DIR)/simulation.log; else echo "if statement no " >> $(TEST_DIR)/simulation.log; fi 
|| true) && 
$(MODEL_POST_SIM_ACIONS)

$(SIMULATION_RUN_TAR):
@echo -e "Make Command: $(SIMULATION_RUN_CMD)" $(PRINT_OUTPUT)
($(SIMULATION_RUN_CMD)) $(PRINT_OUTPUT)

首先,您的命令中存在语法错误。如果你把它准确地输入到bash中,你会得到一个错误:

[[1: command not found

[[之后和]]令牌之前需要空格:

if [[ 1 -eq 1 ]]; then echo "yes"; else echo "no"

其次,从make运行时它不起作用的原因是make没有调用bash。Make调用POSIX标准shell/bin/sh。如果你这样做,你会看到与make相同的行为:

$ /bin/sh -c 'if [[ 1 -eq 1 ]]; then echo yes; else echo no; fi'
/bin/sh: 1: [[: not found
no

[[运算符是bash特有的特性。如果你想使用POSIX功能来写这篇文章,你应该使用:

$ /bin/sh -c 'if [ 1 -eq 1 ]; then echo yes; else echo no; fi'
yes

如果您真的想让make调用bash作为shell而不是sh,请将其添加到您的makefile中:

SHELL := /bin/bash

当然,您的makefile在任何没有/bin/bash可用的系统上都无法工作。

ETA

在看到你添加的非常复杂但仍然不完整的代码后,我会说以下内容:

正如我上面所说的,您的脚本中有一个错误。if [1 -eq 1]是完全非法的。必须[之后和]之前有空格。同样,如果您自己在shell提示下运行此操作,您将得到相同的失败。这与制造无关。

由于这个错误,if语句将始终失败,因此这将始终运行";否则";命令和打印";否";。

您说您没有看到任何错误消息。我无法解释,除非你用这种方式运行这个配方:

($(SIMULATION_RUN_CMD)) $(PRINT_OUTPUT)

您没有告诉usePRINT_OUTPUT变量的值是什么,所以我只能假设它将stderr丢弃到位桶中(或者可能是stdout和stderr(。如果您不这样做,以便可以看到输出,那么您将看到正在打印的错误消息。或者可能会重定向到日志文件,在这种情况下,您可以在那里查找消息。

最新更新