Я использовал двухфайловый метод, такой как ответ richq, но, хотя конечные продукты сборки (библиотеки, программы) собирались в правильном каталоге вариантов, объектные файлы все еще шли в исходный каталог.
Оказалось, что решение заключается в добавлении исходных файлов по относительному пути, а не по абсолютному. Понятия не имею почему.
Мой второй файл scons изначально выглядел так. Обратите внимание, что глобализация происходит по абсолютному пути - когда я впервые написала это, я не знала, что пути будут автоматически относиться к файлу scons.
import os, inspect
env = Environment()
packageDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
src = Glob(os.path.join(packageDir, "src/*/*.c*"), strings=True, source=True)
env.Program('Foo', source = src)
И это привело к тому, что * .obj оказался в src /, а программа - в моем варианте dir. Когда я изменил его на следующее, объектные файлы также перешли к варианту dir:
env = Environment()
src = Glob("src/*/*.c*", strings=True, source=True)
env.Program('Foo', source = src)
Использование абсолютных путей, вероятно, является ошибкой нуба - я относительно новичок как в scons, так и в Python - но я подумал, что поделюсь этим на случай, если у кого-то возникнет такая же неприятная проблема.