【问题标题】:Assigning a macro value in Make from a shell command通过 shell 命令在 Make 中分配宏值
【发布时间】:2021-03-05 16:06:03
【问题描述】:

I/O 块大小将在我需要编写的 Makefile 中占据显着位置,因此我需要一种计算方法。这个脚本做我想做的事:

> cat blksz.bash
#!/bin/bash
bsl=$(du --block-size=1 testfile)
bsl=($bsl)
echo ${bsl[0]}

(有人可能有更好的方法,但如果你能忍受我,那并不是问题的最普遍的观点。)

我可以从我的 Makefile 中调用它,它工作正常:

> cat Makefile
BLOCKSIZE := $(shell ./blksz.bash)
blocksize:
        echo $(BLOCKSIZE)
> make blocksize
echo 4096
4096

那我觉得这个脚本这么小,放在Makefile里不是更好吗?但后来它不再起作用了。

> cat Makefile
BLOCKSIZE := $(shell bsl=$(du --block-size=1 testfile) ; \
               bsl=($bsl) ; \
               echo ${bsl[0]})
blocksize:
        echo $(BLOCKSIZE)
> make blocksize
echo

BLOCKSIZE 从未定义。显然,我在 Makefile 中错误地定义了 shell 命令。谁能告诉我这样做的正确方法?此外,可能有更好的方法来获取块大小,但更广泛的问题是如何从 shell 命令中获取返回值,以便 Makefile 可以看到它可能会在某个时候再次出现,这基本上是我想弄清楚什么。

最后一件事,关于重复的问题,周围有一些类似的问题,但没有什么能完全符合我的要求,AFAICT。我认为这有所不同的是,我在 shell 命令中使用了变量,并且不知何故,它们的内容正在丢失。

【问题讨论】:

  • 为了直接回答你的问题,$ 是一个特殊的 make 字符(它引入了 make 变量和函数),所以如果你想将它传递给 shell,你必须将它转义为 $$ .加上 /bin/sh 中不可用的 shell 变量的问题。所以你的命令必须是:BLOCKSIZE := $(shell /bin/bash -c 'bsl=$$(du --block-size=1 testfile) ; bsl=($$bsl) ; echo $${bsl[0]}')。然而,如下所述,有更好的方法来做到这一点。
  • @MadScientist 双 $ 解决了我遇到的更普遍的问题。将来会帮助我使用其他使用变量的 shell 命令。如果你把它变成一个答案,我会接受它。
  • 我在下面编辑了我的答案。

标签: shell makefile gnu-make


【解决方案1】:

为了直接回答你的问题,$ 是一个特殊的 make 字符(它引入了 make 变量和函数),所以如果你想将它传递给 shell,你必须将它转义为 $$。加上@tripleee 提到的/bin/sh 中没有数组变量的问题。

所以你的命令必须是:

BLOCKSIZE := $(shell /bin/bash -c 'bsl=$$(du --block-size=1 testfile) ; bsl=($$bsl) ; echo $${bsl[0]}').

我个人不喜欢使用特定于 bash 的功能,也不喜欢使用 awk,而是使用 YMMV。执行此 IMO 的更好方法是使用 stat 程序:

BLOCKSIZE := $(shell stat -c %s testfile)

如果你不想stat,那么另一种方法是:

BLOCKSIZE := ${shell set -- $$(du --block-size=1 testfile); echo $$1}

【讨论】:

    【解决方案2】:

    除非你破解SHELL=/bin/bash,否则你的shell命令将由/bin/sh执行。但是你不需要为此使用 Bash。

    BLOCKSIZE := $(shell du --block-size=1 testfile | awk '{ print $$1 }')
    

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多