January 16th, 2020

Костерок

Как лаконично написать макрос TODO?

Почему-то у gcc нет опции _Pragma(GCC message). Пробую реализовать так:
#define DO_PRAGMA(x) _Pragma (#x)
#define TODO(x) DO_PRAGMA(GCC warning #x)

В "чистовой" сборке работает, а вот в debug — нет (т.к. у меня в debug-сборке добавляется -Werror).
И как же быть? Как не забыть обо всех своих TODO'шках, чтобы во время сборки напоминания постоянно вылезали? Писать вручную
#pragma message "TODO: add very usefull feature"

лень... Да и TODO-макросы можно было бы скрывать в чистовых сборках.

UPD. Плохой все-таки из меня "гугольщик"! Стал уже писать вопрос на SO, как вылезли похожие, и среди них было как раз то, что мне нужно!
В общем, вот как:
#ifdef EBUG
#define DO_PRAGMA(x) _Pragma (#x)
#define TODO(x) DO_PRAGMA(message #x)
#else
#define TODO(x)
#endif

Плохо я гуглил о _Pragma! Оказывается, не нужно там GCC ... писать.

P.S. Что-то давно я на stackexchange не заходил. "Карма" в стагнации...
promo eddy_em august 17, 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
Костерок

Makefil'ы для release и debug

Ковыряясь с TODO, решил еще и Makefile немножко улучшить. С cmake я уже раньше подобное вытворял, но с Makefile пока как-то ручками (а то и иной раз вообще в начале makefile писал DEFS+=-DEBUG и комментировал эту строку для release).
Вот что получилось. Привожу основную выжимку:
# это пишем в начале, где определяем всякое разное, целью по умолчанию будет release
TARGET := RELEASE 
# здесь у меня всякий мусор хранится, чтобы некошерными файлами не заваливать основную директорию с кодом
OBJDIR = mk
# самой первой целью задаем умолчательную:
all: $(OBJDIR)/RELEASE  # в поддиректории mk создаем файл RELEASE или DEBUG в зависимости от модели сборки
all: bin list size
release: all # отдельно даем возможность писать не просто make, но и make release (хоть это и одно и то же)
# а теперь - для debug, здесь добавляем -DEBUG и -Werror
debug: CFLAGS += -DEBUG -Werror
debug: TARGET := DEBUG # меняем имя цели 
debug: $(OBJDIR)/DEBUG # и меняем зависимость от файла
debug: bin list size # писать здесь all нельзя, т.к. all зависит от $(OBJDIR)/RELEASE
# ну и объявим виртуально, что сами файлы mk/DEBUG и mk/RELEASE "создаются" при помощи make clean:
$(OBJDIR)/DEBUG:
    make clean
$(OBJDIR)/RELEASE:
    make clean
# ну и в цель - бинарник - добавляем создание нужных файлов:
$(BIN): $(ELF)
	@echo "TARGET: $(TARGET)"
	@> $(OBJDIR)/$(TARGET)


Все! Теперь покуда мы сидим в одной модели, правка отдельных файлов вызовет лишь их пересборку при соответствующих флагах. Как только модель поменяли, в mk/ не оказывается нужного файла, вызывается make clean, а затем новая модель сборки выполняется начисто! Вуаля!
Collapse )
  • Tags