只是为了解决您明显的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_log
range
while
for ((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 驱动外部程序为您计算某些东西,那么注释掉的调用可能是您问题的实际答案。