2012-03-21 10 views
7

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.

+0

Para determinar si existe un archivo, puede utilizar os.path.exists() – Brady

+0

No entiendo su problema, crear pequeño ejemplo que ilustran la misma. – Torsten

+0

Tu pregunta me salvó :) 'Dir ('.'). Srcnode(). Abspath' funcionó para mí. Uso esta opción 'env.SConscriptChdir (0)' para evitar el directorio "diapositivas". ¡Gracias! – Destroyica

Respuesta

2

Hay 3 tipos de caminos en SCons:

  1. relativa a la raíz SConstruct anteponiendo '#' al camino
  2. relativa a la SConscript no usar el '#'.
  3. Ruta absoluta.Creo que esto se explica por sí :)

Si tiene que lidiar con los caminos fuera del directorio en el que el SConscript es, se debe utilizar el '#'

Se debe trabajar en ambos sentidos en este ejemplo , pero la ruta con el '#' parece más explícita e intuitivo para mí:

./SConstruct 
./dirA/SConscript - use '#dirA/sources.lib' OR 'sources.lib' 
./dirB/SConscript - use '#dirB/sources.lib' OR 'sources.lib' 

Espero que esto ayude,

Brady

+0

De acuerdo con la documentación, la ruta relativa predeterminada es para el archivo SConstruct curretn y no para donde se ejecutó scons. –

+0

Tiene toda la razón, yo también lo probé. Perdón por la confusión, corregiré mi respuesta. Tuve un problema con esto una vez y estaba convencido de que era relativo a donde se ejecutó scons, por ejemplo, si estás en un subdirectorio y usas 'scons -u', pero parece que ese no es el caso. Gracias por la corrección. – Brady

+1

Pero, ¿qué hay del * current * SConscript, a diferencia del SConscript que realmente llama a un constructor? En mi caso, estoy tratando de configurar el entorno común para ser utilizado por muchos submódulos; esto incluye agregar un directorio 'include /' en el directorio SConscript actual a CPPPATH. –

4

utilizo el siguiente código:

this_sconscript_file = (lambda x:x).func_code.co_filename 
code_base = os.path.dirname(this_sconscript_file) 
+0

¿No hace 'os.path.dirname (__ file __)' lo mismo? – tutuca

+2

No, porque scons incluye SConscripts de alguna manera de tal manera, que '__file__' siempre refiere al script raíz, incluso en scripts incluidos. – olpa

+0

Buena solución. Sigo pensando que 'Dir ('.'). Srcnode(). Abspath' es una solución más agradable. – gg349

Cuestiones relacionadas