2012-06-17 49 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