Знает ли scons, в каком каталоге находится файл SConscript?

Мы оцениваем 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", а если он не существует, используйте подстановку. Поэтому я определяю свою библиотеку так

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 до сегодняшнего дня

8
задан Community 23 May 2017 в 12:16
поделиться