Я пытаюсь создать 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)\
\
))
Извините, если вопрос сбивает с толку, я готов прояснить любые необходимые детали.