У меня есть приложение на C ++, которое я пытаюсь создать SCons который состоит из нескольких подпрограмм.
Каждая подпрограмма имеет свои собственные исходные файлы в подкаталоге исходного каталога. Эти исходные файлы, например, source/prog1/prog1.cpp
, скомпилированы в объектные файлы, которые находятся в каталоге объектов, например object/prog1/prog1.o
,
Это прекрасно работает, так как каждый исходный каталог имеет свой целевой каталог, и нет возможности конфликтов.
Тем не менее, я пытаюсь связать эти объектные файлы в исполняемые файлы, которые будут в том же bin
каталог. Так несколько исходных файлов (object/prog1
, object/prog2
и т. д.) все будут идти в один и тот же целевой каталог (bin
).
Макет каталога выглядит следующим образом:
application
source
prog1
prog1.cpp
something.cpp
prog2
prog2.cpp
somethingelse.cpp
object
prog1
prog1.o
something.o
prog2
prog2.o
somethingelse.o
bin
??? <- what I'm concerned with
Я пытаюсь добиться этого с помощью следующего скрипта SConstruct:
env = Environment()
Export('env')
#common objects
common=env.SConscript("source/common/SConscript_object", variant_dir="object/common", duplicate=0)
Export('common')
#sub-programs
env.SConscript("source/prog1/SConscript_bin", variant_dir="bin", duplicate=0)
env.SConscript("source/prog2/SConscript_bin", variant_dir="bin", duplicate=0)
Однако scons жалуется на следующую ошибку:
scons: *** 'bin' already has a source directory: 'source/prog1'.
Ошибка исчезнет, если я сделаю так, чтобы каждая подпрограмма имела свой собственный каталог в каталоге bin, например, variant_dir="bin/prog1"
,
Итак, мой вопрос заключается в следующем: Как я могу связать объектные файлы из нескольких источников в один и тот же вариант DIR?
В вашем случае я бы позволил SCons создавать различные двоичные файлы в соответствующей папке, а затем использовать Установить строитель скопировать двоичные файлы в bin/
каталог.
Вы бы получили что-то вроде:
env = Environment()
Export('env')
common = env.SConscript("source/common/SConscript_object", variant_dir="object/common", duplicate=0)
Export('common')
prog1 = env.SConscript("source/prog1/SConscript_bin", variant_dir="object/prog1", duplicate=0)
prog2 = env.SConscript("source/prog2/SConscript_bin", variant_dir="object/prog2", duplicate=0)
env.Install('bin', prog1)
env.Install('bin', prog2)
С SConscript подпрограмм, что-то вроде
Import('env')
Import('common')
prog1 = env.Program('prog1', [ env.Glob(*.cpp), common ])
Return('prog1')
Я думаю, что SCons отказывается встраивать разные цели в уникальный каталог вариантов, потому что варианты предназначены для построения заданной цели с разными настройками сборки, такими как режим отладки и выпуска.
Других решений пока нет …