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.

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top