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