2008-11-24 8 views

Respuesta

42

http://make.paulandlesley.org/autodep.html tiene una buena solución.

Absolutamente. g ++ -MM generará una lista de dependencias compatibles con GMake. Utilizo algo como esto:

# Add .d to Make's recognized suffixes. 
SUFFIXES += .d 

#We don't need to clean up when we're making these targets 
NODEPS:=clean tags svn 
#Find all the C++ files in the src/ directory 
SOURCES:=$(shell find src/ -name "*.cpp") 
#These are the dependency files, which make will clean up after it creates them 
DEPFILES:=$(patsubst %.cpp,%.d,$(SOURCES)) 

#Don't create dependencies when we're cleaning, for instance 
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS)))) 
    #Chances are, these files don't exist. GMake will create them and 
    #clean up automatically afterwards 
    -include $(DEPFILES) 
endif 

#This is the rule for creating the dependency files 
src/%.d: src/%.cpp 
    $(CXX) $(CXXFLAGS) -MM -MT '$(patsubst src/%.cpp,obj/%.o,$<)' $< -MF [email protected] 

#This rule does the compilation 
obj/%.o: src/%.cpp src/%.d src/%.h 
    @$(MKDIR) $(dir [email protected]) 
$(CXX) $(CXXFLAGS) -o [email protected] -c $< 

Lo que esto hará que se genere automáticamente las dependencias para cada archivo que ha cambiado, y compilarlos acuerdo con cualquier regla que usted tiene en su lugar. Esto me permite simplemente volcar nuevos archivos en el directorio src/y hacer que se compilen automáticamente en dependencias y todo.

+1

no caen en esta trampa si usted tiene más de 100 archivos, porque es demasiado lento la primera vez. En este caso, debe usar algo que se invoque una vez, no una vez para cada archivo. Makedepend podría tener esta opción. En el trabajo, usamos un script personalizado de Perl. –

+0

Gracias, lo tendré en cuenta. Mi proyecto actual tiene aproximadamente una docena de archivos, por lo que no tiene grandes gastos generales. Además, la compilación inicial lleva más de 20 minutos, así que siempre corro eso, voy a tomar un café y ejecuto compilaciones incrementales después de eso. –

+1

Gracias, esto realmente me ayudó. Puede escribir '$ (patsubst src /%, obj /%, $ (patsubst% .cpp,%. O, $ <))' un poco más simple como '$ (patsubst src /% .cpp, obj /%. O , $ <) '. Además, ¿no tendría más sentido utilizar la opción '-MF $ @' en lugar de redirigir la salida con '> $ @'? La página de manual de g ++ le advierte que podría haber alguna salida de depuración no deseada en stdout, pero no la obtiene con '-MF $ @'. – Maarten

6

El preprocesador cpp de GNU C tiene una opción, -MM, que produce un conjunto adecuado de dependencias basado en patrones de inclusión.

0

El compilador Mars C/C++ Digital viene con una herramienta makedep.

+0

¿Para qué plataformas está disponible? –

17

Ahora que he leído this portion in particular Creo que hay una solución mucho más fácil, siempre y cuando tenga una versión razonablemente actualizada de gcc/g ++. Si acaba de añadir a su -MMDCFLAGS, definir una variable que representa OBJS todos sus archivos de objetos, y luego hacer:

-include $(OBJS:%.o=%.d) 

entonces que usted debe conseguir tanto un sistema automático de dependencia de construcción eficiente y sencilla.

4

acabo de añadir esto a la makefile y funciona muy bien:

-include Makefile.deps 

Makefile.deps: 
    $(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps 
+0

Sé que esta respuesta es antigua, pero que debería ser '* .c', no' *. [Ch] '- no es necesario arrastrar cada' * .h' al compilador, ya que todos deberían estar incluidos por algunos '.c' archivo (s) si se utilizan en absoluto [y si no lo son, las dependencias no importan]. –

+0

¿Tiene esto algún beneficio sobre las dependencias por fuente?Parece que duplicaría el número de pasadas de preprocesador sobre todos los archivos, sin ningún beneficio real. –

+0

¿Hay alguna manera de reutilizar la salida para generar una receta Makefile o algo similar? – PoVa

Cuestiones relacionadas