Por que o Make continua criando o diretório várias vezes?

0

Eu tenho um makefile que cria alguns documentos da minha fonte:

/home/share/htdocs:
   #installs apache and make sure we have /htdocs...

/home/share/htdocs/doxjs: /home/share/htdocs
   mkdir -p $@
   chgrp users $@
   chmod g+w $@

/home/share/htdocs/dox: /home/share/htdocs
   mkdir -p $@
   chgrp users $@
   chmod g+w $@

.PHONY: dox
dox: /home/share/htdocs/dox /home/share/htdocs/doxjs
    # runs doxygen
    cp -r dox/html/* /home/share/htdocs/dox/
    cp -r doxjs/html/* /home/share/htdocs/doxjs/

Essas regras devem apenas criar e definir permissão para veicular os arquivos de htdocs, criar documentos e movê-los.

mas quando eu corro. irá sempre tentar criar /home/share/htdocs/dox

alguma idéia por quê?

mesmo se eu usar:

.PHONY: setup
setup: /home/share/htdocs/dox /home/share/htdocs/doxjs

isto é o que eu recebo:

$ sudo rm -fr /home/share/htdocs/dox*
$ sudo make setup
mkdir -p /home/share/htdocs/dox
chgrp users /home/share/htdocs/dox
chmod g+w /home/share/htdocs/dox
mkdir -p /home/share/htdocs/doxjs
chgrp users /home/share/htdocs/doxjs
chmod g+w /home/share/htdocs/doxjs

$ sudo make setup
mkdir -p /home/share/htdocs/dox
chgrp users /home/share/htdocs/dox
chmod g+w /home/share/htdocs/dox

$ sudo make setup
mkdir -p /home/share/htdocs/dox
chgrp users /home/share/htdocs/dox
chmod g+w /home/share/htdocs/dox

por quê? Estou assumindo que não vejo algum conflito com os tempos modificados. Mas eu não consigo imaginar o que.

    
por gcb 14.02.2017 / 01:10

2 respostas

1

Você já tentou executar make -d ? De acordo com a página do manual, isso fornece:

Debugging information in addition to normal processing. The debugging information says which files are being considered for remaking, which file-times are being compared and with what results, which files actually need to be remade, which implicit rules are considered and which are applied---everything interesting about how make decides what to do.

    
por 14.02.2017 / 14:12
1

Eu escaneei sua estrutura e usei make -r -d setup , onde -d mostra a saída de depuração e -r ignora as regras incorporadas, portanto, há menos resultados. A parte relevante é

Considering target file 'setup'.
 File 'setup' does not exist.
  Considering target file 'htdocs/dox'.
    Considering target file 'htdocs'.
     Finished prerequisites of target file 'htdocs'.
   No need to remake target 'htdocs'.
   Finished prerequisites of target file 'htdocs/dox'.
   Prerequisite 'htdocs' is newer than target 'htdocs/dox'.
 Must remake target 'htdocs/dox'.

Então, depois de descer para htdocs , esse diretório recebe um tempo de acesso mais recente que htdocs/dox e, portanto, make conclui que ele precisa ser refeito.

Solução: não use um diretório pai como pré-requisito.

Na verdade, toda a configuração para criar diretórios e executar o make dentro deles é um pouco duvidosa; seja o que for que você queira alcançar, você deve conseguir isso com uma estrutura de diretórios estática.

    
por 14.02.2017 / 15:02