Как получить pid моей команды make в Makefile? - PullRequest
14 голосов
/ 05 октября 2010

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

Я пытался:

TEMPDIR = /tmp/myprog.$$$$

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

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

Ответы [ 6 ]

26 голосов
/ 05 октября 2010

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

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

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

10 голосов
/ 10 ноября 2011
TEMPDIR := $(shell mktemp)

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

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

TEMPDIR := $(shell mktemp -u)

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

9 голосов
/ 10 ноября 2011

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

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

subtarget:
        echo $$PPID
1 голос
/ 19 ноября 2017

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

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

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

1 голос
/ 05 октября 2010

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

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

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

0 голосов
/ 24 марта 2018

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

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

...