Бойся своих желаний!
[ZX]
Я на make писал парсер текстового файла. В общем идея заключалась в том, что файл обрабатывался чем-то вроде sed, awk, да хоть perl, и превращался в текст программы на языке make, который исполнялся через eval. В данном случае можно попроще: распарсить .h файл средствами самого C-препроцессора, потом проверить опять же самим препроцессором наличие макроса и вывести разную строку в зависимости от. Далее тривиально.
Сам Makefile:
# remove it if you need builtin rules
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:
# current Makefile name
Makefile = $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
# macro should be evaluated via $(call), arguments: $1 - .h file, $2 - macro name
ifdef = $(strip $(foreach _, \
$(lastword $(shell $(MAKE) -f $(Makefile) ifdef hfile="$(strip $1)" macro="$(strip $2)")), \
$(if $(filter true false, $_), $(filter true, $_), $(error $_))))
result_name := $(if $(hfile),, $(if $(call ifdef, test.h, OK), macro_present, macro_not_present))
all:
echo result = $(result_name)
# helper for ifdef
nul :=
define ifdef_helper
$(nul)
#include "$(hfile)"
#ifdef $(macro)
true
#else
false
#endif
$(nul)
endef
.PHONY: ifdef
ifdef: dummy = $(eval define cpp $(ifdef_helper) endef) $(eval export cpp)
ifdef:
@printf '%s\n' "$$cpp" | (cpp - || echo ERROR) | tail -1 # $(dummy)
Пример, файл test.h:
#define OK 1
Код, наверное, очевиден и интуитивно-понятен, надеюсь (иначе нефиг такие вопросы задавать).