-1

我对 Makefile 感到困惑。我试图在 Makefile 中运行一个简单的命令,但它给了我错误“/bin/bash: line 3: :=: command not found”。我正在使用 shell 来运行这个 makefile

这是我的 Makefile 的一部分:

all:
   vlog Benchmarks/$(NAME)/Syn/*.v
   $(eval tux_number := 1)
   $(eval range := 1)
   $(eval ssh_log := 255)
   echo "Start Range: ${range}"
   echo "tux-number:  ${tux_number}"
   while [[ $$range -le 50 ]] ; do \
   ssh -l yazdanbakhsh tux-$(tux_number).cae.wisc.edu exit ; \
         echo "range:  ${range}" ; \
     eval $$range := $$((${range}+1)) ; \
done

谢谢

4

2 回答 2

1
all:
    @range=1; \
  while [ $$range -le 10 ] ; \
  do echo Range: $$range; \
  let range=range+1 ; \
  done;

请注意,前面的空格@range...是唯一的 TAB。

于 2013-08-18T18:45:05.433 回答
0

只是为了解决您明显的Makefile语法问题,这里尝试将您的尝试重构为有效代码。

tux_number := 1
ssh_log := 255   # not used anywhere

all:
   vlog Benchmarks/$(NAME)/Syn/*.v
   echo "Start Range: 1"   # This is probably no longer very useful output
   echo "tux-number:  ${tux_number}"
   range=1; while [ $$range -le 50 ] ; do \
       ssh -l yazdanbakhsh tux-$(tux_number).cae.wisc.edu exit ; \
       echo "range:  $$range" ; \
       range=$$(expr "$$range + 1); \
   done

注意Makefile 变量是如何tux_number和是,while仅存在于执行循环的 shell 中。为了使这个便携,我避免了 Bashisms。(如果可移植性不重要,您可能希望将其重构回 Bash 语法并使用... 代替。)ssh_lograngewhilefor ((range=1; range<=50; range++)); do

你的使用eval被误导了。如您所见,我只是将 Makefile 变量从它们不属于的配方中取出。您正在做的是(1)让 Make 评估表达式range := 1(评估为自身)和(2)将输出用作配方中的 shell 命令。由于它不是有效的 shell 命令,因此您从 Bash 中得到了语法错误。事不宜迟,我将在这里采取简单的方法并说这eval是一个复杂的主题,在您获得更多关于 Make 的经验之前,最好忘记它的存在。

为了正确使用 Make 的功能,我会使其可并行化,即将它分成 50 个单独的目标。这有点笨拙(这里可能有更好的定义方法range),但至少它应该说明您的方法的一些差异。(如果您不坚持range从 1 开始计数,则将其从零开始会使其不那么笨拙。这利用了空字符串在 shell 片段中无害的事实,因此我们可以使用它而不是零前缀。同样,如果您不关心范围索引的人类可读性,这可以简化。)

digits := 0 1 2 3 4 5 6 7 8 9
deca   := "" 1 2 3 4
range  := $(filter-out ""0,$(foreach d,$(deca),$(foreach i,$(digits),$d$i))) 50
# Or, at the expense of an external process,
# range := $(shell perl -le 'print $$_ for 1..50')

.PHONY: all
all: $(patsubst %,ssh-%,$(range))

.PHONY: ssh-%
ssh-%:
    ssh -l yazdanbakhsh tux-$(tux_number).cae.wisc.edu exit
    echo "range: $*"

例如,这可以通过类似make -j 5以五个并行批次执行这些操作来运行。

$(shell ...)顺便说一句,如果您真正想做的是使用 Make 驱动外部程序为您计算某些东西,那么注释掉的调用可能是您问题的实际答案。

于 2013-09-01T15:51:25.880 回答