我想执行以下命令:
./a.out 1
./a.out 2
./a.out 3
./a.out 4
.
.
. and so on
如何写这个东西作为一个循环在Makefile?
我想执行以下命令:
./a.out 1
./a.out 2
./a.out 3
./a.out 4
.
.
. and so on
如何写这个东西作为一个循环在Makefile?
当前回答
如果您正在使用GNU make,您可以尝试一下
NUMBERS = 1 2 3 4 doit: $(foreach var,$(NUMBERS),./a.out $(var);)
哪个将生成并执行
./a.out 1; ./a.out 2; ./a.out 3; ./a.out 4;
其他回答
也许你可以用:
xxx:
for i in `seq 1 4`; do ./a.out $$i; done;
如果你使用。/a,下面就可以做到这一点。out,你就在一个unix类型的平台上。
for number in 1 2 3 4 ; do \
./a.out $$number ; \
done
测试如下:
target:
for number in 1 2 3 4 ; do \
echo $$number ; \
done
生产:
1
2
3
4
对于更大的范围,使用:
target:
number=1 ; while [[ $$number -le 10 ]] ; do \
echo $$number ; \
((number = number + 1)) ; \
done
这将输出1到10(包含10),只需将while终止条件从10更改为1000,以获得更大的范围,如您的注释所示。
嵌套循环可以这样完成:
target:
num1=1 ; while [[ $$num1 -le 4 ]] ; do \
num2=1 ; while [[ $$num2 -le 3 ]] ; do \
echo $$num1 $$num2 ; \
((num2 = num2 + 1)) ; \
done ; \
((num1 = num1 + 1)) ; \
done
生产:
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
4 1
4 2
4 3
您可以使用set -e作为for循环的前缀。例子:
all:
set -e; for a in 1 2 3; do /bin/false; echo $$a; done
Make将立即退出,退出代码<> 0。
如果您正在使用GNU make,您可以尝试一下
NUMBERS = 1 2 3 4 doit: $(foreach var,$(NUMBERS),./a.out $(var);)
哪个将生成并执行
./a.out 1; ./a.out 2; ./a.out 3; ./a.out 4;
#I have a bunch of files that follow the naming convention
#soxfile1 soxfile1.o soxfile1.sh soxfile1.ini soxfile1.txt soxfile1.err
#soxfile2 soxfile2.o soxfile2.sh soxfile2.ini soxfile2.txt soxfile2.err
#sox... .... ..... .... .... ....
#in the makefile, only select the soxfile1.. soxfile2... to install dir
#My GNU makefile solution follows:
tgt=/usr/local/bin/ #need to use sudo
tgt2=/backup/myapplication/ #regular backup
install:
for var in $$(ls -f sox* | grep -v '\.' ) ; \
do \
sudo cp -f $$var ${TGT} ; \
cp -f $$var ${TGT2} ; \
done
#The ls command selects all the soxfile* including the *.something
#The grep command rejects names with a dot in it, leaving
#My desired executable files in a list.