Make создает пустую зависимость при использовании правил, сгенерированных из g cc -MM - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь создать make-файл, который компилирует все файлы cpp в каталоге sr c всякий раз, когда они изменяются, или всякий раз, когда изменяется заголовок, который они включают. Моя проблема заключается в том, что когда файл содержит достаточно файлов, куда g cc переносит правило на новую строку, в соответствии с документацией по использованию опций -M , make рассматривает разрыв строки как другой пробел и правило пытается создать пустую зависимость.

Например, запуск make-файла с файлом в каталоге sr c с именем source.cpp, содержащим:

#include "header1.hpp"
#include "header2.hpp"
#include "header3.hpp"
#include "header4.hpp"
#include "header5.hpp"

, выведет что-то вместе строчки:

Missing file header1.hpp
Missing file header2.hpp
Missing file header3.hpp
Missing file
Missing file header4.hpp
Missing file header5.hpp
Compiling src/source.cpp...

Это мой make-файл прямо сейчас:

SRCDIR = src
OBJDIR = obj

SRCFLS = $(shell find $(SRCDIR) -name *.cpp)
OBJFLS = $(call getobj,$(SRCFLS))

CXXFLAGS = -c -I .

define \n


endef

define \t

endef

define getobj
$(subst $(SRCDIR)/,$(OBJDIR)/,$(subst .cpp,.o,$(1)))
endef

define getrule
$(shell $(CXX) -MM -MG -MT $(call getobj,$(1)) $(1))
endef

default : $(OBJFLS);

% :
    @echo Missing file $@

$(eval $(foreach FLE,$(SRCFLS),\
\
$(call getrule,$(FLE))$(\n)$(\t)\
    @echo Compiling $$<...$(\n)$(\t)\
    @mkdir $$(@D) -p$(\n)$(\t)\
    @-$(CXX) $(CXXFLAGS) $$< -o $$@$(\n)\
\
))

Извините, если вопрос сбивает с толку, я готов прояснить любые необходимые детали.

...