makefile - 使用从 gcc -MM 生成的规则时,Make 会创建空依赖项
问题描述
我正在尝试创建一个生成文件,该文件在 src 目录中的所有 cpp 文件发生更改时或它们包含的标头更改时编译它们。我的问题是,当文件包含足够的文件时,gcc 将规则包装到新行,根据使用 -M 选项的文档,make 将换行符视为另一个空格,并且规则尝试创建一个空依赖项。
例如,使用 src 目录中的一个文件运行 makefile,该文件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...
这是我现在的makefile:
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)\
\
))
抱歉,如果问题令人困惑,我愿意澄清所需的任何细节。
解决方案
推荐阅读
- java - 如何将值从我的 REST 端点传递到我的 PostgreSQL time_bucket_gapfill() 函数
- x86 - 为什么 clflush 在 x86 中是非特权指令?
- java - RecyclerView 不显示来自数据库的数据
- sqlite - Sqlite FTS5 与 Electron 应用程序中的任何内容都不匹配
- react-native - 原生基本选项卡添加了 OnPress 事件?
- angular - 如何使用正则表达式作为对象的映射键
- html - 离子选择选项根据条件数据改变颜色
- python - 如何在 Docker 容器 debian:stable 中安装 python3.7-minimal?
- html - 将 css 添加到 asp.net 核心 mvc 文件
- php - Laravel Eloquent - 关系方法返回 HasMany 对象,属性返回 Collection