【问题标题】:Using bash variables in Makefile在 Makefile 中使用 bash 变量
【发布时间】:2015-06-12 13:43:41
【问题描述】:

我想在我的 makefile 中使用 bash 计时变量 例如,在我的终端中,我可以做到这一点并且它可以工作

 MY_TIME=$SECONDS 
 echo $MY_TIME

但是当我在我的 makefile 上写这个时它不起作用

如何在我的 make 文件中使用这两行?

这就是我正在做的事情

.PHONY: myProg
myProg:
      MY_TIME=$SECONDS 
      echo $MY_TIME

在 Etan Reisner 的回答之后

这就是我现在拥有的

.PHONY: myProg
 myProg:
        MY_TIME= date; echo $MY_TIME

但是我的回显结果是一个空行,它看起来不像是在存储日期

【问题讨论】:

  • 你把它放在你的makefile的什么地方?这显然不是一个有效的 make 变量。如果您将 make up 设置为使用 bash 作为 shell(而不是默认的 /bin/sh),它可能会在配方中起作用。
  • 每一行都在一个单独的shell中运行,所以没有。
  • @EtanReisner 我该怎么做?我更新了我的问题。
  • MY_TIME= date 正在使用名为 MY_TIME 的环境变量运行 date 命令,其中包含一个空字符串。您需要 MY_TIME=$(date) 来捕获来自 date 的输出到 MY_TIME 变量中。

标签: bash makefile environment-variables timing


【解决方案1】:

美元符号($MY_TIME)指的是make variables,与bash variables不同。

要访问 bash 变量,您必须使用双美元符号 ($$MY_TIME) 转义美元。

.PHONY: myProg
myProg:
  MY_TIME=$$SECONDS ; echo $$MY_TIME

正如Etan answer 中已经提到的,您不能将代码拆分为多行(除非您使用反斜杠),因为每个命令都在不同的子shell 中执行,使得其他行无法访问变量。

在以下示例中,SECONDS 的值将始终为 0,因为它会被第二行的 shell 生成重置。

.PHONY: myProg
myProg:      # WRONG
  MY_TIME=$$SECONDS
  echo $$MY_TIME

【讨论】:

    【解决方案2】:

    默认情况下,make 使用/bin/sh 作为执行配方行的 shell。

    大概/bin/sh 不支持SECONDS 变量。

    您可以通过为SHELL 变量(即SHELL := /bin/bash)分配一个值来告诉make 使用不同的shell。

    这样做将使SECONDS 可用,但仍然不允许您在配方行之间携带变量值,因为每个配方行都在其自己的外壳中运行。

    因此,要执行您想要的操作,您需要将这两行写在一行上,或者在换行符上继续该行。

    .PHONY: myProg
    myProg:
          MY_TIME=$SECONDS; echo $MY_TIME
    

    .PHONY: myProg
    myProg:
          MY_TIME=$SECONDS; \
          echo $MY_TIME
    

    话虽如此,您几乎肯定这样做会更好,而是使用类似date在配方开始/结束时调用或time调用on 改为直接定时的命令。

    .PHONY: myProg
    myProg:
          date
          # Do something
          date
    

    .PHONY: myProg
    myProg:
          time some_command
    

    【讨论】:

    • 有没有办法将日期的输出存储在变量中以供以后使用?
    • 仅适用于事物的续行版本。或者,如果您有足够新的 make 版本并选择使用 .ONESHELL
    • 您显然也可以使用$(eval LOL := $(shell echo $$RANDOM)) 设置make 变量(SECONDS 毫无意义,因为它在启动时始终为0)。然后在下一行,您可以echo $(LOL) 写出该值。
    • @thatotherguy 如果在正常的 make 上下文中,则不需要$(eval ...)。不过,您需要在宏和配方行中使用它。是的,SECONDS 在任何不继续的情况下都将几乎无用。
    • 你的第一个例子对我不起作用。 $ make whatever-stag MYVAR=stag; echo YVAR YVAR
    【解决方案3】:
    PROGRAM_NAME = myLittleProgram
    
    ...
    
    $(PROGRAM_NAME) : myLittleProgram.o
    

    我知道上述工作,因为它在我自己的 makefile 中(程序名称和对象名称已更改以保护无辜者)。


    “变量引用可以在任何上下文中使用:目标、依赖项、命令、大多数指令和新变量值。这是一个常见情况的示例,其中变量包含程序中所有目标文件的名称:"

    objects = program.o foo.o utils.o
    program : $(objects)
        cc -o program $(objects)
    
    $(objects) : defs.h
    

    http://web.mit.edu/gnu/doc/html/make_6.html

    【讨论】:

    • 这与所提出的问题无关,甚至似乎也没有试图解决它。
    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多