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 ответа:
Вы, вероятно, хотите использовать "
Наконец, позвольте мне высказать несколько замечаний по поводу вашего общего подхода: я бы предпочел не смешивать "строительство" с "установкой/подготовкой к упаковке". Опция "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
.