У меня есть встроенное программное обеспечение, полностью написанное на C и Assembly, и для его сборки я использую Scons и GCC. Исходный код организован в разные папки, и каждая папка представляет собой «отдельный» подпроект (т. Е. Приложение elf, статический libray и т. Д.).
Основной файл SConstruct, расположенный внутри главной папкиproject, создает среду по умолчанию, добавляя в нее некоторые флаги компиляции, общие для всех подпроектов, затем вызывает SConscripts, помещенные в каждый подпроект, экспортируя среду по умолчанию.
Каждый подпроект создаетновая среда клонирует среду по умолчанию и настраивает ее с помощью новых компоновщиков, новых флагов компиляции и т. д.
Проблема возникает из-за того, что мне нужно добавить для всех подпроектов некоторые действия после компиляции каждого объектного файла. Короче говоря, мне нужно сгенерировать предварительно обработанный файл для каждого ".c" и ".S", вызывая препроцессор с теми же флагами, которые используются при обычной компиляции. Я думаю, что для этого лучше всего добавить флаг компиляции "-save-temps = obj" в среду по умолчанию (этот флаг указывает компилятору сохранить временные файлы), чтобы все подпроекты унаследовали это поведение.
Проблема в том, что SCons не отслеживает каждый сгенерированный временный файл. Учитывая, что:
- для каждого файла .c, gcc создаст два временных файла .i и .s
- для каждого файла .S, gcc создаст один временный файл. s
Мне нужно добавить в конструктор объектов по умолчанию:
- SideEffect, чтобы сообщить scons, что при компиляции .c в .o будет создан и файл .i;
- SideEffect, сообщающее scons, что компиляция .c to .o создаст также файл .s;
- SideEffect, сообщающий scons, что компиляция .S to .o также создаст.s file;
Есть ли способ сделать это только с помощью суффиксов файлов и без перечисления каждого целевого объектного файла?
Кроме того, для каждого временного файла мне нужновызвать пользовательский инструмент, снова с теми же флагами компиляции, которые использовались для его компиляции, чтобы создать другие файлы с другой отладочной информацией. Как я могу это сделать? Есть ли способ добавить пост-действие в конструктор объектов?
Спасибо,
Ciro