2016-07-31 63 views
2

我真的是一个初学者,我想构建一个makefile,以便以后可以运行一个程序几次。 例如终端输入:使循环6使用makefile运行一个程序几次

loop: $(BIN) 
    terminalinput= $1 #e.g. the value 6 
    count=0 
    while [ $count -lt $terminalinput ]; do 
     ./$(BIN) \ 
     count=$((count+1)) 
    done 

我不知道如何获得终端输入并在while循环中构建它。我使用Ubuntu,希望somebode能帮助我。

预先感谢您

+0

你为什么想用make做这个? – user657267

+0

我想创建一个makefile模板,我可以用于我的C程序。所以我可以编写“make run = compile并运行程序”,“make val =编译并运行valgrind”,“make loop 5 =编译并运行程序5次”等。我想用makefile来试试这个。 – wurya

回答

1
  1. 您可以通过命令行,例如通过make变量make loop LOOPS=10
  2. 您可以在Makefile中使用ifdef来确定是否定义了变量,例如,
ifdef LOOPS 
loop: prog 
     for ((i=1; i <= ${LOOPS}; ++i)) do ./prog; done 

.PHONY: loop 
endif 

prog: 
     # Commands for making prog 

一起,这可能足够靠近你想要什么。

上面应该有一个错误消息 中止(约不知道如何使loop) 如果你忘记在命令行来定义LOOPS。 如果您想为LOOPS, 设置默认值,只需在Makefile中定义它即可。那就没有必要ifdef

LOOPS = 10 
loop: prog 
     for ((i=1; i <= ${LOOPS}; ++i)) do ./prog; done 

.PHONY: loop 

prog: 
     # Commands for making prog 

现在,make loop运行prog 10次,但你仍然可以覆盖 使用例如make loop LOOPS=3

+0

谢谢你的帮助,我只修理了一件东西,它工作。真的很棒的社区! – wurya

+0

@wurya:可能是运行'prog'的“东西”应该使用'。/ prog'这样的显式路径来完成。固定。 – ccorn

+0

是的,for((...))'语法是'bash'特定的。问题中的$((...))'结构相同,因此至少答案仍然在该上下文中。 – ccorn

1

我使用gmake,只能改变一点ccorn的答案(再次感谢你)。因为我必须在我的makefile的第一行写SHELL:=/bin/bash。

现在当我在我的终端写make loop l=5程序运行5次。当我只写make loop程序运行10次(默认值)。

这是我的小测试的makefile:

SHELL := /bin/bash 
BIN = stack 
SRC = \ 
    stacktest.c \ 
    stack.c \ 

CC = gcc 
CFLAGS = -g -Wall -Wextra -O3 -std=c99 -lm 

OBJS = $(SRC:%.c=%.c) 

all: $(BIN) 

$(BIN): $(OBJS) 

val: $(BIN) 
    valgrind ./$(BIN) 

run: $(BIN) 
    ./$(BIN) 

l = 10 
loop: $(BIN) 
    for ((i=1; i <= ${l}; ++i)) do ./$(BIN); done 

我没有包括假的,因为我必须先读了这一点。

非常感谢您的帮助! :)