2012-06-17 62 views
5

我想在編譯後直接運行編譯好的程序,這樣我就可以用scons編譯並啓動我的程序。scons - 編譯後運行程序

我認爲這個SConstruct-File會在程序重建時啓動程序。

main = Program("main", [ "main.cc" ]) 

test = Command(None, None, "./main >testoutput") 
Depends(test, main) 

,這將啓動它,我每次運行scons

main = Program("main", [ "main.cc" ]) 

test = Command(None, None, "./main >testoutput") 
Requires(test, main) 

但兩者不工作,是從來沒有執行我的計劃。我究竟做錯了什麼?

回答

7

這應該更好地運行程序只有當它的內置。

main = Program("main", [ "main.cc" ]) 

test = Command(target = "testoutput", 
       source = "./main", 
       action = "./main > $TARGET") 
Depends(test, main) 

,並使用AlwaysBuild()每一次運行,由@doublep這樣提到:

main = Program("main", [ "main.cc" ]) 

test = Command(target = "testoutput", 
       source = "./main", 
       action = "./main > $TARGET") 
AlwaysBuild(test) 

如果你想看到的testoutput的內容,你可以這樣做:

(假設Linux的這將是更加便攜打印的文件有一些Python代碼代替)

main = Program("main", [ "main.cc" ]) 

test = Command(target = "testoutput", 
       source = "./main", 
       action = ["./main > $TARGET", 
          "cat $TARGET"]) 
AlwaysBuild(test) 
+0

當我在操作和源代碼中使用'#'時,testoutput不再生成。 scons打印'#/ main> testoutput',但'testoutput'不存在,因此總是打印此行。有沒有辦法做到這一點,而不是寫這個到testoutput而不是stdout?我想立即看到結果,不想看看這個文件。 – dinfuehr

+0

@dinfuehr,我不能在明天早上測試這個。我的解決方案是否使用「./main」替換「#」?我不明白你關於標準輸出的問題。 – Brady

+0

是的,沒有#它的作品。我想知道是否有可能採取行動。/ main「(不包括」> $ TARGET「),以便在調用scons時直接看到程序的輸出,而不必檢查輸出文件。 – dinfuehr

4

這將運行ls每SCons的運行時間:

ls = Command ('ls', None, 'ls') 
AlwaysBuild ('ls') 
Default ('ls') 

你從來沒有告訴過SCons的原因以及何時應該運行命令。你應該將其作爲依賴項添加到某個其他目標或將其作爲默認目標。

如果你想運行命令真的總是,即不管正在構建什麼目標,你應該運行它使用標準的Python設施來啓動外部程序。

+0

哪有我只有在重建後才能運行我的程序? (總是運行我的程序,現在適用於我) – dinfuehr

+0

使命令取決於程序。然後可執行文件將在運行前重建(如有必要)。即'x_program = Program('x',...); x = Command('x',None,'./x');取決於('x',x_program)' – doublep

+0

嗯,這對我不起作用:'建立同一個目標的多種方式被指定爲:x' – dinfuehr