Eu preciso gerar um diretório no meu makefile e gostaria de não receber o erro "diretório já existe" repetidamente, embora possa facilmente ignorá-lo.
Eu uso principalmente mingw / msys, mas gostaria de algo que funcionasse em outros shells / sistemas também.
Já tentei mas não deu certo, alguma ideia?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
-p
não funciona no Windows, que é provavelmente o motivo da pergunta. Não tenho certeza de como isso foi aceito.make -p
Unix ou Linux?Olhando a documentação oficial do make , aqui está uma boa maneira de fazer isso:
Você deve ver aqui o uso do | operador de tubulação, definindo um pré-requisito de pedido apenas. O que significa que o
$(OBJDIR)
alvo deve ser existente (em vez de mais recente ) para construir o alvo atual.Observe que eu usei
mkdir -p
. O-p
sinalizador foi adicionado em comparação com o exemplo dos documentos. Veja outras respostas para outra alternativa.fonte
$(OBJDIR)
alvo deve existir " . Faça verificações de presença de arquivo (e carimbos de data / hora) para decidir se é necessário construir o destino. Portanto, aqui, se$(OBJDIR)
estiver ausente, ele o construirá, de modo que exista para construir o alvo atual$(OBJS)
, que será criado dentro.Você pode usar o comando de teste:
fonte
make -j
) devido a uma condição de corrida entre o momento em que o diretório é testado para existência e criado. Um trabalho pode testar se ele não está lá, mas antes de criá-lo, outro trabalho cria o diretório. Então, quando o primeiro tentar fazer isso, ele irá falhar porque o diretório já existe. A melhor solução neste caso é usar os pré-requisitos de pedido somente conforme mencionado na resposta de @TeKa (que deve ser a resposta aceita).Aqui está um truque que uso com o GNU make para criar diretórios de saída do compilador. Primeiro defina esta regra:
Em seguida, torne todos os arquivos que vão para o diretório dependentes do arquivo .d nesse diretório:
Observe o uso de $ <em vez de $ ^.
Por fim, evite que os arquivos .d sejam removidos automaticamente:
Ignorar o arquivo .d e, dependendo diretamente do diretório, não funcionará, pois a hora de modificação do diretório é atualizada toda vez que um arquivo é gravado naquele diretório, o que forçaria a reconstrução a cada invocação de make.
fonte
Se o diretório já existente não for um problema para você, basta redirecionar stderr para esse comando, eliminando a mensagem de erro:
fonte
Dentro do seu makefile:
fonte
No Windows
No Unix | Linux
fonte
/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
fonte
Que também funciona para vários diretórios, por exemplo.
Adicionar
$(OBJDIR)
como primeiro alvo funciona bem.fonte
Funciona em mingw32 / msys / cygwin / linux
fonte
Se você ignorar explicitamente o código de retorno e descartar o fluxo de erro, o make irá ignorar o erro se ele ocorrer:
Isso não deve causar um risco de corrida em uma marca paralela - mas não testei para ter certeza.
fonte
Um pouco mais simples do que a resposta de Lars:
e regra genérica:
Nenhum arquivo de toque para limpar ou fazer .PRECIOUS :-)
Se você quiser ver outro pequeno truque genérico do gmake, ou se estiver interessado no make não recursivo com o mínimo de estrutura, verifique mais dois truques gmake baratos e as outras postagens relacionadas ao make naquele blog.
fonte