utilizar makeopts make instalar fichero existe ejecutar directorio create como comando archivos makefile gnu-make

makefile - makeopts - GNU Make. ¿Por qué esta sintaxis compleja para generar dependencias?



makefile 112 makeopts no existe el fichero o el directorio (3)

Una solución aún más simple es deshacerse por completo de la llamada sed, ya que gcc puede hacer todo lo que necesita directamente:

%.d: %.c $(CC) -M $(CPPFLAGS) -MF $@ $< -MT "$*.o $@"

Estoy leyendo Gestión de proyectos con GNU Make, y encontré este ejemplo en el Capítulo 2.7 - Generación automática de dependencias. El autor dice su del manual de GNU:

%.d: %c $(CC) -M $(CPPFLAGS $< > $@.$$$$; / sed s'',/($*/)/.o[ :]*,/1.o $@ : ,g'' < $@.$$$$ > $@; / rm -f $@.$$$$

Sin embargo, pude hacer lo mismo con esto (nótese el sed ):

-include $(subst .c,.d,$(SOURCES)) %.d: %.c @$(CC) -M $(CPPFLAGS) $< | sed ''s|:| $*.d : |'' > $@;

Todas estas líneas lo hacen es generar las dependencias, luego agregar el nombre *.d . Tuvieron que cambiar la primera línea de:

foo.o: bar.h foo.h fubar.h

a foo.o foo.d: bar.h foo.h fubar.h

El mío es más simple y parece funcionar bastante bien, pero supongo que la gente de GNU tenía una razón para su comando sed . También:

  • ¿Por qué una redirección del archivo en sed ? ¿Por qué no simplemente tomarlo como un parámetro de línea común?
  • ¿Por qué no omitir el archivo intermediario por completo?

Sé que los chicos de GNU podrían haber pensado en esto también, pero por alguna razón, fueron con la configuración más compleja. Solo quiero entender su razonamiento, así que puedo hacer esto sobre la marcha.


Dirigiéndose a la pregunta: Why do a redirect of the file into sed? Si lo haces:

@$(CC) -M $(CPPFLAGS) $< | sed ''s|:| $*.d : |'' > $@;

y la compilación falla (errores y no genera salida), creará un archivo de destino vacío. Cuando make se ejecute de nuevo, verá el archivo vacío recién creado y no lo regenerará, lo que generará errores de compilación. Usar archivos intermedios es una estrategia defensiva común para evitar crear accidentalmente un objetivo vacío.


En realidad, incluso la regla en sí misma no es necesaria. Existe una gran visión general de los diferentes enfoques de generación de dependencias de estilo Make en el artículo de Advanced Auto-Dependency Generation escrito por Paul D. Smith.

Después de todo, la siguiente regla debería ser suficiente (en caso de usar GCC):

%.o: %.c $(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -o $@ -c $< -include $(SOURCES:.c=.d)

UPD.

También respondí una pregunta similar un poco antes. Contiene una explicación (cita del manual de GCC) de las opciones -MMD -MP .