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

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

Я старался:

TEMPDIR = /tmp/myprog.$$$$

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

Заранее спасибо.

6 ответов

Решение

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

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

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

TEMPDIR := $(shell mktemp)

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

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

TEMPDIR := $(shell mktemp -u)

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

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

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

subtarget:
        echo $$PPID

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

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

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

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

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

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) для подобных вещей.

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

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

Другие вопросы по тегам