GNU make - transforme todos os pré-requisitos em destino (implicitamente)
eu tenho outromake
ferramenta que produz um XML como um artefato depois de analisar meu makefile, que depois processarei mais com o Python.
Isso simplificaria as coisas para mim - muito - se eu pudessemake
considere cada pré-requisito único como um destino real, porque essa outra ferramenta classificará cada arquivo como um "trabalho".
Este é um fragmento do meu 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 \
...
Eu gostaria demake
acho que tenho uma regra fictícia para cada pré-requisito, como abaixo:
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=$@
Não me importo com a forma exata da regra, apenas que cada arquivo é considerado um destino real.
Meu método de passar nesta regra seria definindo a variável MAKEFILES da seguinte maneira
make all MAKEFILES=Dummy.mk
comDummy.mk
contendo esta regra para que eu não modifique os makefiles.
Eu tentei o seguinte até agora.
Dummy.mk:
%.h:
@echo header xyz = $@
%:
@echo other xyz= $@
Isso parcialmente funciona.
eu corromake all --trace --print-data-base MAKEFILES=Dummy.mk
e eu posso ver issomake
"liga" o%.h:
regra para os arquivos de cabeçalho. No--print-data-base section
, Vejo essa regra sendo atribuída aos arquivos de cabeçalho.
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 = $@
No entanto, NÃO vejo a regra "echo header xyz $ @" sendo executada.
Sobre a%:
regra, não é executado para o.cpp
arquivos nem "vinculados" a eles no--print-data-base
seção. No entanto, ele é vinculado e executado para destinos existentes que não possuem sufixo, ou seja,
all: library binary
binary: | library
ifs: | library
Para o%:
regra, a razão para esse comportamento é devido a10.5.5 Regras de padrões de correspondência: Se você não marcar a regra de correspondência como terminal, ela não será terminal. Uma regra de correspondência não terminal não pode ser aplicada a um nome de arquivo que indica um tipo específico de dados. Um nome de arquivo indica um tipo específico de dados se algum destino implícito de regra que não corresponda a nada corresponder a ele.
Se eu torná-lo não terminal - sem dois pontos duplos -, a regra não se aplica a tipos internos, como.cpp
a menos que eu cancele a definição das regras internas que negam minha intenção%:
regra.
Se eu torná-lo terminal,"não se aplica a menos que seus pré-requisitos realmente existam". Mas um.h
ou.cpp
tecnicamente não possui pré-requisitos; posso apenas criar um arquivo fictício e ter isso como pré-requisito?
NOTA: Isso não tem nada a ver comgcc -M
geração. sim o-M
opção ajudaria no caso específico dos arquivos de cabeçalho e de origem, mas esta pergunta é para destinos e pré-requisitos mais genéricos que já existem no makefile quandomake
é lançado.