2013-05-21 4 views
2

У меня есть библиотека только для заголовка, состоящая из иерархии папок и группы из .hpp файлов, которые я хотел бы установить. Моя проблема в том, что scons делает не скопируйте папку в папку сборки.SCons: принудительное копирование файлов для копирования файлов

Вот что мой макет каталога выглядит следующим образом:

root 
    SConstruct 
    subdir 
    SConscript 
    the_lib 
     subdir_a 
     header_a.hpp 
     subdir_b 
     header_b.hpp 
    build 
    (...) 

Вот что я делаю в subdir/SConscript:

all_headers = [] 

for root, dirnames, filenames in os.walk('.'): 
    for filename in fnmatch.filter(filenames, '*.hpp'): 
     fn = os.path.join(root, filename) 
     all_headers.append((fn, root)) 

for f, d in all_headers: 
    install.AddHeader(f, d) 

Я делаю это, чтобы получить имена файлов наряду с их относительными путями, а затем, Я использую установщик, который я нашел в scons wiki на днях.

Наблюдение: all_headers остается пустым, потому что папка the_lib не копируется. Я устал subdir_env.Dir('the_lib'), но ничего не изменил.

После запуска сценария у меня есть the_lib/SConscript в моей папке build, но ничего больше. Конечно, я понимаю, что моя файловая система не делает ничего в этом случае.

Может ли кто-нибудь мне помочь?

UPDATE

Единственный выход я нашел, чтобы запустить find -name "*.hpp" и вставить результат в моей SConscript. Сейчас работает как прелесть, но поскольку библиотека является внешней (и, возможно, некоторые файлы добавляются или удаляются), я думал о более общем решении без необходимости знать все заголовки по имени.

ответ

2

Первое, что я думал о том, чтобы использовать SCons Install() builder, но это то, что нужно установить реальные цели SCons в разных местах, и поскольку эти файлы заголовков не являются объектами, это не будет работать.

Итак, в этом случае вы можете использовать так называемые SCons Copy Factory.

+0

К сожалению, я не понимаю. Я устал 'Command ('the_lib', 'the_lib', Copy (" $ TARGET "," SOURCE ")), но это создает цикл зависимостей. Я пытался просто переименовать, что работает с файлами, но не с каталогами. Обычная копия ('the_lib', 'the_lib.in') '(так как я переименовал ее, чтобы быть уверенным) ничего не делает, а если источником и объектом являются файлы, то он работает. –

+0

@ wal-o-mat, как насчет этого: Копировать ('dira/theHeader.h', 'dirb/theHeader.h') – Brady

+0

А, прости, я не упоминал, что указание всех файлов заголовков - это * не *, что я хотел закончить с (поэтому fs ходить), но если мне слишком долго нужно делать эту работу, я думаю, что предпочитаю жестко кодировать имена файлов. –

0

Если сборка является VariantDir, то вам не нужно копировать файл самостоятельно, скроны будут делать это, если заголовок используется в любом Builder.

Если вы хотите список файлов, которые вы можете использовать env.Glob('*/*.hpp') (но не групповые символы будут пересекать каталоги, так что вам нужно знать глубину)

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