【问题标题】:How to get pid of my make command in the Makefile?如何在 Makefile 中获取我的 make 命令的 pid?
【发布时间】:2010-10-05 00:36:37
【问题描述】:

我想使用此构建唯一的临时目录。如何在 Makefile 中获取 make 命令的 pid?

我试过了:

TEMPDIR = /tmp/myprog.$$$$

但这似乎将TEMPDIR 存储为/tmp/myprog.$$,然后将 eval 作为每个引用它的命令的新 pid!我如何为所有这些获得一个 pid(我更喜欢 make pid,但任何独特的都可以)。

提前致谢。

【问题讨论】:

  • 原问题:如何在 Makefile 中获取进程 ID。如果有人知道,我很想得到一个答案。但是,这解决了我遇到的根本问题。

标签: makefile pid temporary-directory


【解决方案1】:

尝试使用mktemp 创建唯一的临时文件名。 -d 选项将创建一个目录而不是文件。

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

注意冒号。 (编者注:这会导致 make 对函数进行一次评估并为其赋值,而不是为每个对 $(TEMPDIR) 的引用重新评估表达式。)

【讨论】:

  • 谢谢,这看起来是个不错的选择。我对 Makefile 语法比较陌生,如何使用 shell 命令 (mktemp) 定义变量 (TEMPDIR)?
  • TEMPDIR := $(shell mktemp)。注意冒号。
  • 这没有回答问题。
  • 请注意,不带参数的调用 mktemp 在 MacOS/BSD 兼容的系统上不起作用。使用mktemp -t tempfile.XXXXXX 将是更好的便携选择。
  • 这不能在配方中使用:make: TEMPDIR: Command not found
【解决方案2】:

make 为它启动的每个命令启动一个新的 shell。使用 bash(不检查其他 shell)echo $PPID 给出父进程 ID(即 make)。

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

subtarget:
        echo $$PPID

【讨论】:

    【解决方案3】:
    TEMPDIR := $(shell mktemp)
    

    问题是:每次运行make,都会创建一个临时文件。无论您是否使用它,也无论您使用什么 make 目标。这意味着:要么您在每个目标中删除此文件,要么您随时都不会删除它们。

    我更喜欢加-u参数:

    TEMPDIR := $(shell mktemp -u)
    

    这使得 mktemp 创建一个唯一的文件名而不创建文件。现在您可以在需要它们的目标中创建文件。当然,有可能出现竞争条件,即文件在创建之前被另一个进程使用。这不太可能,但不要在提升的命令中使用它,例如make install

    【讨论】:

      【解决方案4】:

      这是您的问题的答案,似乎没有人愿意给您:

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

      当然,这不能保证是唯一的。

      【讨论】:

      • 这给出了一个稳定的 TEMPDIR 变量(因为 := 而不是 = 来创建一个简单扩展而不是递归扩展的变量),但它给出了该子外壳的 PID,而不是 make 命令本身(如果有人真的在寻找 make 命令的 PID)
      【解决方案5】:

      您可以使用日期字符串。除非您同时启动多个构建,否则这应该非常接近。

      类似下面的东西

      pid_standin := $(shell date +%Y-%m-%d_%H-%M-%S)
      
      file: 
          echo $(pid_standin)
      
      $ Make
      2010-10-04_21-01-58
      

      更新:如评论中所述,如果您使用 name = val 语法设置变量,则它是 re-evaluated each time it's used。 := 语法设置它并且不重新评估该值,尽管使用反引号 `` 似乎以某种方式解决了这个问题。您真的想将 $(shell CMD) 构造用于此类内容。

      【讨论】:

      • 这不起作用。每次您使用 $(pid_standin) 时,它仍然会评估 date ...,因此会创建不同的目录。
      • 显示当我尝试一个简单的测试用例时会发生什么,并通过修复更新了问题
      【解决方案6】:

      另外,你可以像这样得到你的make pid。

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

      【讨论】:

        猜你喜欢
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多