ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
1019255 Топик полностью
Связанные сообщения
Make
Сборка проектов с использованием make. Как оно работает - ежу понятно. А вот как его ИСПОЛЬЗОВАТЬ??? Нашел классную статью, кото...2021-11-08
fk0, легенда (17.07.2020 21:57, просмотров: 525) ответил AlexBi на Можно ли средствами GNU в makefile анализировать содержимое файлов? У меня есть проект, собирается make, в проекте есть файлы с #define. Я хочу что бы в зависимости от того, что там в define получались разные имена файла у результата. Все это в виндовсе с установленным msys.
Бойся своих желаний! 

Я на 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                                                                                                                
 

Код, наверное, очевиден и интуитивно-понятен, надеюсь (иначе нефиг такие вопросы задавать).

[ZX]