Pregunta

Tengo un proyecto que estoy trabajando para liberar esa realidad contiene 3 subproyectos, todos los cuales necesitan ser compilado en una sola vez. Mi makefile se ve más o menos así:

all: a b c

a:
    @cd a && make

b:
    @cd b && make

c:
    @cd c && make

Los proyectos A y B se usan para compilar bien, pero para la tercera proyecto, me dice que no hay nada que hacer a pesar de cambiar al directorio C y la ejecución de make no, de hecho, compilar el código.

Para ser un poco más específico: Proyecto C en el ejemplo anterior es en realidad SpiderMonkey de Mozilla. Mientras que A y B son de código / archivos MAKE que he escrito, C es simplemente una copia prima de SpiderMonkey desde el sitio web de Mozilla. El comando que se compile para ello es:

make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

En mi Makefile principal, que tengo:

spidermonkey:
    @cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

Running "hacer Spidermonkey" productos "Marca: Nada que hacer para el` spidermonkey'." ¿Cómo me hago para ejecutar el comando?

EDIT: He intentado añadir las siguientes líneas al archivo MAKE:

.PHONY: spidermonkey

Además de cambiar el nombre de la regla spidermonkey a SM, pero todavía no hay cambio.

EDIT: ¡Culpa mía! Tuve espacios cuando debería haber tenido una ficha. Do!

¿Fue útil?

Solución

Es probable que tenga un archivo o directorio en el nivel superior llamado "spidermonkey". Hacer piensa que esto es lo que su supone para crear, y puesto que ya está ahí, hacer paradas.

Una de las reglas más importantes a seguir al escribir archivos make es cada objetivo debe crear un archivo con el mismo nombre que el objetivo . En otras palabras, si usted tiene

 a:
       <some command>

Este comando debe producir un solo archivo llamado "a".

Reglas que no producen archivos, pero allí sólo como marcadores de posición se denominan objetivos falsos , y deben ser declarados como esto:

 .PHONY: a

Hacer entonces siempre asumir que una tiene que ser rehecho.

También, como regla general no utilice "make" para invocar realizar de forma recursiva, utilice $ (HAZ) en lugar .

EDIT: cambiado "pseudo" a "falso"

Otros consejos

Hacer sólo comprueba la existencia de un archivo (o directorio) el mismo nombre que el objetivo de la regla, y si existe (y es más reciente que las dependencias) a continuación, desde el punto de vista del maquillaje no hay nada más que hacer.

Así que el problema es que usted tiene una regla spidermonkey (sin dependencias), así como un directorio llamado spidermonkey, y luego hace piensa "el objetivo ya está hecho, no hay nada que yo haga". Para conseguir hacer para hacer lo que desee, cambiar el nombre de la regla spidermonkey (o el directorio).

Hablando de maquillaje recursiva por cierto, esto no es necesariamente siempre una buena idea, ver recursiva hacer en ellas nocivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top