Stiamo valutando gli scons come un sistema di compilazione e sto riscontrando un problema nel nostro vecchio sistema. In alcune delle sottodirectory del nostro codice sorgente, abbiamo un file "sources.lib" che elenca i nomi dei file C++ che devono essere compilati per assemblare la libreria di destinazione di quella directory. Ma ci sono altri file C++ nella stessa directory, quindi non posso semplicemente usare Glob() per trovare quelli appropriati.Gli scons sanno in quale directory risiede un file SConscript?
Come individuare la directory in cui risiede un file SConscript? os.getcwd() restituisce sempre la directory di build. Anche se la documentazione afferma che i percorsi in uno SConscript sono relativi alla directory di origine (oppure che Glob ('*. Cpp') non funzionerebbe), solo facendo un open ('sources.lib') fallisce perché cerca il file nella directory di build. Infine, l'ambiente di compilazione in quel file SConscript non contiene la directory di origine corrente attuale.
Modifica Da this reply Sembra
File('sources.lib').srcnode().abspath
restituisce il corretto nome del file e directory, ma che non vi dirà se esiste (deve utilizzare os.path.isfile per questo). Sembra anche che
Dir('.').srcnode().abspath
vi dirà dove si trova il file SConstruct.
Esempio Quando si definisce quale sorgente file da compilare per una libreria, non voglio usare
lib = env.SharedLibrary('mylib', Glob('*.cpp'))
ma invece preferiscono costruire una funzione che controlla innanzitutto per l'esistenza di "sources.lib "e se non esiste, usa il globbing. Così sto definendo la mia libreria in questo modo
lib = env.SharedLibrary('mylib', env.getSources('*.cpp'))
e fare una funzione che legge il file se esiste
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)
Questo sembra funzionare. Non sapevo di File.srcnode(). Abspath fino ad oggi.
per determinare se esiste un file, è possibile utilizzare os.path.exists() – Brady
non capisco il problema, creare piccolo esempio che illustrano esso. – Torsten
La tua domanda mi ha salvato :) 'Dir ('.'). Srcnode(). Abspath' ha funzionato per me. Io uso questa opzione 'env.SConscriptChdir (0)' per evitare la directory "diapositive". Grazie! – Destroyica