Знает ли scons, в каком каталоге находится файл SConscript? - PullRequest
7 голосов
/ 21 марта 2012

Мы оцениваем scons как систему сборки, и у меня возникла проблема с размещением нашей старой системы. В некоторых из наших подкаталогов исходного кода у нас есть файл «sources.lib», в котором перечислены имена файлов C ++, которые необходимо скомпилировать для сборки целевой библиотеки этого каталога. Но в том же каталоге есть дополнительные файлы C ++, поэтому я не могу просто использовать Glob (), чтобы найти подходящие.

Как узнать, в каком каталоге находится файл SConscript? os.getcwd () всегда возвращает каталог сборки. Хотя в документации говорится, что пути в SConscript относятся к исходному каталогу (иначе Glob ('*. Cpp') не сработает), просто выполнить open ('sources.lib') не удастся, потому что он ищет файл в каталоге сборки. Наконец, среда сборки в этом файле SConscript не содержит фактического текущего исходного каталога.

Редактировать С этот ответ выглядит как

File('sources.lib').srcnode().abspath

возвращает правильное имя файла и каталог, , но не сообщит вам, существует ли он (для этого необходимо использовать os.path.isfile). Также представляется, что

Dir('.').srcnode().abspath

скажет вам, где находится файл SConstruct.

Пример При определении, какие исходные файлы компилировать для библиотеки, я не хочу использовать

lib = env.SharedLibrary('mylib', Glob('*.cpp'))

но вместо этого он скорее построит функцию, которая сначала проверяет существование «sources.lib» и, если он не существует, использует globbing. Итак, я определяю свою библиотеку примерно так

lib = env.SharedLibrary('mylib', env.getSources('*.cpp'))

и создание функции, которая читает файл, если он существует

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)

Это похоже на работу. Я не знал о File.srcnode (). Abspath до сегодняшнего дня.

Ответы [ 2 ]

5 голосов
/ 29 мая 2012

Я использую следующий код:

this_sconscript_file = (lambda x:x).func_code.co_filename
code_base = os.path.dirname(this_sconscript_file)
2 голосов
/ 21 марта 2012

В SCons есть 3 типа путей:

  1. Относительно корневого SConstruct, предваряющего '#' к пути *
  2. Относительно того, что SConscript не использует '#'.
  3. Абсолютный путь.Я думаю, что это само за себя:)

Если вам нужно иметь дело с путями вне каталога, где находится SConscript, вы должны использовать '#'

Это должно работатьв этом примере оба пути, но путь с '#' кажется мне более понятным и интуитивно понятным:

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

Надеюсь, это поможет,

Brady

...