我想要
我有两个寄存器reg_a和reg_b,每个寄存器都是32位。 reg_a用于存储纪元时间(unix时间),因此它最多可以达到2 ^ 32 -1。如果发生溢出,溢出应存储在reg_b中。我也想把它们写在rom.txt文件中。我试图在Makefile中执行此操作。这是我得到了多远(它更多的是伪代码,有语法错误)。很高兴知道是否有更好的方法来做到这一点。
# should be 2^32-1, but lets consider the below for example
EPOCH_MAX = 1500000000
identifier:
# get the epoch value
epoch=$(shell date +%s)
# initialize the reg_a, reg_b, assuming that overflow has not occurred
reg_a=$(epoch)
reg_b=0
# if overflow occurs
if [ ${epoch} -gt $(EPOCH_MAX)] ; then \
reg_a=$(EPOCH_MAX) ;\
reg_b=$(shell $(epoch)\-$(EPOCH_MAX) | bc) ;\
fi ;\
# here I want to print the values in a text file
echo $$(reg_a) > rom.txt
echo $$(reg_b) >> rom.txt
我是Makefile的新手。以上只是一种伪代码,告诉我想做什么(主要是通过阅读一些网页)。如果有人可以帮我解决上述问题,我会很高兴。感谢。
答案 0 :(得分:1)
你一直在问很多关于make的问题。我想你可能会花一些时间阅读GNU make manual
与您的问题相关,配方中的每个逻辑行都在一个单独的shell中运行。因此,您不能在一个逻辑行中设置shell变量,然后在另一个逻辑行中使用结果。
A"逻辑行"是前一个以反斜杠/换行符结尾的所有物理行。
所以:
identifier:
# get the epoch value
epoch=$(shell date +%s)
# initialize the reg_a, reg_b, assuming that overflow has not occurred
reg_a=$(epoch)
reg_b=0
将运行5个单独的shell,每行一个(包括注释!每个用TAB字符缩进的行被认为是一个配方行,甚至是以注释开头的那些)。
另一方面,这个:
if [ ${epoch} -gt $(EPOCH_MAX)] ; then \
reg_a=$(EPOCH_MAX) ;\
reg_b=$(shell $(epoch)\-$(EPOCH_MAX) | bc) ;\
fi ;\
在单个shell中运行整个if语句,因为反斜杠/换行符对创建了一条逻辑行。
其次,您必须在脑海中清楚地了解 make 变量和 shell 变量之间的区别。在上面,行epoch=$(shell date +%s)
正在设置 shell 变量epoch
(当shell退出时,该值会立即再次丢失)。
第reg_a=$(epoch)
行引用 make 变量epoch
,该变量未设置,因此为空。