build - El código fuente compilado de un Repositorio() no se pone en el directorio de variante para un proyecto Hierarchical SCons
(1)
Hice esta misma pregunta en la lista de correo SCons-users y recibí información que en parte responde a esta pregunta. Gracias a Dirk Baechle
por ayudarme con este problema.
La función Repository()
efectivamente monta el directorio pasado a la raíz del proyecto SCons: eso es para el directorio donde está el archivo SConstruct
. Si es necesario hacer referencia a los archivos en un subdirectorio repo en los subdirectorios del proyecto SCons, los nombres de los subdirectorios (el del directorio repo y el del proyecto scon) deben coincidir. Es por eso que las diferentes opciones en el archivo SConscript
en la pregunta anterior no pueden encontrar el archivo repo.
Si el moduleA
existía con el archivo repoFile.cc
, se encontraría como se esperaba y el objeto compilado se colocaría en el variant_dir como se esperaba.
Una de las limitaciones que veo para la función Repository()
es que no puede montar el directorio repo en un subdirectorio de proyecto SCons. Esto suena como una solicitud de función.
El hecho de que SCons coloque el archivo de objeto compilado en el directorio fuente me parece un error. Por lo menos, debe colocarse en el directorio raíz variant_dir.
Tengo un proyecto jerárquico que usa código fuente de un directorio de sistema común, para el cual estoy usando la función SCons Repository()
y quiero que todo el resultado de compilación (código local y código tomado del Repositorio) se coloque en un variant_dir.
Si utilizo la función Repository()
en un escenario simple (no jerárquico sin llamadas a SConscripts de subdirectorio), el archivo de objeto Repository () compilado se coloca en variant_dir como se esperaba. Pero si hago lo mismo en una compilación jerárquica, el archivo de objeto Repository()
compilado se coloca en el directorio raíz del proyecto.
Suponiendo que quiero usar el siguiente código fuente ubicado en un directorio del sistema:
/usr/local/repoDir/repoFile.cc
Y tengo la siguiente estructura de proyecto:
# tree .
.
|-- SConstruct
|-- build
| `-- linux_x86_64
`-- moduleA
|-- localFile.cc
`-- SConscript
Aquí están los scripts de compilación:
SConstruct
Editar: se eliminó el nombre de archivo de la llamada a Repositorio (), gracias a Dirk Baechle de [email protected] por señalarlo.
env = Environment()
env.Repository(''/usr/local/repoDir'')
env[''variantDir''] = ''build/linux_x86_64''
SConscript(''moduleA/SConscript'',
exports = [''env''],
variant_dir = env[''variantDir''],
duplicate = 0)
moduleA / SConscript
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)
Me gustaría que se repoFile.cc
archivo repoFile.cc
y que su archivo de objeto se coloque en build/linux_x86_64
, pero en su lugar se coloca en el mismo directorio que el SConstruct raíz.
Como puede ver en los comentarios en el moduleA/SConscript
, traté de hacer referencia a repoFile.cc
diferentes maneras, y la única manera en que funcionó es como se menciona allí. Además, intenté llamar a la función Repository()
en el moduleA/SConscript
, pero no cambió nada.
Editar : Aquí está la salida de compilación
# 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.
Y la estructura de directorios resultante:
# 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
Revisé y encontré esto, pero no es lo mismo:
Scons Hierarchical Builds con el directorio Repository
¿Alguna sugerencia sobre cómo puedo obtener el archivo objeto en el lugar correcto?