makefile
.FONY target
Buscar..
Usando .PHONY para objetivos sin archivos
Use .PHONY
para especificar los objetivos que no son archivos, por ejemplo, clean
o mrproper
.
Buen ejemplo
.PHONY: clean
clean:
rm *.o temp
Mal ejemplo
clean:
rm *.o temp
En el buen ejemplo, make
sabe que clean
no es un archivo, por lo tanto, no buscará si está o no actualizado y ejecutará la receta.
En el mal ejemplo, make
buscará un archivo llamado clean
. Si no existe o no está actualizada, ejecutará la receta, pero si existe y está actualizada, la receta no se ejecutará.
Uso de .PHONY para invocaciones recursivas del comando 'make'
El uso recursivo de make significa usar make como comando dentro de un makefile. Esta técnica es útil cuando un proyecto grande contiene subdirectorios, cada uno con sus respectivos makefiles. El siguiente ejemplo ayudará a comprender la ventaja de usar .PHONY con make recursivo.
/main
|_ Makefile
|_ /foo
|_ Makefile
|_ ... // other files
|_ /bar
|_ Makefile
|_ ... // other files
|_ /koo
|_ Makefile
|_ ... // other files
Para ejecutar el makefile del subdirectorio desde el makefile de main, el makefile del main debería tener un bucle como se muestra a continuación (hay otras formas en que esto puede lograrse, pero eso está fuera del alcance del tema actual)
SUBDIRS = foo bar koo
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Sin embargo, hay trampas con este método.
- Cualquier error detectado en una sub-marca es ignorado por esta regla, por lo que continuará construyendo el resto de los directorios, incluso cuando uno falla.
- La capacidad de Make para realizar la ejecución paralela de múltiples objetivos de compilación no se utiliza ya que solo se usa una regla.
Al declarar los subdirectorios como objetivos .PHONY (debe hacer esto, ya que el subdirectorio obviamente siempre existe; de lo contrario, no se generará) estos problemas se pueden superar.
SUBDIRS = foo bar koo
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@