Como verificar se existe um arquivo em um makefile
-
05-07-2019 - |
Pergunta
Eu tenho um modelo makefile para compilar uma única DLL (para um sistema de plug -in). O makefile do usuário se parece com o seguinte:
EXTRA_SRCS=file1 file2
include makefile.in
No makefile.in
Eu tenho:
plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
Onde plugin.os
é o principal arquivo C ++ a ser compilado. Btw, os arquivos terminando são .os
são os arquivos de objeto compilados para biblioteca compartilhada (ou seja, usando o -fpic
opção com gcc
)
Agora, o problema é que as fontes extras provavelmente (mas não necessariamente) serão arquivos de cabeçalho. Idealmente, gostaria de adicioná -los como dependências para o alvo plugin.os
e a file.cpp
, mas apenas se eles existirem.
O método deve funcionar para Windows e Linux, ou pelo menos ser adaptável a cada um. No entanto, eu só uso a versão GNU do Make.
Solução
Use a função "curinga":
$(wildcard *.h)
Editar: para corresponder a uma lista específica, faça
$(wildcard $(HEADER_FILES))
Não há necessidade de usar $ (filtro ...), a função curinga filtra automaticamente os arquivos que não existem.
Outras dicas
Você não especificou quais compiladores você está usando, mas se você tiver acesso ao GCC/G ++, poderá usar a opção -mm.
O que faço é criar um arquivo com a extensão de .d para todos os arquivos .c ou .cpp e, em seguida, "inclua" os arquivos .d. Eu uso algo assim no meu makefile:
%.d: %.c
gcc $(INCS) $(CFLAGS) -MM $< -MF $@
%.d: %.cpp
g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@
Eu então crio as dependências como esta:
C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)
E isso na parte inferior do Makefile:
include $(DEPS)
Esse é o tipo de comportamento que você está buscando? A beleza desse método é que, mesmo se você estiver usando um compilador não-GNU para compilação real, os compiladores GNU fazem um bom trabalho ao calcular as dependências.
Faz o simples
$(filter $(wildcard *.h),$(HEADER_FILES))
faça o que você quiser?