
Прошивки часто пишут в Eclipse. Главная причина- это то, что Eclipse IDE бесплатная.
В Eclipse есть такая возможность, как дымовая завеса неиспользуемых макросов препроцессора. Якобы то, что не используется в коде становится серой зоной отчуждения.
Когда макрос HAS_WATCHDOG не определён, то дымовая завеса присутствует.

Когда макрос определён, то дымка исчезает (HAS_I2C, HAS_I2S)

В чём проблема?
Проблема в том, что если Вы собираете проект самостоятельно написанными make скриптами и не используете сборку из плагинов Eclipse, то есть мышкой не прописываете макросы в настройках проекта, то текстовый редактор Eclipse не видит ни одного макроcа. Всё становится серым.
Именно этот аргумент огромная fun база Eclipse плагинов и приводит в качестве главного за Eclipse плагины. Они на полном серьезе с умным выражением лица приводят в качестве главного достоинства в выборе системы сборки вот эту пресловутую серую дымку подсветки макросов! Да, господа. Именно так. Как бы смешно и нелепо это не выглядело...
Якобы то, что не используется в коде должно быть серой зоной. И именно поэтому надо и собирать код именно из-под плагинов Eclipse.
Однако управлять этой дымкой можно и из Make скриптов. Сейчас покажу как именно...
Постановка задачи
Надо сделать так, чтобы в текстовом редакторе Eclipse корректно работала дымка макросов. При этом сами исходники должны собираться из самостоятельно написнных Make скриптов.
Каков план?
1--Надо каким-то образом автоматически сгенерировать *.h файл, который будет содержать перечень всех макроопределений для данной сборки. Назовём его c_defines_generated.h, которые были переданы через опции -D в make скриптах компилятору gcc.
2--В сложном, напичканном макросами файле надо вставить строчку
#include "c_defines_generated.h"
чтобы проверить подсветку макросов.
Реализация
Что надо из софта?
Утилита | Назначение | Адрес |
make | утилита управления программными конвейерами | C:\cygwin64\bin\make.exe |
cpp | утилита вставки и авто замены текста в текстовых файлах | C:\cygwin64\bin\cpp.exe |
eclipse | текстовый редактор на основе виртуальной машины Java | C:\eclipse\eclipse.exe |
sort | Утилита для сортировки текстовых строк | C:\cygwin64\bin\sort.exe |
У меня в make скриптах все макросы сваливаются в переменную окружения CPP_FLAGS. Надо, чтобы макро определения как-то кристаллизировались потом в одном отдельном *.h файлике.
OPT += -DHAS_CLOCK
....
CSTANDARD = -std=c99
CPP_FLAGS += $(CSTANDARD) $(INCDIR) $(OPT)
Чтобы это произошло надо обратить внимание на следующие две опции консольной утилиты препроцессора cpp.exe
Опция утилиты cpp | Назначение опции | Назначение опции |
-E | Preprocess only; do not compile, assemble or link. | Отработать только препроцессору. Не собирать не компоновать. |
-dM | Instead of the normal output, generate a list of ‘#define’ directives for all the macros defined during the execution of the preprocessor, including predefined macros. This gives you a way of finding out what is predefined in your version of the preprocessor. | Генерировать список макросов для всех макросов определённых во время выполнения препроцессора. Это дает вам способ выяснить, что предопределено в вашей версии препроцессора |
Теперь понятно, что надо запрограммировать вот такой конвейер. Создать пустой файл empty_sourсe.c и прогнать его через препроцессор с отладочными ключами.

Вот полный make скрипт генерирования списка всех макро определения в виде отдельной цели generate_definitions. Эту цель легко вмонтировать в общий скрипт сборки.
.PHONY: generate_definitions
generate_definitions:
$(info GenerateDefinitions...)
$(PREPROCESSOR_TOOL) $(CPP_FLAGS) $(WORKSPACE_LOC)empty_sourse.c -dM -E> c_defines_generated.h
$(SORTER_TOOL) -u c_defines_generated.h -o c_defines_generated.h
После генерирования списка макросов его по-хорошему следует отсортировать. Для наглядности. Это делает консольная утилита sort.exe c ключом -u. Получится примерно такой заголовочный файл c_defines_generated.h
Скрытый текст
#define AT32F435ZM 1
#define AT32F435ZMT7 1
#define HAS_AT32F435ZM 1
#define HAS_AUDIO 1
#define HAS_BIN_2_STR 1
#define HAS_BIT_SWAP 1
#define HAS_BOARD 1
#define HAS_BOARD_CUSTOM 1
#define HAS_BOARD_CUSTOM_COMMANDS 1
#define HAS_HEALTH_MONITOR_PROC 1
#define HAS_HEAP 1
#define HAS_HW_TESTS 1
#define HAS_I2C 1
#define HAS_I2C2 1
...
#define __UINT16_MAX__ 0xffff
#define __UINT16_TYPE__ short unsigned int
#define __UINT32_C(c) c ## UL
#define __UINT32_MAX__ 0xffffffffUL
#define __UINT32_TYPE__ long unsigned int
#define __UINT64_C(c) c ## ULL
#d
#define __UINT_FAST8_TYPE__ unsigned int
#define __UINT_LEAST16_MAX__ 0xffff
#define __UINT_LEAST16_TYPE__ short unsigned int
#define __UINT_LEAST32_MAX__ 0xffffffffUL
#define __UINT_LEAST32_TYPE__ long unsigned int
#define __UINT_LEAST64_MAX__ 0xffffffffffffffffULL
#define __UINT_LEAST64_TYPE__ long long unsigned int
#define __UINT_LEAST8_MAX__ 0xff
#define __UINT_LEAST8_TYPE__ unsigned char
#define __WCHAR_WIDTH__ 32
#define __WINT_MAX__ 0xffffffffU
#define __WINT_MIN__ 0U
#define __WINT_TYPE__ unsigned int
#define __WINT_WIDTH__ 32
#define __arm__ 1
Остается только добавить одну строчку #include "c_defines_generated.h" и подсветка включится. Успех!
Итоги
Как видите, сборка из make настолько гибкая, что вы ограничены разве, что своей фантазией. Можно не только собирать код, но также и автоматически синтезировать список для подсветки синтаксиса.
Надеюсь, что этот текст поможет другим программистам тоже улучшить свой инструментарий.
Словарь
Акроним | Расшифровка |
CPP | The C PreProcessor |
GCC | GNU Compiler Collection |
Ссылки