Permítanme ilustrarlo con un ejemplo.

mkdir test
cd test
touch target
make target

Esto resultará en: make: Nothing to be done for 'target'.

Así hacer me dice que no hay nada que hacer. Esto es debido a que hacer no encontrar una regla para hacer target, pero debido a que el target ya existe hacer me dice que no hay nada que hacer.

Ahora, yo no quiero eso. Quiero hacer que me da un error cuando no se puede encontrar una regla para target, aunque el target ya existe.

He probado los siguientes:

echo '.DEFAULT:
        echo make: *** No rule to make target `[email protected]'.  Stop.
        false'> Makefile

Pero esto no impide que el hacer al realizar múltiples objetivos.

InformationsquelleAutor To1ne | 2011-07-19

4 Comentarios

  1. 2

    Si usted piensa acerca de ello, que terminaría con un huevo y la gallina situación (o regresión infinita). Supongamos que se las arregló para tener una regla que decía ‘debe tener una regla para crear objetivo antes de que sea legítimo‘, entonces usted tendría una regla que dice » objetivo depende de X‘ para algún otro archivo X. Eso está escrito:

    target: X
            command to build target from X
    

    Pero entonces usted estaría de vuelta al punto de partida: también le desea una regla para crear X. ¿Cómo puedes hacer eso? Usted podría tener una regla que no depende de nada y por arte de magia se crea el archivo X cuando es necesario:

    X:
            command to build X from nothing
    

    Sin una regla como que, de haber una regresión infinita.

    Así, make está diseñado para asegurar que los archivos que existen y son hasta la fecha. Si un archivo existe y no hay reglas – implícito o explícito – para especificar cómo se hace, a continuación, el archivo es hasta la fecha. Lo que están tratando de hacer no es posible.

    • Buen punto, pero estoy lidiando con otro problema (no se describe claramente en mi pregunta). Gracias por la respuesta. Voy a crear una nueva pregunta cuando he creado un sencillo ejemplo para explicar el problema.
    • En realidad no hay pollo-y-el-huevo aquí. Sólo tienes que pre-declarar todos sus huevos (como las declaraciones de variables en la mayoría de los idiomas), Muy onu-makelike, sí.
    • Downvoting. Parece que el uso de un falso objetivo de lograr lo que el OP quería.
  2. 7

    El problema es, que hacen que asume el nombre de destino también es un fichero que se va a construir por los comandos.

    Pero a veces esto no es cierto (por ejemplo, pensar en «limpio»).
    Decirle a hacer que algunos de los objetivos no crear este archivo, usted necesita para hacer de ellos «falso». Poner la siguiente línea en el archivo Makefile:

    .PHONY: target
    
  3. 0
    obj -m:=smsc911x.o
    KDIR=/home/rajasekarm/Desktop/project/dvsdk/psp/linux-2.6.37-psp04.02.00.07.sdk
    

    objetivo:

    make -C  ARCH=arm CROSS_COMPILE=/home/rajasekarm/Desktop/project/dvsdk/linux-devkit/bin- $(KDIR) M=$(PWD) moduiles
    clean :
    make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/rajasekarm/Desktop/project/dvsdk/linux-devkit/bin- M=$(PWD) clean
    

    ~ después de entrar en la marca que no da nada por hacer para que la meta

    here -->/home/rajasekarm/Desktop/project/dvsdk/linux-devkit/bin is my cross compiler path
    
  4. 0

    Realmente esto suena como una perfectamente razonable (si equivocados ;-)) la petición. Usted tendrá que mostrar explícitamente cada archivo de código fuente con una regla con un vacío receta aunque.

    Aquí vamos:

    Makefile: ;
    
    .PHONY: dodgy
    dodgy%: dodgy; $(error You must provide a rule for $*)
    %: dodgy% ;
    

    La prueba del budín:

    $ rm aa
    $ make aa
    Makefile:4: *** You must provide a rule for aa.  Stop.
    $ touch aa
    $ make aa
    Makefile:4: *** You must provide a rule for aa.  Stop.
    

    Tenga en cuenta que la línea de Makefile: ; es necesario. Después de todo, la primera cosa hacer intenta hacer es reconstruir el archivo Makefile.

    Tenga en cuenta también que el patrón de la regla es no-terminal. Esto puede ser un enorme impacto en el rendimiento. Como el manual dice acerca de que coincida con cualquier cosa reglas «son muy útiles, pero puede tomar un montón de tiempo para pensar acerca de ellos.»

Dejar respuesta

Please enter your comment!
Please enter your name here