Estamos evaluando scons como un sistema de compilación, y tengo un problema para nuestro antiguo sistema. En algunos de nuestros subdirectorios de código fuente, tenemos un archivo "sources.lib" que enumera los nombres de los archivos C++ que deben compilarse para ensamblar la biblioteca de destino de ese directorio. Pero, hay archivos C++ adicionales en el mismo directorio, por lo que no puedo usar Glob() para encontrar los apropiados.¿Sabe scon en qué directorio reside un archivo SConscript?
¿Cómo puedo saber en qué directorio reside un archivo SConscript? os.getcwd() siempre devuelve el directorio de compilación. Aunque la documentación indica que las rutas en un SConscript son relativas al directorio de origen (o si no, Glob ('*. Cpp') no funcionaría), simplemente hacer un open ('sources.lib') falla porque busca el archivo en el directorio de compilación. Finalmente, el entorno de compilación en ese archivo SConscript no contiene el directorio de origen actual real.
Editar De this reply se ve como
File('sources.lib').srcnode().abspath
devuelve el nombre del archivo y el directorio adecuado, pero que no le dirá si existe (debe utilizar os.path.isfile para eso). También parece que
Dir('.').srcnode().abspath
le dirá dónde reside el archivo SConstruct.
Ejemplo Al definir qué fuente de archivos para compilar para una biblioteca, no quiero usar
lib = env.SharedLibrary('mylib', Glob('*.cpp'))
sino que prefieren construir una función que busca en primer lugar la existencia de "sources.lib "y si no existe, usa globbing. Así que estoy definiendo mi biblioteca como tal
lib = env.SharedLibrary('mylib', env.getSources('*.cpp'))
y hacer una función que lee el archivo si existe
def getSources(self, pattern): # list of source files to assign to a target sources = [] # srcFile = 'sources.lib' # failed # srcFile = os.path.join(os.getcwd(), 'sources.lib') # failed srcFile = File('sources.lib').srcnode().abspath # works # look for sources.lib try: infile = open(srcFile,'r') except IOError: #print "Globbing to get sources" sources = Glob(pattern, strings=True) else: #print "Reading sources.lib" for line in infile.readlines(): line = line.rstrip('\n\r') if line != '': sources.append(line) return sources buildEnv.AddMethod(getSources)
Esto parece funcionar. No sabía sobre File.srcnode(). Abspath hasta hoy.
Para determinar si existe un archivo, puede utilizar os.path.exists() – Brady
No entiendo su problema, crear pequeño ejemplo que ilustran la misma. – Torsten
Tu pregunta me salvó :) 'Dir ('.'). Srcnode(). Abspath' funcionó para mí. Uso esta opción 'env.SConscriptChdir (0)' para evitar el directorio "diapositivas". ¡Gracias! – Destroyica