AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77265659
Accepted
Alex028502
Alex028502
Asked: 2023-10-10 20:10:39 +0800 CST2023-10-10 20:10:39 +0800 CST 2023-10-10 20:10:39 +0800 CST

reconstrua apenas quando necessário, mesmo que dependamos de um subprojeto com seu próprio Makefile

  • 772

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.txte executo makeno 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/binarynão será recompilado. No entanto, binaryno 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/binarye usá-la para determinar se deve ser reconstruído binarymesmo que a subproject/binaryfórmula tenha sido executada?

Eu gostaria de poder digitá-lo makee construí-lo, e então alterar subproject/source.txte digitar makenovamente no projeto principal, e recompilar subproject/binarye recompilar binarycomo resultado, e logo depois, não alterar nada, e digitar makenovamente, não recompilar nada

makefile
  • 1 1 respostas
  • 15 Views

1 respostas

  • Voted
  1. Best Answer
    MadScientist
    2023-10-10T21:43:38+08:002023-10-10T21:43:38+08:00

    Você escreve:

    No entanto, o binário 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.

    Não é assim que make funciona. Só porque uma receita é invocada não significa que make sempre assume que o destino foi modificado; make examinará o horário de modificação do pré-requisito e o comparará, mesmo que a receita do pré-requisito tenha sido invocada.

    Então, se você está vendo binarysempre reconstruído, então algo mais está acontecendo aqui: talvez o sub-make seja escrito de tal forma que sempre modifique o binário. Você pode querer usar make --traceou make -dentender por que make decide reconstruir binary.

    Exemplo:

    UPDATE = touch $@
    binary: prereq; touch $@
    prereq: FORCE ; : updating; $(UPDATE)
    FORCE:
    

    Agora:

    $ make
    : updating; touch prereq
    touch binary
    
    $ make
    : updating; touch prereq
    touch binary
    

    como esperado, mas agora, se não alterarmos o pré-requisito:

    $ make UPDATE=
    : updating;
    

    Podemos ver que a regra de atualização de pré-requisito foi executada, mas como na verdade não foi alterada prereq, o make não foi reconstruído binary.

    • 2

relate perguntas

  • Makefile para compactar todos os arquivos em um diretório

  • O que é $(OS) em uma condicional Makefile?

  • Por que `make install` está sempre sendo chamado?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve