2010-10-05 25 views
13

Quiero usar un directorio temporal que será exclusivo de esta compilación. ¿Cómo puedo obtener el comando pid of my make en el Makefile?¿Cómo obtener pid de mi comando make en el Makefile?

me trataron:

TEMPDIR = /tmp/myprog.$$$$ 

pero esto parece almacenar TEMPDIR como /tmp/myprog.$$ y luego eval como un nuevo PID para cada orden que Refs esto! ¿Cómo obtengo un pid para todos ellos? (Prefiero el make pid, pero cualquier cosa única servirá).

Gracias de antemano.

+1

Pregunta original: Cómo obtener la identificación del proceso en Makefile. Si alguien sabe, me encantaría una respuesta. Sin embargo, esto resolvió el problema de raíz que tenía. – sligocki

Respuesta

25

Pruebe mktemp para crear nombres de archivo temporales únicos. La opción -d creará un directorio en lugar de un archivo.

TEMPFILE := $(shell mktemp) 
TEMPDIR := $(shell mktemp -d) 

Tenga en cuenta los dos puntos. (Nota del editor: Esto hace que evaluar la función una vez y asignar su valor en lugar de volver a evaluar la expresión para cada referencia a $ (TEMPDIR).)

+0

Gracias, parece una buena alternativa. Soy bastante nuevo en la sintaxis Makefile, ¿cómo puedo definir una variable (TEMPDIR) usando un comando de shell (mktemp)? – sligocki

+2

TEMPDIR: = $ (shell mktemp). Tenga en cuenta los dos puntos. –

+0

Esto no responde la pregunta. – badzil

1

Puede usar una cadena de fecha. A menos que estés lanzando múltiples compilaciones al mismo tiempo, esto debería ser bastante cercano.

algo como lo siguiente

pid_standin := $(shell date +%Y-%m-%d_%H-%M-%S) 

file: 
    echo $(pid_standin) 

$ Make 
2010-10-04_21-01-58 

Actualización: Como se señaló en el comentario si se establece una variable con el nombre = val sintaxis es re-evaluated each time it's used. La sintaxis: = lo establece y no vuelve a evaluar el valor, aunque el uso de "back-ticks" `` parece solucionar esto de alguna manera. Realmente desea usar el constructo $ (Shell CMD) para cosas como esta.

+0

Esto no funciona. Todavía evalúa 'date ...' cada vez que usa $ (pid_standin) y así creará diferentes directorios. – sligocki

+1

Muestra lo que sucede cuando pruebo un caso de prueba simple, actualicé la pregunta con una solución –

6

make inicia un nuevo shell para cada comando que se inicia. Al usar bash (no se verificaron otros shells), echo $PPID proporciona el ID del proceso principal (que es make).

all: subtarget 
     echo $$PPID 
     echo $(shell echo $$PPID) 

subtarget: 
     echo $$PPID 
10
TEMPDIR := $(shell mktemp) 

El problema es: cada vez que se ejecuta a hacer, se creará un archivo temporal. Independientemente de si lo usa o no, e independientemente del objetivo de marca que use. Eso significa que o eliminas este archivo en cada destino o no se eliminarán en cualquier momento.

que prefieren agregar el parámetro -u:

TEMPDIR := $(shell mktemp -u) 

Esto hace mktemp para crear un nombre de archivo único sin crear el archivo. Ahora puedes crear el archivo en los objetivos que los necesites. Por supuesto, existe la posibilidad de que existan condiciones de carrera, donde otro proceso utiliza el archivo antes de crearlo. Eso es muy poco probable, pero no utilícelo en un comando elevado, como make install.

1

Aquí está la respuesta a su pregunta, que nadie parecía querer darle:

TEMPDIR := /tmp/myprog.$(shell echo $$$$) 

Por supuesto, esto no se garantiza que sea único.

Cuestiones relacionadas