Получение сводки предупреждений компилятора

#makefile #g #warnings #compiler-warnings

#makefile создать файл #g #предупреждения #предупреждения компилятора #makefile

Вопрос:

Есть ли способ, которым я могу получить сводку всех предупреждений компилятора в конце сборки? Использование g в Makefile

Комментарии:

1. Только написав свой собственный скрипт для извлечения их из выходных данных make.

Ответ №1:

Вы могли бы создать свою собственную команду make для компиляции и использовать ее в своих рецептах. Вы могли бы, например, автоматически записывать стандартные выходные данные вашего компилятора и сообщения об ошибках в текстовые файлы и grep все их для получения предупреждений в конце вашей сборки. Что-то вроде (с GNU make):

 # $(1): source file
# $(2): object file
# $(3): log file
MYCXX = $(CXX) $(CXXFLAGS) -c $(1) -o $(2) 2>amp;1 | tee $(3)

CXXFLAGS  = -Wall -pedantic

%.o: %.cpp
    $(call MYCXX,$<,$@,$*.log)

OBJS := $(patsubst %.cpp,%.o,$(wildcard *.cpp))
LOGS := $(patsubst %.o,%.log,$(OBJS))

top: $(OBJS)
    $(CXX) $(LDFLAGS) $^ -o $@
    @printf 'nSummary of warningsn###################nn'
    @for l in $(LOGS); do grep -i -10 warning $$l || true; done
  

ДЕМОНСТРАЦИЯ:

 $ make
g   -Wall -pedantic -c b.cpp -o b.o 2>amp;1 | tee b.log
g   -Wall -pedantic -c c.cpp -o c.o 2>amp;1 | tee c.log
g   -Wall -pedantic -c a.cpp -o a.o 2>amp;1 | tee a.log
g   -Wall -pedantic -c d.cpp -o d.o 2>amp;1 | tee d.log
c.cpp: In function ‘int c()’:
c.cpp:1:18: warning: unused variable ‘vc’ [-Wunused-variable]
 int c(void) {int vc; return 0;}
                  ^~
a.cpp: In function ‘int a()’:
a.cpp:1:18: warning: unused variable ‘va’ [-Wunused-variable]
 int a(void) {int va; return 0;}
                  ^~
b.cpp: In function ‘int b()’:
b.cpp:1:18: warning: unused variable ‘vb’ [-Wunused-variable]
 int b(void) {int vb; return 0;}
                  ^~
g    b.o c.o a.o d.o -o top

Summary of warnings
###################

b.cpp: In function ‘int b()’:
b.cpp:1:18: warning: unused variable ‘vb’ [-Wunused-variable]
 int b(void) {int vb; return 0;}
                  ^~
c.cpp: In function ‘int c()’:
c.cpp:1:18: warning: unused variable ‘vc’ [-Wunused-variable]
 int c(void) {int vc; return 0;}
                  ^~
a.cpp: In function ‘int a()’:
a.cpp:1:18: warning: unused variable ‘va’ [-Wunused-variable]
 int a(void) {int va; return 0;}
                  ^~
  

Существует даже немного более элегантный способ, который заключается в (повторном) определении CXX стандартной переменной make и присвоении ей небольшого сценария оболочки, который выполняет эту работу, так что вы можете использовать его CXX как обычно:

 CXX = function mycxx { g   $$* 2>amp;1 | tee $(patsubst %.o,%.log,$@) ;}; mycxx

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@
  

При расширении с помощью make для foo.o целевого объекта рецепт становится:

 function mycxx { g   $* 2>amp;1 | tee foo.log ;}; mycxx -Wall -pedantic foo.cpp -o foo.o
  

И оболочка, наконец, выполнит:

 g   -Wall -pedantic foo.cpp -o foo.o 2>amp;1 | tee foo.log
  

Конечный результат должен быть таким же, как и в первом решении, но со значительно меньшим количеством модификаций вашего Makefile. Помимо (повторного) определения CXX , оно должно остаться прежним (при условии, что вы использовали CXX в своих рецептах, что рекомендуется).