2010-08-24 70 views
3

我有一個scons項目,強制包含幾個頭文件作爲編譯器標誌。SCONS中所有構建目標的隱式列表?

# Forced include files passed directly to the compiler 
env.Append(CCFLAGS = ['/FIinclude.h']) 

這些文件不包含在項目中的任何文件中。我需要爲它們添加一個明確的依賴關係。

forced_include_headers = ['include.h'] 

# Trying to add an explicit dependency for each build target 
for object in BUILD_TARGETS: 
    env.Depends(object, forced_include_headers) 

我遇到的問題是BUILD_TARGETS列表爲空。它似乎只包含從COMMAND_LINE_TARGETSDEFAULT_TARGETS傳遞的東西。我們項目中的所有目標都是隱式構建的。我們不使用env.Default等。有沒有辦法獲得隱式目標列表,還是我必須手動構建它?我注意到TARGETS被保留,似乎並不包含我想要的。

我可以爲其各自的SConscript文件中的所有目標添加env.Depends(target, forced_include_headers),但該項目非常大。

+0

我最終通過爲項目中的每個目標調用僞造器來解決這個問題(無論如何都需要這樣做)。依賴關係會添加到僞造者的調用中。 – 2011-06-16 21:40:22

回答

0

我不知道這是要解決的問題(事實上,我認爲建立一個僞建設者的思想工作得更好)的最佳方式,但是這個代碼將返回Object目標的列表:

# Typical SConstruct/SConscript 
env = Environment() 
env.Program('foo.c') 
lib = env.SharedLibrary('bar.c') 
env.Program('foo2.c', LIBS=[lib]) 
SConscript('subdir/SConscript', exports={'env':env}) 

# Get a list of all Object targets 
def get_all_targets(env, node='.'): 
    def get_all_targets_iter(env, node): 
     if node.has_builder() and node.get_builder().get_name(env) in ('Object', 'SharedObject'): 
      yield node 
     for kid in node.all_children(): 
      for kid in get_all_targets(env, kid): 
       yield kid 
    node = env.arg2nodes(node, env.fs.Entry)[0] 
    return list(get_all_targets_iter(env, node)) 

# Force them all to depend upon some header 
env.Depends(get_all_targets(env), 'site_wide.h')