2017-03-29 51 views
1

我有一個輸出東西 - 數字 - 到stdout的程序。只抑制實際的make命令和最終的打印語句

該程序將在自動平地機make run input.txt 0.87 > output_file(這是一個分配)運行。該程序必須以這種方式運行(儘管對於make文件來說不可能)。

但是,我得到了它的所以這裏問題上的幫助工作。這是我的makefile:

pr.exe : main.cpp 
    g++ -std=c++11 $^ -o [email protected] 

run: 
    @./pr.exe $(filter-out [email protected],$(MAKECMDGOALS)) 


%: 
    @: 

compile : pr.exe 
.PHONY : compile 

只是有一個問題:命令make run input.txt 0.87輸出,除了節目輸出,最後一行:

make: 'input.txt' is up to date. 

如何抑制這一行在我的make文件中,只有程序輸出被重定向到文件中?

它必須與正常運行下面的命令(沒有進行申辯,虛無縹緲):

make run input.txt 0.87 > some_output_file.txt 
+1

這聽起來像是[XY問題](http://xyproblem.info/)的一個實例。例如,[GNU make手冊](https://www.gnu.org/software/make/manual/make.html)本身就說「MAKECMDGOALS'只能在特殊情況下使用」。 –

+0

@DanielKamilKozar還是你說這些輸入可以通過其他方式傳遞給makefile? – bordeo

+0

@DanielKamilKozar right:autograder已經寫入了這個特殊的命令:'make run input1 input2'(這就是爲什麼它是這樣) – bordeo

回答

2

message印刷由-s選項化妝的禁用:

https://github.com/mturk/gnumake/blob/9c3fecf4dd76a8c802055d9bd3689d0c6c5d6167/remake.c#L229

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); 

silent_flag由設置命令行化妝的選項:

https://github.com/mturk/gnumake/blob/9c3fecf4dd76a8c802055d9bd3689d0c6c5d6167/main.c#L412

/* Nonzero means do not print commands to be executed (-s). */ 

int silent_flag; 
{ 's', flag, &silent_flag, 1, 1, 0, 0, 0, "silent" }, 

而且也正是在https://github.com/mturk/gnumake/blob/9c3fecf4dd76a8c802055d9bd3689d0c6c5d6167/file.c#L752

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; 
    } 

這個集合解析.SILENThttps://www.gnu.org/software/make/manual/html_node/Special-Targets.html

.SILENT記錄特殊目標

如果您.SILENT指定的先決條件,然後進行將不打印使用在執行之前重拍那些特定的文件 配方。 .SILENT的配方被忽略。

如果與沒有任何先決條件的目標中提到,.SILENT說不 印刷執行之前的任何食譜。 「.SILENT」的這種用法是 僅支持歷史兼容性。我們建議您使用 更具選擇性的方法來沉默特定配方。見食譜回聲。 如果你想關閉所有食譜化妝的特定運行,使用 了「-s」或者「--silent」選項(請參見選項摘要)。

因此,請嘗試將.SILENT特殊目標添加到您的Makefile中,而無需任何其他先決條件。 (解決方案未經我測試。)

.SILENT: 
+1

在瀏覽GNU Make文檔時偶然發現了'.SILENT' ,但我從來沒有想到,它也可能會禁用此特定消息。榮譽給你。 (also:it works) –

+0

@osgx ha! .SILENT +:做到了。謝謝! (整晚沒有冒號......)。 – bordeo