2008-10-30 34 views
13

Tengo una plantilla de archivo MAKE para compilar una única DLL (para un sistema de complemento). El makefile del usuario se ve así:Cómo comprobar si un archivo existe en un archivo MAKE

EXTRA_SRCS=file1 file2 
include makefile.in 

En el makefile.in tengo:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS)) 

Dónde plugin.os es el archivo principal de C++ para ser compilado. Por cierto, los archivos que terminan es .os son los archivos objeto compilados para la biblioteca compartida (es decir, usando la opción -fpic con gcc)

Ahora, el problema es que las fuentes adicionales probablemente (pero no necesariamente) ser archivos de cabecera. Idealmente, me gustaría agregarlos como dependencias para el destino plugin.os y el file.cpp, pero solo si existen.

El método debería funcionar para Windows y Linux, o al menos ser adaptable a cada uno. Sin embargo, solo uso la versión GNU de make.

Respuesta

18

utilizar la función de "comodín":

$(wildcard *.h) 

EDIT: con el fin de que coincida con una lista específica, hacer

$(wildcard $(HEADER_FILES)) 

No hay necesidad de utilizar $ (filtro ...), la función comodín filtra automáticamente los archivos que no existen.

+0

eso no es lo que quiero ... Tengo una lista específica de archivos .h para probar ... – PierreBdR

+0

Está bien, no necesita usar comodines. Usa $ (comodín $ (HEADER_FILES)) – JesperE

4

No especificó qué compilador (s) está utilizando, pero si tiene acceso a gcc/g ++ puede usar la opción -MM.

Lo que hago es crear un archivo con la extensión de .d para cada archivo .c o .cpp, y luego "incluir" los archivos .d. Utilizo algo como esto en mi Makefile:

%.d: %.c 
     gcc $(INCS) $(CFLAGS) -MM $< -MF [email protected] 

%.d: %.cpp 
     g++ $(INCS) $(CXXFLAGS) -MM $< -MF [email protected] 

Luego de crear las dependencias de esta manera:

C_DEPS=$(C_SRCS:.c=.d) 
CPP_DEPS=$(CPP_SRCS:.cpp=.d) 
DEPS=$(C_DEPS) $(CPP_DEPS) 

y esto en la parte inferior de la Makefile:

include $(DEPS) 

es éste el tipo de comportamiento que está buscando? La belleza de este método es que incluso si está utilizando un compilador que no es GNU para la compilación real, los compiladores de GNU hacen un buen trabajo al calcular las dependencias.

+0

Prefiero evitar makeflie generación ... pero gracias! – PierreBdR

2

¿La sencilla

$(filter $(wildcard *.h),$(HEADER_FILES)) 

hacer lo que quiera?

+0

mmhh .. ¡No sabía sobre este comando de filtro! que hace? – PierreBdR

+0

Lea la documentación de Make (páginas de información, no de página de manual): $ (PATRONES DE FILTRO, TEXTO) son las palabras en TEXTO que coinciden con al menos uno de PATRONES. (PATTERN se hace patrones de archivo, no expresiones regulares, por lo que un nombre de archivo debe coincidir exactamente). – ephemient

Cuestiones relacionadas