Pregunta

Estoy obligado a escribir documentación para mi proyecto actual que enumera todos los archivos .c y para cada uno enumera cada archivo .h que está incluido directa o indirectamente en ese archivo.

Este es un proyecto grande, y aunque tenemos Makefiles que teóricamente tienen esta información, esos Makefiles a veces son incorrectos (heredamos este proyecto de otra compañía). A menudo hemos tenido que hacer un make clean ; make para que nuestros cambios se reflejen realmente en la recopilación, por lo que no quiero confiar en estos Makefiles.

Entonces, ¿hay una herramienta que nos permita darle el nombre de un archivo .c y una ruta de inclusión y que nos diga todos los archivos .h que están incluidos directa o indirectamente en el archivo .c? No tenemos nada raro como

#define my_include "some_file.h"
#include my_include

por lo que la herramienta no necesita ser perfecta. Cualquier cosa que buscara archivos .c y .h en una ruta de inclusión para las inclusiones regulares sería lo suficientemente bueno.

¿Fue útil?

Solución

Lo que hago en mi Makefile es

SRCS=$(wildcard *.c)

depend: $(SRCS)
    gcc -M $(CFLAGS) $(SRCS) >depend

include depend

Esto significa que si alguno de los archivos fuente se actualiza, la regla depend se ejecutará y usará gcc -M para actualizar el archivo llamado depend. Esto se incluye en el archivo MAKE para proporcionar las reglas de dependencia para todos los archivos de origen.

Make verificará que un archivo esté actualizado antes de incluirlo, por lo que esta regla dependiente se ejecutará si es necesario cada vez que ejecute make sin que necesite hacer un " make depend ".

Esto se ejecutará cada vez que un archivo haya cambiado. Nunca he encontrado que esto sea un problema, pero si tuviera una gran cantidad de archivos en el directorio, podría encontrar que tomó demasiado tiempo, en cuyo caso podría intentar tener un archivo de dependencia por archivo fuente, como este:

SRCS=$(wildcard *.c)
DEPS=$(SRCS:.c=.dep)

%.dep : %.c
    gcc -M $(CFLAGS) $< >$@

include $(DEPS)

Tenga en cuenta que puede usar -MM en lugar de -M para no incluir encabezados del sistema.

Otros consejos

" gcc -M archivo.c " hace lo que necesitas.

Una alternativa a gcc -M es fastdep . El autor de Fastdep informa que fastdep es diez veces más rápido que gcc's -M. Si el proyecto demora un tiempo en construirse, puede valer la pena echar un vistazo rápido.

Usar SCons

$ scons --tree=all
scons: Reading SConscript files ...

scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
+-.
  +-SConstruct
  +-app
  | +-test.o
  | | +-test.c
  | | +-/include/PCI_1149_1.h
  | | +-/include/Pci.h
  | | +-/usr/bin/gcc
  | +-/usr/bin/gcc
  | +-/lib/libpci1149_64.a
  ...

En MSVC (al menos 2005 y 2008, posiblemente también otras versiones, pero no VC6), puede obtener el compilador para que le diga todos los archivos que se incluyeron durante la compilación. El resultado es bastante detallado, pero completo y bastante fácil de analizar con ojos humanos.

En Configuración del proyecto, vaya a la pestaña C / C ++ > Avanzado y active " Mostrar incluye, " luego reconstruya su proyecto desde cero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top