Tengo un proyecto que tiene un archivo MAKE con dependencias rotas. ¿Existe alguna forma más conocida de generar una lista de dependencias para el proyecto que pueda usar en el archivo MAKE, aparte de examinar cada archivo fuente a mano o con un script PERL escrito a mano?generar dependencias para un archivo MAKE para un proyecto en C/C++
Respuesta
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.
El preprocesador cpp de GNU C tiene una opción, -MM, que produce un conjunto adecuado de dependencias basado en patrones de inclusión.
El compilador Mars C/C++ Digital viene con una herramienta makedep.
¿Para qué plataformas está disponible? –
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 -MMD
CFLAGS
, 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.
acabo de añadir esto a la makefile y funciona muy bien:
-include Makefile.deps
Makefile.deps:
$(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps
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]. –
¿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. –
¿Hay alguna manera de reutilizar la salida para generar una receta Makefile o algo similar? – PoVa
- 1. Generar todas las dependencias del proyecto en un solo archivo usando gcc -MM flag
- 2. Dependencias de lista automática para un proyecto
- 3. ¿Cómo generar dependencias de compilación desde CMake o make?
- 4. ¿Cómo generar un Makefile con fuente en subdirectorios utilizando un solo archivo MAKE
- 5. Cómo documentar un archivo MAKE?
- 6. Herramienta para eliminar dependencias innecesarias en un proyecto Java
- 7. Cómo comprobar si un archivo existe en un archivo MAKE
- 8. Cómo generar Javadoc para Maven Dependencias
- 9. Usando g ++ con -MMD en makefile para generar automáticamente dependencias
- 10. cómo usar un archivo make para mingw en win32
- 11. ¿Alguna buena herramienta de construcción para un proyecto de C++, que puede reemplazar a make?
- 12. ¿Necesito generar un segundo archivo para ordenar un archivo?
- 13. ¿Cómo generar build.xml para un nuevo proyecto de Java?
- 14. Usando System.IO.Packaging para generar un archivo ZIP
- 15. ¿Cómo generar javadoc con ant, para un proyecto existente?
- 16. Creando dos ejecutables separados de un archivo MAKE (g ++)
- 17. ¿Obtener MSBuild para generar un archivo en el registro?
- 18. Generar archivo cabal con dependencias en libs extranjeras
- 19. Analizar dependencias JAR en un proyecto Java
- 20. Generando archivo de compilación Ant para un proyecto en eclipse
- 21. herramienta para generar un archivo xml desde xsd (para probar)
- 22. Generar un Javadoc para mi proyecto de Android
- 23. ¿Qué significa "todo" en un archivo MAKE?
- 24. ¿Cómo generar estadísticas para un proyecto de GitHub?
- 25. ¿Cómo generar un gráfico de dependencia por clase solo para un proyecto?
- 26. ¿Hay alguna manera de generar métricas para un proyecto github?
- 27. ¿Cómo ejecutar un archivo MAKE en Windows?
- 28. ¿Cómo configurar un archivo MAKE en Eclipse (C++)?
- 29. ¿Cómo puedo escribir un archivo MAKE para autodetectar y paralelizar la compilación con GNU Make?
- 30. Múltiples rutas de salida para un archivo de proyecto C#
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. –
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. –
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