Дымовая Завеса в Eclipse IDE

d8d1ad0017fa0a876603b30f3c469178.png

Прошивки часто пишут в Eclipse. Главная причина- это то, что Eclipse IDE бесплатная.

В Eclipse есть такая возможность, как дымовая завеса неиспользуемых макросов препроцессора. Якобы то, что не используется в коде становится серой зоной отчуждения.

Когда макрос HAS_WATCHDOG не определён, то дымовая завеса присутствует.

дымовая завеса  Eclipse  в действии

дымовая завеса Eclipse в действии

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

56c5ae5a953c3911ca5481eb365dcf29.png

В чём проблема?

Проблема в том, что если Вы собираете проект самостоятельно написанными 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 и прогнать его через препроцессор с отладочными ключами.

03e23e7afedb93572ab917d26d968a35.png

Вот полный 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

Ссылки

© Habrahabr.ru