【发布时间】:2021-05-02 19:14:53
【问题描述】:
我正在尝试编写我的第一个 makefile 来完全自动化我的代码执行。我有一个必须执行多次的 c 代码(BootstrapCL.c);对于每次执行,我应该输入(我在 c 代码中有 2 个 scanf)一个文件名(带和不带扩展名)。我必须对文件夹内的所有文件(比如一组 cvs 文件)重复此操作。
这是我的makefile
SRCS := $(wildcard *.csv)
BINS := $(SRCS:%.csv=%)
all: ${BINS}
%: BootstrapCL.c
gcc -Wall BootstrapCL.c -lm -o BootstrapCL
./BootstrapCL
$@.csv
$@
问题是当makefile到达该行时:
./BootstrapCL shell 等待输入,因此我无法到达下一行以通过 makefile 本身提供此输入。如何解决这个问题并获得自动化流程?
【问题讨论】:
-
makefiles 通常用于构建软件。我建议使用 shell 脚本来查找 csv 文件并将文件名传递给您的可执行文件。
-
一种正常的技术是让您的
BootstrapCL程序接受多个文件名参数,并依次处理每个文件名(在main()中使用argv,而不是使用@ 读取987654326@),然后使用./BootstrapCL *.csv处理目录下的所有文件名。如果没有参数,它可能会从标准输入读取文件名,或者它可能会读取数据的标准输入(想想cat或grep),或者它可能会反对“我需要给定一个或多个文件名在命令行上”。各有千秋;我可能会选择“将标准输入作为数据处理”或“投诉”。 -
在考虑从 0 重新启动完全不同的选项(例如 Bash 脚本)之前,我想尝试解决此问题;我并不是说 bash 脚本不是一个好选择,但如果我能解决我发布的问题,我将实现我的目的
-
处理命令行参数将使程序更普遍有用。哦,第二次执行之后让人们输入标准输入很烦人。您已经从 makefile 中获得了有关如何执行此操作的答案,但这是对 makefile 的滥用。
-
你明白了乔纳森·莱弗勒的意思;您的解决方案也很有效。有什么想法可以防止makefile作为最后一个目标“全部”执行吗?我不确定,但我认为这是由于我错误地使用了 $@
标签: c shell input makefile scanf