我有一个程序可以输出东西 - 数字 - 到stdout。
程序在自动分级器中以make run input.txt 0.87 > output_file
运行(这是为了分配)。程序必须以这种方式运行(即使make文件确实不可能)。
然而,我在这里得到了SO问题的帮助。这是我的makefile:
pr.exe : main.cpp
g++ -std=c++11 $^ -o $@
run:
@./pr.exe $(filter-out $@,$(MAKECMDGOALS))
%:
@:
compile : pr.exe
.PHONY : compile
只有一个问题:除了程序输出外,命令make run input.txt 0.87
输出最后一行:
make: 'input.txt' is up to date.
如何在make文件中禁止此行,以便只将程序输出重定向到文件中?
它必须使用 以下命令正常运行(没有make参数,nada):
make run input.txt 0.87 > some_output_file.txt
答案 0 :(得分:2)
message
的{{1}}选项禁用了打印{:1}}。
https://github.com/mturk/gnumake/blob/9c3fecf4dd76a8c802055d9bd3689d0c6c5d6167/remake.c#L229
-s
if (!rebuilding_makefiles
/* If the update_status is zero, we updated successfully
or not at all. G->changed will have been set above if
any commands were actually started for this goal. */
&& file->update_status == 0 && !g->changed
/* Never give a message under -s or -q. */
&& !silent_flag && !question_flag)
message (1, ((file->phony || file->cmds == 0)
? _("Nothing to be done for '%s'.")
: _("'%s' is up to date.")),
file->name);
由make:
silent_flag
命令行选项设置
https://github.com/mturk/gnumake/blob/9c3fecf4dd76a8c802055d9bd3689d0c6c5d6167/main.c#L412
-s
并且它在https://github.com/mturk/gnumake/blob/9c3fecf4dd76a8c802055d9bd3689d0c6c5d6167/file.c#L752
中设置/* Nonzero means do not print commands to be executed (-s). */
int silent_flag;
{ 's', flag, &silent_flag, 1, 1, 0, 0, 0, "silent" },
这是解析https://www.gnu.org/software/make/manual/html_node/Special-Targets.html
中记录的 f = lookup_file (".SILENT");
if (f != 0 && f->is_target)
{
if (f->deps == 0)
silent_flag = 1;
else
for (d = f->deps; d != 0; d = d->next)
for (f2 = d->file; f2 != 0; f2 = f2->prev)
f2->command_flags |= COMMANDS_SILENT;
}
特殊目标
.SILENT
如果您为.SILENT指定先决条件,则make将不会打印 用于在执行之前重制这些特定文件的配方。 .SILENT的配方被忽略。
如果作为没有先决条件的目标被提及,.SILENT说不会 在执行之前打印任何食谱。 '.SILENT'的用法是 仅支持历史兼容性。我们建议你使用 更具选择性的方法来沉默特定的食谱。参见配方回声。 如果您想使特定生产的所有配方静音,请使用 '-s'或'--silent'选项(参见选项摘要)。
因此,尝试在没有任何其他先决条件的情况下将.SILENT
特殊目标添加到Makefile中。 (解决方案未经我测试。)
.SILENT