【发布时间】:2016-07-01 21:14:43
【问题描述】:
我有另一个类似make 的工具,它在解析我的 makefile 后生成一个 XML 作为工件,然后我将使用 Python 进一步处理。
如果我可以让make 将每个先决条件都考虑为实际目标,那么它会为我简化很多事情,因为这样其他工具
将每个文件分类为“作业”。
这是我的 makefile 的一个片段:
.obj/eventlookupmodel.o: C:/Users/User1/Desktop/A/PROJ/src/AL2HMIBridge/LookupModels/eventlookupmodel.cpp C:\Users\User1\Desktop\A\PROJ\src\AL2HMIBridge\LookupModels\eventlookupmodel.h \
C:/Users/User1/Desktop/A/PROJ/qt5binaries/include/QtCore/qabstractitemmodel.h \
C:/Users/User1/Desktop/A/PROJ/qt5binaries/include/QtCore/qvariant.h \
...
我希望make 认为我对每个先决条件都有一个虚拟规则,如下所示:
C:/Users/User1/Desktop/A/PROJ/qt5binaries/include/QtCore/qvariant.h:
@echo target pre= $@
C:/Users/User1/Desktop/A/PROJ/qt5binaries/include/QtCore/qabstractitemmodel.h:
@echo target pre=$@
C:/Users/User1/Desktop/A/PROJ/src/AL2HMIBridge/LookupModels/eventlookupmodel.cpp :
@echo target pre=$@
C:\Users\User1\Desktop\A\PROJ\src\AL2HMIBridge\LookupModels\eventlookupmodel.h:
@echo target pre=$@
我不关心规则的确切形式,只是每个文件都被视为实际目标。
我传入此规则的方法是像这样设置 MAKEFILES 变量
make all MAKEFILES=Dummy.mk
Dummy.mk 包含此规则,这样我就不会修改 makefile。
到目前为止,我已经尝试了以下方法。
Dummy.mk:
%.h:
@echo header xyz = $@
%:
@echo other xyz= $@
这部分有效。
我运行make all --trace --print-data-base MAKEFILES=Dummy.mk 我可以看到
make 将%.h: 规则“绑定”到头文件。在--print-data-base section 中,我看到该规则被分配给头文件。
C:/Users/User1/Desktop/A/QNX_SDK/target/qnx6/usr/include/stddef.h:
# Implicit rule search has been done.
# Implicit/static pattern stem: 'C:/Users/User1/Desktop/A/QNX_SDK/target/qnx6/usr/include/stddef'
# Last modified 2016-05-27 12:39:16
# File has been updated.
# Successfully updated.
# recipe to execute (from '@$(QMAKE) top_builddir=C:/Users/User1/Desktop/A/HMI_FORGF/src/../lib/armle-v7/release/ top_srcdir=C:/Users/User1/Desktop/A/HMI_FORGF/ -Wall CONFIG+=release CONFIG+=qnx_build_release_with_symbols CONFIG+=rtc_build -o Makefile C:/Users/User1/Desktop/A/HMI_FORGF/src/HmiLogging/HmiLogging.pro
', line 2):
@echo header xyz = $@
但是,我没有看到正在执行“echo header xyz $@”规则。
关于%: 规则,它既不会针对.cpp 文件执行,也不会在--print-data-base 部分“绑定”到它们。
但是,它是为没有后缀的现有目标绑定和执行的,即
all: library binary
binary: | library
ifs: | library
如果我将其设为非终端 - 没有双冒号 - 那么该规则不适用于像 .cpp 这样的内置类型,除非我取消定义否定我预期的 %: 规则的内置规则。
如果我让它成为终端,"it does not apply unless its prerequisites actually exist"。但是.h 或.cpp 在技术上没有先决条件;我可以只创建一个虚拟文件并将其作为先决条件吗?
注意:这与gcc -M 生成无关。是的,-M 选项在头文件和源文件的特定情况下会有所帮助,但这个问题是针对在启动 make 时生成文件中已经存在的更通用的目标和先决条件。
【问题讨论】:
-
所以你实际上是在问如何使工作目录中的每个头文件成为......某个目标的先决条件。对吗?
-
@Beta 不是先决条件。我想让
make知道的每个文件都有一个空规则,即AnyFile:所以我在ImplTarget.mk中定义的规则。 -
@Beta 如果某些文件,如
.cpp已经有规则,则附加的“空规则”将无效。 -
@Beta 我正在尝试完成
gcc -E -M -Mp完成的工作,但特别是-MP标志完成的工作:除了发出一条规则,说明.cpp依赖于哪些标头,它还一次发出一行相同的标题作为空目标,即头文件后跟冒号。例如header1:、header2:。 -
@πάνταῥεῖ stackoverflow.com/questions/38211171/…