Using bash variables in Makefile

时间秒杀一切 提交于 2019-12-02 01:30:42

问题


I want to use the bash timing variables in my makefile for example in my terminal I can do this and it works

 MY_TIME=$SECONDS 
 echo $MY_TIME

but when I write this on my makefile it does not work

how can I use these two lines in my make file?

this is what I'm doing

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

After Etan Reisner' answer

This is what I have now

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

but the result of my echo is an empty line, it does not look like it is storing the date


回答1:


By default make uses /bin/sh as the shell which executes recipe lines.

Presumably /bin/sh doesn't support the SECONDS variable.

You can tell make to use a different shell by assigning a value to the SHELL variable (i.e. SHELL := /bin/bash).

Doing that will make SECONDS available but will still not allow you to carry a variable value between recipe lines as each recipe line is run in its own shell.

So to do what you want you would need to write both of those lines on one line or continue the line over the newline.

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

or

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

That being said you would almost certainly be better off not doing this and instead using something like date invoked at the start/end of the recipe or time invoked on the command to be timed directly instead.

.PHONY: myProg
myProg:
      date
      # Do something
      date

or

.PHONY: myProg
myProg:
      time some_command



回答2:


the dollar sign ($MY_TIME) refers to make variables, which are not the same as bash variables.

To access a bash variable you must escape the dollar using the double dollar notation ($$MY_TIME).

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

As already mentioned in Etan answer you can't split the code in multiple commands (without using the backslash) since each command runs in a dedicated shell, thus losing the variable.

In this specific example the value of SECONDS will be always 0, since it get reset by the spawn of the shell for that line.




回答3:


PROGRAM_NAME = myLittleProgram

...

$(PROGRAM_NAME) : myLittleProgram.o

I know the above works, as it is in my own makefile (program names and object names changed to protect the innocent).


"Variable references can be used in any context: targets, dependencies, commands, most directives, and new variable values. Here is an example of a common case, where a variable holds the names of all the object files in a program:"

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



来源:https://stackoverflow.com/questions/29500434/using-bash-variables-in-makefile

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!