Вопрос по – Исходный код, скомпилированный из Repository (), не помещается в вариант dir для проекта Hierarchical SCons

1

У меня есть иерархический проект, который использует исходный код из общего системного каталога, для которого я использую SConsRepository() и хотите, чтобы все выходные данные сборки (локальный код и код, взятый из репозитория) были помещены в файл variable_dir.

Если я используюRepository() функция в простом сценарии (не иерархическая, без обращений к подкаталогу SConscripts), затем скомпилированный объектный файл Repository () помещается в variable_dir, как и ожидалось. Но если я сделаю то же самое в иерархической сборке, скомпилированныйRepository() Объектный файл помещается в корневой каталог проекта.

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

<code>/usr/local/repoDir/repoFile.cc
</code>

И у меня есть следующая структура проекта:

<code># tree .
.
|-- SConstruct
|-- build
|   `-- linux_x86_64
`-- moduleA
    |-- localFile.cc
    `-- SConscript
</code>

Вот сценарии сборки:

SConstruct

Edit: Удалено имя файла из вызова в Repository (), спасибо Dirk Baechle из [email protected] за то, что указал на это.

<code>env = Environment()

env.Repository('/usr/local/repoDir')

env['variantDir'] = 'build/linux_x86_64'

SConscript('moduleA/SConscript',
           exports = ['env'],
           variant_dir = env['variantDir'],
           duplicate = 0)
</code>

ModuleA / SConscript

<code>import os

Import('env')

srcFiles = [
  'localFile.cc',
  #os.path.join(env['variantDir'], 'repoFile.cc'),          # fails to find source file
  #'#%s' % os.path.join(env['variantDir'], 'repoFile.cc'),  # fails to find source file
  #'repoFile.cc',                                           # fails to find source file
  '#repoFile.cc',  # only option that works, but places object in root proj dir
]

env.Append(CPPPATH = ['.', '#'])
env.Program(target = 'myApp', source = srcFiles)
</code>

Я хотел быrepoFile.cc файл, который нужно скомпилировать и поместить его объектный файл вbuild/linux_x86_64, но вместо этого он находится в том же каталоге, что и корневой SConstruct.

Как вы можете видеть из комментариев вmoduleA/SConscriptЯ пытался ссылаться наrepoFile.cc несколько разных способов, и единственный способ, который работал, как указано в нем. Кроме того, я попытался позвонитьRepository() функция вmoduleA/SConscript, но это ничего не изменило.

Edit: Вот вывод компиляции

<code># scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o repoFile.o -c -Ibuild/linux_x86_64 -ImoduleA -I/usr/local/repoDir/moduleA -I/usr/local/repoDir/build/linux_x86_64 -I. -I/usr/local/repoDir /usr/local/repoDir/repoFile.cc
g++ -o build/linux_x86_64/localFile.o -c -Ibuild/linux_x86_64 -ImoduleA -I/usr/local/repoDir/moduleA -I/usr/local/repoDir/build/linux_x86_64 -I. -I/usr/local/repoDir moduleA/localFile.cpp
g++ -o build/linux_x86_64/myApp build/linux_x86_64/localFile.o repoFile.o
scons: done building targets.
</code>

И результирующая структура каталогов:

<code># tree .
.
|-- repoFile.o    <=== This file should be in build/linux_x86_64 NOT here
|-- SConstruct
|-- build
|   `-- linux_x86_64
|       |-- localFile.o
|       `-- myApp
`-- moduleA
    |-- localFile.cpp
    `-- SConscript
</code>

Я проверил и нашел это, но это не совсем то же самое:

Иерархические сборки Scons с каталогом репозитория

Любые предложения относительно того, как я могу получить объектный файл в нужном месте?

Ваш Ответ

1   ответ
0

некоторую информацию, которая частично отвечает на этот вопрос. БлагодаряDirk Baechle за помощь в решении этой проблемы.

TheRepository() эффективно функционировать Монтирует каталог, переданный в корень проекта SCons: это каталог, в которомSConstruct файл есть. Если на файлы в подкаталоге репо нужно ссылаться в подкаталогах проекта SCons, то имена подкаталогов (имена каталога репозитория и каталога проекта scons) должны совпадать. Вот почему разные варианты вSConscript файл в вопросе выше не может найти файл репо.

Если подкаталог репоmoduleA существовал с файломrepoFile.cc, тогда он будет найден, как и ожидалось, и скомпилированный объект будет помещен в variable_dir, как и ожидалось.

Одно ограничение, которое я вижу дляRepository() функция в том, что вы не можете Крепление каталог репо в подкаталог проекта SCons. Это похоже на запрос функции.

Тот факт, что SCons помещает скомпилированный объектный файл в исходный каталог, кажется мне ошибкой. По крайней мере, он должен быть помещен в корневой каталог option_dir.

Похожие вопросы