Quando tenho uma tarefa de criação em que um destino específico precisa ser criado antes de outro, enquanto no modo paralelo, isso é simples ao usar o SunPro Make (dmake). O seguinte makefile:
install: dir dir/file
dir:
mkdir dir
dir/file:
cp source dir/file
pode ser tornado paralelo, tornando seguro, alterando a primeira linha para:
install: dir .WAIT dir/file
ou usando:
.NO_PARALLEL: install
O restante do makefile ainda será tratado no modo paralelo e até mesmo uma lista de destinos à esquerda ou à direita .WAIT
será tratada no modo paralelo.
Veja: http://schilytools.sourceforge.net/man/man1/make.1s.html e http://schilytools.sourceforge.net/man/man1/dmake.1.html
mas o GNU make não parece ter uma opção semelhante. Não há realmente nenhuma maneira de fazer isso com o GNU make?
Para ser mais específico, a solução precisa ser escrita de forma a permitir que o makefile seja processado com outras implementações make.
O alvo especial .WAIT pode, por exemplo, estar em uma macro dependente de programa chamada, por exemplo, $(WAIT)
Observe que há uma solução aparente que não ajuda:
Em teoria, pode-se criar dir
uma dependência de dir/file
para impor a criação dir
antes de tentar copiar para, dir/file,
mas se você copiar outro arquivo posteriormente, dir,
isso o tornará dir
mais novo que dir/file
. Como resultado, chamar make
mais de uma vez copiaria para dir/file
repetidamente, sem o resultado esperado de make
fazer a cópia apenas no caso de a fonte se tornar mais recente quedir/file.
Isso levanta a questão alternativa de saber se pode haver uma topologia de dependências que obriga make
a criar dir
antes de copiar dir/file
sem fazer dir
uma dependência dedir/file.
No GNU make, você pode usar pré-requisitos somente de pedido para garantir que
dir
seja criado antes que a regra a ser criadadir/file
seja executada.Veja esta página para mais detalhes.
Você pode ver no exemplo no manual do GNU make que ele é realmente adaptado para adicionar dependência em um diretório que está sendo criado antes de criar arquivos nele.
No caso do seu exemplo específico, algo assim deve funcionar:
Embora você não precise modificar a regra existente, basta adicionar essa dependência em outro lugar no seu Makefile...
Eu não acho que isso funcionaria em outras implementações de make ... Uma solução possível é criar um
GNUmakefile
que sejainclude
o realMakefile
e também adicionar extensões específicas de make GNU.Você provavelmente também poderia fazer o GNU ignorar uma regra, como
.WAIT
definindo-a como uma regra fictícia em seu arquivoGNUmakefile
.Espero que essas dicas sejam úteis!
Você precisa adicionar dependências para que os diretórios sejam criados antes dos arquivos sob eles.
É possível usar um arquivo "marcador" para a dependência do diretório, dessa forma, criar um arquivo sob ele não afetará o carimbo de data / hora do diretório. Isso também não requer nenhum recurso específico do GNU.
No seu exemplo:
Você pode usar algo como
.directory
ou.dir
ou.folder
para o arquivo marcador...Aqui está a minha própria resposta derivada da ideia apresentada por Filipe Brandenburger e de métodos genéricos usados no sistema Schily Makefile:
O sistema makefile garante que o seguinte
make macros
seja configurado desta maneira:Agora o makefile que faz uso das definições de macro acima:
$(NORULE)
expande para nada com gmake esunpro
com SunPro Make.No caso do gmake, todo o makefile se expande para:
No caso do SunPro Make, todo o makefile se expande para:
A última linha é vista como uma regra de lixo sem relevância.