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.

  1. 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.
  2. 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 $@


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow