Situação
Eu tenho um Makefile que depende de algumas coisas de um subprojeto que possui seu próprio Makefile. No subprojeto, os alvos têm dependências que eu esperava que meu projeto principal não conhecesse. Então, estou tentando usar o Makefile do subprojeto para construir tudo o que preciso quando necessário. Isto é o que tenho no meu projeto de amostra antes de construir:
$ find . -type f | xargs head
==> ./subproject/Makefile <==
binary: source.txt
echo subproject source: > $@
date >> $@
cat $< >> $@
clean:
rm binary
==> ./subproject/source.txt <==
this is the subproject source code
==> ./Makefile <==
binary: source.txt subproject/binary
echo main source: > $@
date >> $@
cat $^ >> $@
subproject/%:
$(MAKE) -C $(@D) $(@F)
clean:
rm binary
$(MAKE) -C subproject clean
==> ./source.txt <==
this is the main source code
e é isso que tenho depois de construir:
$ make
make -C subproject binary
make[1]: Entering directory '~/make-example/subproject'
echo subproject source: > binary
date >> binary
cat source.txt >> binary
make[1]: Leaving directory '~/make-example/subproject'
echo main source: > binary
date >> binary
cat source.txt subproject/binary >> binary
$ find . -type f | xargs head
==> ./subproject/Makefile <==
binary: source.txt
echo subproject source: > $@
date >> $@
cat $< >> $@
clean:
rm binary
==> ./subproject/binary <==
subproject source:
Di 10. Okt 14:01:03 CEST 2023
this is the subproject source code
==> ./subproject/source.txt <==
this is the subproject source code
==> ./Makefile <==
binary: source.txt subproject/binary
echo main source: > $@
date >> $@
cat $^ >> $@
subproject/%:
$(MAKE) -C $(@D) $(@F)
clean:
rm binary
$(MAKE) -C subproject clean
==> ./binary <==
main source:
Di 10. Okt 14:01:03 CEST 2023
this is the main source code
subproject source:
Di 10. Okt 14:01:03 CEST 2023
this is the subproject source code
==> ./source.txt <==
this is the main source code
alex@elephant:~/make-example$
Problema
Quando eu mudo subproject/source.txt
e executo make
no projeto pai, ele ainda não é recompilado.
Quase posso consertar isso assim:
subproject/%: always
$(MAKE) -C $(@D) $(@F)
always:
quando make for executado no subprojeto, subproject/binary
não será recompilado. No entanto, binary
no projeto pai ainda será recompilado porque um de seus pré-requisitos foi executado, mesmo que a data no arquivo de pré-requisitos seja antiga.
Pergunta
Então acho que a resposta é provavelmente que não é assim que devo fazer. Eu realmente queria que o projeto pai e o subprojeto soubessem o mínimo possível um sobre o outro.
Existe alguma maneira de fazer o projeto pai verificar a data subproject/binary
e usá-la para determinar se deve ser reconstruído binary
mesmo que a subproject/binary
fórmula tenha sido executada?
Eu gostaria de poder digitá-lo make
e construí-lo, e então alterar subproject/source.txt
e digitar make
novamente no projeto principal, e recompilar subproject/binary
e recompilar binary
como resultado, e logo depois, não alterar nada, e digitar make
novamente, não recompilar nada