Bash Makefiles中的条件语句、算术运算和输出重定向
我正试着 我有两个寄存器reg_a和reg_b,每个都是32位的。reg_a用于存储历元时间(unix时间),因此它最多可以达到2^32-1。如果发生溢出,溢出应存储在注册表b中。我还想把它们写在rom.txt文件中。我正试图在一个Makefile中这样做。这就是我所做的(这更多的是一个伪代码,有语法错误)。我很高兴知道是否有更好的方法Bash Makefiles中的条件语句、算术运算和输出重定向,bash,makefile,gnu-make,Bash,Makefile,Gnu Make,我正试着 我有两个寄存器reg_a和reg_b,每个都是32位的。reg_a用于存储历元时间(unix时间),因此它最多可以达到2^32-1。如果发生溢出,溢出应存储在注册表b中。我还想把它们写在rom.txt文件中。我正试图在一个Makefile中这样做。这就是我所做的(这更多的是一个伪代码,有语法错误)。我很高兴知道是否有更好的方法 # should be 2^32-1, but lets consider the below for example EPOCH_MAX =
# 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
我是制作文件的新手。以上只是一种伪代码,告诉我想做什么(主要是通过阅读一些网页)。如果有人能帮我解决以上问题,我会很高兴的。谢谢。你问了很多关于make的问题。我想你可能会从花些时间阅读 与您的问题相关,配方中的每个逻辑行都在单独的shell中运行。因此,不能在一个逻辑行中设置shell变量,然后在另一个逻辑行中使用结果 “逻辑行”是前一行以反斜杠/换行结束的所有物理行 因此: 将运行5个单独的shell,每行一个(包括注释!每行缩进一个制表符都视为配方行,即使是以注释开头的行) 另一方面,这:
if [ ${epoch} -gt $(EPOCH_MAX)] ; then \
reg_a=$(EPOCH_MAX) ;\
reg_b=$(shell $(epoch)\-$(EPOCH_MAX) | bc) ;\
fi ;\
在单个shell中运行整个if语句,因为反斜杠/换行符对创建单个逻辑行
第二,您必须在头脑中非常清楚make变量和shell变量之间的区别。在上面的行中,epoch=$(shell日期+%s)
正在设置shell变量epoch
(当shell退出时,该值会立即丢失)
行
reg\u a=$(epoch)
引用的是make变量epoch
,该变量未设置,因此为空。“我确实是makefile新手”。您最好将其放入脚本并调用脚本。否则,请确保正确转义“$”字符,并继续使用“;\”行正确构造。这是可以做到的。这真是讨厌。我终于决定用bash脚本了。对我来说要简单得多。
if [ ${epoch} -gt $(EPOCH_MAX)] ; then \
reg_a=$(EPOCH_MAX) ;\
reg_b=$(shell $(epoch)\-$(EPOCH_MAX) | bc) ;\
fi ;\