Дымовая Завеса в Eclipse IDE
Прошивки часто пишут в Eclipse. Главная причина- это то, что Eclipse IDE бесплатная.
В Eclipse есть такая возможность, как дымовая завеса неиспользуемых макросов препроцессора. Якобы то, что не используется в коде становится серой зоной отчуждения.
Когда макрос HAS_WATCHDOG не определён, то дымовая завеса присутствует.
дымовая завеса Eclipse в действии
Когда макрос определён, то дымка исчезает (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
После генерирования списка его по-хорошему следует отсортировать. Для наглядности. Получится примерно такой заголовочный файл 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
Остается только добавить одну строчку и подсветка включится. Успех!
Итоги
Как видите, сборка из make настолько гибкая, что вы ограничены разве, что своей фантазией. Можно не только собирать код, но также и автоматически синтезировать список для подсветки синтаксиса.
Словарь
Акроним | Расшифровка |
CPP | The C PreProcessor |
GCC | GNU Compiler Collection |
Ссылки