2011-03-14 10 views
21

He estado buscando durante una hora, y esta información parece ser la nada ...GNU make: La extracción de argumento para -j dentro Makefile

me gustaría ser capaz de extraer (y, posiblemente, su uso) el número de "puestos de trabajo" solicitados, pasados ​​a través de la opción -j, o de "Hacerse él mismo" en el caso de las sub-marcas, en el archivo MAKE.

Lo más prometedor que he visto hasta ahora es la variable $ (MAKEFLAGS), pero en mi sistema (si hago, por ejemplo, hago -j2) el contenido de esta variable es solo "--jobserver-fds = 3,4 -j ". ¿Hay alguna manera de obtener la cantidad real de trabajos aprobados con -j?

+1

¿Por qué quieres hacer eso? Esto va tan en contra del espíritu de la marca, estoy bastante seguro de que hay una mejor manera de lograr lo que quieres hacer. –

+0

Puede hacer que el número de trabajos sea un parámetro variable en su Makefile de nivel superior, que invocaría internamente 'make -j'. – aaz

+0

@static_rtti, esperaba aprender un poco más sobre la ejecución real de make (en particular cuando se invoca con $ (MAKE)). Por ejemplo, ¿todas las sub-marcas tienen un valor de job_slots de 1 o pueden las sub-marcas pasar algún subconjunto de las N tareas disponibles en el nivel superior? Leer la fuente como sugirió Raphael es probablemente la forma de determinar esto, pero pensé que experimentar con make podría ser más simple. –

Respuesta

11

Actualmente, hay una forma de implementar esto completamente dentro de su archivo MAKE en * nix.

MAKE_PID := $(shell echo $$PPID) 
JOB_FLAG := $(filter -j%, $(subst -j ,-j,$(shell ps T | grep "^\s*$(MAKE_PID).*$(MAKE)"))) 
JOBS  := $(subst -j,,$(JOB_FLAG)) 

ps, ​​grep también deben instalarse, pero es casi un hecho. Se puede mejorar aún más para manejar --obsulta también

+0

¡Acabo de probar esto, y funciona genial! Podría hacer un pequeño cambio para establecer '$ JOB_FLAG' en 1 si el usuario no pasó ningún' -j' para hacer. ¡Gracias! –

+0

En lugar de agrupar la salida de 'ps', también puede leer'/proc/$ PPID/cmdline'. –

12

Lo siento, pero no hay forma de identificar el número de trabajos paralelos, sin escribir una aplicación o script que escanee la lista de procesos para identificar los parámetros de la llamada.

Compruebe el código fuente en http://cvs.savannah.gnu.org/viewvc/make/main.c?revision=1.246&root=make&view=markup. Buscar job_slots > 1.

Actualización: Si tiene control sobre el rango operativo, puede envolver la aplicación make con su propio programa/script, analizar los parámetros, establecer una variable de entorno dedicada y llamar a la marca original después.

+2

Votación hacia arriba para ir a la fuente. –

+0

Hola Raphael, gracias por tu respuesta; ¡Es de lo que tenía miedo! Por ahora simplemente pude modificar mi Makefile para que el valor real de -j no fuera necesario ... lo cual creo que es más "en el espíritu de make" ;-P –

Cuestiones relacionadas