Как получить pid моей команды make в Makefile?

Я хочу использовать временную директорию, которая будет уникальной для этой сборки. Как я могу получить pid моей команды make в Makefile?

Я пробовал:

TEMPDIR = /tmp/myprog.$$$$

но это похоже на сохранение TEMPDIR как /tmp/myprog.$$, а затем eval как новый pid для каждой команды, которая исправляет это! Как получить один pid для всех из них (я бы предпочел сделать pid, но что-то уникальное будет делать).

Спасибо заранее.

Ответ 1

Попробуйте mktemp для создания уникальных временных имен файлов. Опция -d создаст каталог вместо файла.

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

Обратите внимание на двоеточие. (Примечание редактора: Это вызывает make, чтобы оценить функцию один раз и назначить ее значение вместо повторной оценки выражения для каждой ссылки на $(TEMPDIR).)

Ответ 2

TEMPDIR := $(shell mktemp)

Проблема заключается в следующем: каждый раз, когда вы запускаете make, создается временный файл. Независимо от того, используете ли вы это или нет, и независимо от того, какую цель вы используете. Это означает: либо вы удаляете этот файл в каждой цели, либо вы не удаляетесь в любое время.

Я предпочитаю добавить параметр -u:

TEMPDIR := $(shell mktemp -u)

Это делает mktemp для создания уникального имени файла без создания файла. Теперь вы можете создать файл в целевых целях, которые вам нужны. Конечно, есть шанс на условия гонки, когда файл используется другим процессом перед его созданием. Это очень маловероятно, но не использовать его в команде с повышенными правами, например make install.

Ответ 3

make запускает новую оболочку для каждой запускаемой команды. Используя bash (не проверял другие оболочки) echo $PPID дает идентификатор родительского процесса (который является make).

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

subtarget:
        echo $$PPID

Ответ 4

Вы можете использовать строку даты. Если вы не запускаете несколько сборок одновременно, это должно быть довольно близко.

Что-то вроде следующего

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

file: 
    echo $(pid_standin)

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

Обновление. Как отмечено в комментарии, если вы задали переменную с синтаксисом name = val, она пересматривается каждый раз, когда она используется. Синтаксис: = устанавливает его и не переоценивает значение, хотя использование обратных тиков `` похоже, как-то обойти это. Вы действительно хотите использовать конструкцию $(shell CMD) для таких вещей.

Ответ 5

Вот ответ на ваш вопрос, который, казалось, никто не хотел вам дать:

TEMPDIR := /tmp/myprog.$(shell ps -o ppid $$$$)

Конечно, это не гарантируется быть уникальным.

Ответ 6

Кроме того, вы можете получить свой make pid, как это.

PID := $(shell ps | tail -n 6 | head -n 1 | cut -f1 -d' ')