Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Makefiles中的条件语句、算术运算和输出重定向_Bash_Makefile_Gnu Make - Fatal编程技术网

Bash Makefiles中的条件语句、算术运算和输出重定向

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 =

我正试着

我有两个寄存器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 = 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 ;\