Как получить 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' ')