2014-10-13 3 views
1

Например:SCons строить все источники файлов во всех каталогах

/project/SConstruct 
/project/main.cpp 
/project/folder/bar.h 
/project/folder/bar.cpp 
/project/folder/foo.h 
/project/folder/foo.cpp 

То, что я хочу для SCons просто компилировать все исходные файлы во всех подкаталогах без добавления файла SConscript в каждом подкаталоге. В основном я хочу передать Glob('*.cpp') для/project и всех подкаталогов в/проекте.

Заранее благодарю всех, кто отвечает!

ответ

0

Вы можете сделать это от корня SConstruct следующим образом:

env = Environment() 
env.Program(source=[Glob('*.cpp'), Glob('folder/*.cpp')], target='yourBinaryName') 

Вы, вероятно, также необходимо настроить каталог включают следующее:

env.Append(CPPPATH='folder') 

Remeber, что Glob() не рекурсивный.

+0

Спасибо за быстрый ответ! Я не хочу, чтобы вручную вводить имена всех папок. Все, что я хочу, для всех * .cpp-файлов в/проектах и ​​подкаталогах в/проекте, которые должны быть скомпилированы. – benbalach

+0

@benbalach Что вы просите, называется Recursive Glob, и это не поддерживается в SCons, поэтому я упомянул об этом в конце моего ответа. – Brady

+0

@Brandy Большое вам спасибо! – benbalach

1

Как Брейди указывает, "Глоб() не является рекурсивным", но, возможно, мы могли бы создать рекурсивную globber:

def AllSources(node='.', pattern='*'): 
    result = [AllSources(dir, pattern) 
       for dir in Glob(str(node)+'/*') 
       if dir.isdir()] 
    result += [source 
       for source in Glob(str(node)+'/'+pattern) 
       if source.isfile()] 
    return result 

env = Environment() 
env.Program('program', source=AllSources('.', '*.c*')) 
+0

Большое вам спасибо за ответ! Я немного искал, и это то, с чем я столкнулся: http://stackoverflow.com/questions/2186525/use-a-glob-to-find-files-recursively-in-python?answertab=votes# tab-top Является ли ваш лучше или они в основном одинаковы? – benbalach

+0

Я не знаю, что это лучше. Они разные, и при некоторых обстоятельствах будут давать разные ответы. Главное различие заключается в том, что в принятом ответе там не используется 'Glob()', который рассматривает состояние SCons в дополнение к файловой системе. –

+0

isdir() всегда возвращает False для меня (scons 2.5.1) – krupan

0

рекурсивного globber, который работал для меня

def GlobRecursive(pattern, node='.'): 
    results = [] 
    for f in Glob(str(node) + '/*', source=True): 
     if type(f) is SCons.Node.FS.Dir: 
      results += GlobRecursive(pattern, f) 
    results += Glob(str(node) + '/' + pattern, source=True) 
    return results 

ответ Robᵩ в не работал для меня, потому что a) isdir() всегда возвращался False (scons 2.5.1) и b) для понимания списка трудно понять :-)

Смежные вопросы