He heredado una aplicación Linux C++ y un archivo MAKE. En el archivo MAKE existente, tenía un código como el siguiente:
APPVER=5.01 REL=B $(APP): $(OBJS) $(MAKEFILE) echo $APPVER > .sw_ver.txt echo " " >> .sw_ver.txt echo $REL >> .sw_ver.txt $(LD) $(OBJS) $(LDFLAGS) -o $(APP)En tiempo de ejecución, la aplicación abriría este archivo de texto y mostraría su versión.
En el espíritu de Make, reconstruir ese archivo .sw_ver.txt cada vez que se sentía mal. Así que lo dividí de la siguiente manera:
APPVER=5.01 REL=B $(APP): $(OBJS) $(MAKEFILE) .sw_ver.txt $(LD) $(OBJS) $(LDFLAGS) -o $(APP) .sw_ver.txt: $(MAKEFILE) echo $APPVER > .sw_ver.txt echo " " >> .sw_ver.txt echo $REL >> .sw_ver.txtPasos:
make -B : realiza los pasos, creando el archivo de texto y actualizando la aplicación.make : aquí dice que no hay necesidad de actualizar el archivo de texto y elimina la regla.Esperaba que viera que el Makefile había cambiado y, por lo tanto, actualice el archivo de texto. Pero no es así.
Intenté agregar un archivo ficticio, pero dice que parece haberse podado.
Lo que estoy tratando de hacer es solo si el Makefile ha cambiado (pensando que quizás APPVER o REL han cambiado), luego reconstruir el archivo .sw_ver.txt .
¿Tienes algún consejo?
Gracias
===== editar #1
hola, probé una alternativa, mover la información de la versión a un archivo en lugar de intentar crear el archivo durante una ejecución. Como heredé estas cosas, estaba tratando de cambiar lo menos posible.
Solo por el bien de la trivia, sería interesante saber si hay una respuesta a la pregunta original.
gracias de nuevo
archivo .sw_ver.txt
5.01 BMakefile:
$(APP): $(OBJS) $(MAKEFILE) .sw_ver.txt $(LD) $(OBJS) $(LDFLAGS) -o $(APP) .sw_ver.txt: $(MAKEFILE)===== editar #2
Hablé demasiado pronto. Esta configuración funciona si se cambia alguno de los OBJS , pero no funciona si se cambia el propio Makefile .
Entonces, amables extraños... ¿alguna idea? Gracias
Dos cosas para aclarar:
MAKEFILE no es una variable integrada implícita. Entonces, si no establece su valor, no contiene nada. (Puede ejecutar make -p en un directorio sin Makefile para ver qué variables hay. Consulte https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html )$(MAKEFILE) está vacío, cuando se expande, .sw_ver.txt se convierte en una regla sin requisitos previos . Por lo tanto, si .sw_ver.txt ya existe, no se hará nada para regenerarlo. Lo que obtienes es en realidad esto (ten en cuenta que tu sintaxis $APPVER y $REL también son incorrectas): .sw_ver.txt: # $(MAKEFILE) is empty echo PPVER > .sw_ver.txt # $(A) is empty echo " " >> .sw_ver.txt echo EL >> .sw_ver.txt # $(R) is emptyAsí que lo que tienes que hacer es:
MAKEFILE . MAKEFILE := Makefile .sw_ver.txt: $(MAKEFILE) echo $(APPVER) > $@ echo " " >> $@ echo $(REL) >> $@ Después de hacer esto, debería poder regenerar .sw_ver.txt cada vez que actualice su Makefile.