16

このビルドに固有の一時ディレクトリを使用したいと思います。Makefileでmakeコマンドのpidを取得するにはどうすればよいですか?

私は試した:

TEMPDIR = /tmp/myprog.$$$$

しかし、これは、これを参照するすべてのコマンドの新しいpidとして保存TEMPDIRされ、次にevalとして保存されるようです。/tmp/myprog.$$それらすべてに対して1つのpidを取得するにはどうすればよいですか(make pidの方がいいですが、ユニークなものなら何でもかまいません)。

前もって感謝します。

4

6 に答える 6

26

一意の一時ファイル名を作成するには、mktempを試してください。この-dオプションは、ファイルの代わりにディレクトリを作成します。

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

コロンに注意してください。(編集者注:これにより、makeは、$(TEMPDIR)へのすべての参照に対して式を再評価する代わりに、関数を1回評価し、その値を割り当てます。)

于 2010-10-05T00:43:08.773 に答える
10

make開始するコマンドごとに新しいシェルを開始します。bash(他のシェルをチェックしなかった)echo $PPIDを使用すると、親プロセスID(make)が得られます。

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

subtarget:
        echo $$PPID
于 2011-11-10T14:41:18.853 に答える
10
TEMPDIR := $(shell mktemp)

問題は、makeを実行するたびに、一時ファイルが作成されることです。あなたがそれを使うかどうかに関係なく、そしてあなたが使うmakeターゲットに関係なく。つまり、すべてのターゲットでこのファイルを削除するか、いつでも削除されないようにします。

-uパラメーターを追加することを好みます。

TEMPDIR := $(shell mktemp -u)

これにより、mktempはファイルを作成せずに一意のファイル名を作成します。これで、必要なターゲットにファイルを作成できます。もちろん、ファイルを作成する前に別のプロセスでファイルが使用されるという競合状態が発生する可能性があります。これはほとんどあり得ませんが、のような昇格されたコマンドでは使用しないでくださいmake install

于 2011-11-10T14:52:02.600 に答える
4

これがあなたの質問に対する答えです、誰もあなたに与えたくないようでした:

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

もちろん、これが一意であるとは限りません。

于 2017-11-19T06:00:24.743 に答える
1

日付文字列を使用できます。同時に複数のビルドを開始する場合を除いて、これはかなり近いはずです。

次のようなもの

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)コンストラクトを使いたいです。

于 2010-10-05T00:43:55.103 に答える
-2

また、このようにmakepidを取得できます。

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

于 2018-03-24T11:57:27.020 に答える