仅抑制实际的make命令和最终的print语句

时间:2017-03-29 00:35:34

标签: c++ makefile

我有一个程序可以输出东西 - 数字 - 到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

1 个答案:

答案 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