Есть ли способ экспортировать предопределенные макросы из конфигурации сборки Keil?

Контекст:

Я пытаюсь автоматизировать некоторые из более рутинных задач разработки встраиваемых систем с помощью Keil. Конечный результат, к которому я стремлюсь, заключается в том, что щелчок по сборке в проекте Keil запустит этап предварительной сборки, который запускает весь код через Uncrustify (улучшитель исходного кода), чтобы убедиться, что он соответствует руководству по стилю компании, и сообщение -build шаг, который затем запускает код через pc-lint (статический анализатор кода), чтобы выделить любой потенциально небезопасный код, который он может найти. Я написал утилиту для ПК, которая ищет в файле .uvproj макросы #define, пути включения и пути к файлам, которые необходимы для обоих инструментов, а затем изменяет пользовательские команды до и после сборки для вызова мои пакетные файлы, которые будут управлять обоими шагами. Часть с расщеплением работает нормально, а часть с ворсом выдает разумные сообщения, но отношение сигнал/шум не так уж велико.

Моя проблема:

Lint продолжает генерировать сообщения, которые, похоже, относятся к макросам, о которых знает компилятор Keil, но о котором Lint не знает. Я пытаюсь найти способ восполнить этот пробел. Я нашел таблицу предопределенных макросов, задокументированную на веб-сайте Keil. , что кажется хорошим началом, но вместо того, чтобы вручную копировать их в статический файл .lnt, я хотел бы найти способ получить актуальные значения во время сборки проекта. Таким образом, например, макрос «__ARMCC_VERSION» будет обновляться каждый раз, когда разработчик обновляет свой компилятор Keil, а не застревает на каком-то моменте времени, когда я копирую его вручную.

Я был бы рад, если бы кто-то мог ответить на мой вопрос напрямую, но я был бы в равной степени рад, если бы у кого-то было жизнеспособное предложение для более простого альтернативного подхода, который я мог бы попробовать вместо этого. Большое спасибо!


person P Moody    schedule 23.06.2017    source источник


Ответы (1)


Я предполагаю, что вы используете компилятор Keil ARM.

Из Руководства пользователя компилятора:

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

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

ИЗМЕНИТЬ:

Похоже, ваш SDK также добавляет несколько макросов.

Из Руководства пользователя µVision:

В зависимости от использования MDK добавляются следующие управляющие строки:

__УФ-ВЕРСИЯ:

Основная и дополнительная версии µVision. Например: -D__UVISION_VERSION="520".

РТЕ:

Установите, когда используется RTE. Например: -D_RTE_.

__RTX:

Устанавливается, когда Ядро RTX выбрано в Параметры для Цели — Цели — Операционная система. Не устанавливается при использовании RTE. Например: -D__RTX.

__МИКОРЛИБ:

Устанавливается, когда Использовать MicroLIB включено в Параметры для цели — цель. Например: -D__MICROLIB.

__ОЦЕНКА:

µVision работает в режиме оценки. Лицензия MDK-Lite. Например: -D__EVAL.

имя заголовка устройства:

Имя заголовка устройства.

person thetic    schedule 28.06.2017
comment
Это как раз то, что я искал. При использовании с пустым исходным файлом 'armcc.exe empty.c --list_macros' он не дает всех правильных значений, поскольку макрос '_TARGET_CPU,,,' вместе с настройки оптимизации были установлены на неправильные значения по умолчанию. Чтобы преодолеть это, в моем случае (с процессором cortex-M3, без оптимизации и с использованием ядра RTX) я смог получить желаемый результат, используя: 'armcc.exe --cpu Cortex-M3 -O0 -D__RTX empty.c --list_macros' Таким образом, вывод почти идентичен файлу .h, который создает и использует встроенный инструмент Lint. - person P Moody; 29.06.2017
comment
все, что остается отсутствующим, - это макрос __UVISION_VERSION, о котором я упоминал в своем первоначальном вопросе. На данный момент, по крайней мере, до тех пор, пока у меня не появится вдохновение, чтобы преодолеть это, я просто справлюсь с этим жестко закодировав, так как это вряд ли существенно повлияет на код каким-либо образом. - person P Moody; 29.06.2017