Почему scons не может найти исходные файлы моего проекта?

Вот мой проект на github.

Вот мой файл SConstruct:

SConscript('main.scons', variant_dir = 'build', duplicate = 0)

Вот мой файл main.scons:

import sys
import os
import fnmatch

def find_source_files(directory, ext = "cpp"):
matches = []
for root, dirnames, filenames in os.walk(directory):
for filename in fnmatch.filter(filenames, '*.' + ext):
matches.append(os.path.join(root, filename))
return matches

if __name__ == '__main__':
for f in find_source_files('src'):
print f
else:
Program(target = 'main.bin', source = find_source_files('src'))

Вот что я получаю, когда запускаю его:

bitcycle @ cypher ~/git/IeiuniumTela $ find $(pwd) -name "*.bin" -or -name "*.o" -exec rm {} \;;  scons; find $(pwd) -name "*.bin" -or -name "*.o"
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
gcc -o build/main.bin
gcc: fatal error: no input files
compilation terminated.
scons: *** [build/main.bin] Error 4
scons: building terminated because of errors.

Вот что происходит, когда я запускаю `python main.scons ‘, чтобы проверить это:

bitcycle @ cypher ~/git/IeiuniumTela $ python main.scons
src/main.cpp

Мне трудно понять, почему он не может найти мои исходные файлы. Есть предложения или идеи здесь?

[ОБНОВИТЬ] Получив хорошее направление из списка рассылки, я обнаружил, что это работает «достаточно хорошо» для меня.

/ SConstruct: SConscript('src/main.scons', variant_dir = 'build', duplicate = 0)

/src/main.scons: Program(target = 'main.bin', source = Glob('*.cpp'))

Смотрите репозиторий github для полного дерева исходников. Я также добавил пустой каталог сборки в репозиторий для полноты картины. Мне интересно, что:

а. Версия Glob для SCons не является рекурсивной в контексте этого инструмента для поиска источника. Я ожидаю, что предпочтительнее вариант рекурсивного обнаружения. 🙁

б. я необходимость поместить файл scons в тот же каталог, что и исходный файл (что раздражает).

с. Операторы печати, очевидно, работают, но sys.stdout.write не работает (из модуля python).

3

Решение

Может быть потому, что ваш main.scons файл уже находится в src каталог, и ваш find_source_file на самом деле ищет src/src?
Он нашел источники для меня, когда я переместил файлы scons в верхний каталог.

Обновить:
После расследования variant_dir устанавливает рабочий каталог build, Так что ваши find_source_files ищет файлы в build/src и ничего не находит. Было бы наверное лучше либо позвонить find_source_files из файла SConstruct, или использовать VariantDir() вместо main.scons.

0

Другие решения

SCons обрабатывает относительные пути к каталогам иначе, чем Python, поэтому я не удивлюсь, увидев разницу между выполнением теста и выполнением SCons. Обычно в SCons все относится к корневому сценарию SConstruct или сценарию SConscript.

Ваш код выглядит правильно, но как насчет добавления некоторых отладочных операторов печати в find_source_files() выяснить, что именно происходит?

Возможно, вы планируете использовать find_source_files() позже, но для простого случая одного исходного файла кажется, что вы слишком усложняете вещи, и вы можете просто использовать следующее в main.scons:

Program(target = 'main.bin', source = 'src/main.cpp')
0

По вопросам рекламы [email protected]