Scons копирует заголовочные файлы в каталог сборки


Я пытаюсь скопировать несколько файлов заголовков из моих исходных каталогов в каталог "includes" внутри моего каталога сборки с помощью scons. Моя цель-статическая библиотека,и я хочу распространять ее вместе с соответствующими заголовками. Ожидаемый конечный результат:

build
|-- objects -> .o output files for constructing libmclib.a
|-- includes
|   |-- foo.h
|   `-- bar.h
`-- libmclib.a

Мой Бра:

#!python
target = 'mock'

env = Environment(LINKCOM = "$LINK -o $TARGET $SOURCES $LINKFLAGS $CCFLAGS")
Export('env', 'target')

build_base = 'build'
SConscript('SConscript', variant_dir=build_base, duplicate=0)

# remove build directory
if GetOption('clean'):
    import subprocess
    subprocess.call(['rm', '-rf', build_base])

Мой SConscript:

#!python
Import('env')

# ...
# other stuff to build 'mclib_target'
# ...

def copy_header_files(target, source, env):
    Mkdir(target)
    header_files = []
    for d in env['CPPPATH']:
        header_files += Glob(d + "/*.h")
    for f in header_files:
        Copy(target, f)

# copy all relevant header files
env.Command("includes", mclib_target, copy_header_files)

Проектов SCons не называю copy_header_files' с аргументами '["построить себя"], ["построить/libmclib.a"]', но по какой-то причине 'Mkdir' не создает включает каталог. Кроме того, "копия", кажется, ничего не делает. Если я, однако, назову Mkdir так:

env.Command("includes", mclib_target, [Mkdir('$TARGET')])

Похоже, это хорошо работает. Как это исправить / обойти? Я также довольно новичок в Scons, поэтому любая альтернатива для выполнения этой задачи приветствуется. Я использую scons 2.5.0.

2 3

2 ответа:

Вы, вероятно, хотите использовать "Install()" вместо "Copy()". Также Mkdir() не должен быть необходим, SCons автоматически создает все промежуточные папки для своих целей.

Наконец, позвольте мне высказать несколько замечаний по поводу вашего общего подхода: я бы предпочел не смешивать "строительство" с "установкой/подготовкой к упаковке". Опция "variant_dir "поможет вам построить несколько "вариантов" (release, optimized, debug, ARM-specific,...) из тех же исходных файлов (допустим, у вас есть папка с именем "СРЦ"). Передавая имя текущего каталога "build" в SConscript "src", вы встраиваете знания о конкретных вариантах в локальное описание сборки, что означает, что вам придется касаться его с каждым добавляемым вариантом. Вместо этого вы должны переместить шаги "Install/Package " в бра верхнего уровня...где у вас есть глобальные знания о том, какие варианты строятся. Оттуда вы можете скопировать (= установить) окончательные файлы в отдельную подпапку, например distribution, и заархивировать ее вместо.

Для простого примера того, как обрабатывать варианты прямо в SCons, проверьте repo https://bitbucket.org/dirkbaechle/scons_talks и там папка" pyconde_2013/examples/exvar".

ОперацииMkdir иCopy , которые вы используете, являются фабриками действий для использования в определениях команд, описанных в независимой от платформы манипуляции файловой системой :

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

У меня всегда были проблемы, пытаясь использовать эти функции в своих собственных функциях действия. Возможно, я что-то упускаю, но я не думаю, что эти функции можно использовать вне непосредственного списка операций в построителе команд.

Вместо этого я использую независимые от платформы функции в python для создания каталогов и копирования файлов, таких как как os.makedirs и еще shutil.copy.