【问题标题】:Running shell commands in GNUmakefile在 GNUmakefile 中运行 shell 命令
【发布时间】:2020-04-20 06:52:49
【问题描述】:

我需要根据用户输入运行目标。目前在我们的 makefile 中,如果目录存在,我们正在运行规则。我正在尝试更新我们的 makefile 以检查用户输入并相应地运行,而不是为所有可用文件夹(文件夹 = 项目)运行目标。

我的目录结构是这样的:-

/home/ravi/build/test/usb/usb.trm
/home/ravi/build/test/flash/flash.trm .... 

这是我的规则:-

$(TGTBUILD)/%f.c: $(CURDIR)/test/%.trm
    str=$*; \
    IFS='/'; \
    read -ra ADDR <<< "$$str";   \
    for i in "$${ADDR[@]}"; do \
      value=$$i;  \
      break;   \
    done;  \
    if [[ $(PROJECTS) == *$$value* ]]; then \
      $(test_c) \
    fi  

$(PROJECTS) 变量在运行时有用户给定的项目。我在运行 makefile 时给出了usb。所以 makefile 必须只为usb 项目运行,而不是flash 项目。为了达到同样的效果,我对规则进行了上述更改,以检查规则是否仅针对用户给定的项目运行。

我遇到以下问题:-

   str=cdn_ahb/cdn_ahb; \
    IFS='/'; \
    read -ra ADDR <<< "$str";   \
    for i in "${ADDR[@]}"; do \
        value=$i;  \
        break;   \
    done;  \
    if [[ ccix == *$value* ]]; then \
    mkdir -p /home/ravi/workspace/client_test/build/Release/project/usb
    /bin/sh: -c: line 9: syntax error: unexpected end of file

我的语法有什么问题吗?或者你能建议我用其他方法来实现我的要求吗?

【问题讨论】:

  • 您没有告诉我们test_c 变量的值,这是这里的关键问题,因为这就是发生故障的地方。

标签: shell makefile gnu-make


【解决方案1】:

至少这里是可疑的:value=idone 之后需要分号;加上一个fi 来终止if。那么

str = $*

失败,因为 shell 变量赋值中不能有空格。我建议改为str="$*";。特别注意分号,因为像

FOO=bar echo "$FOO"

不会回显条,而

FOO=bar; echo "$FOO"

会的。接下来,value=i 应该是 value=$$i*$value* 应该是 *$$value* 因为 make 否则会认为你引用了一个 make 变量,而你的意思是一个 shell变量。

除此之外,您的构建看起来太复杂了。是时候将构建重构为更简单了。需要用户输入的构建是可憎的(不能从 cron 运行它,不能从持续集成运行它,需要一只会说话的猴子来处理)。您应该使用 make 变量参数化您的构建,以便您可以说

 make BUILD=usb   # or BUILD=flash or whatever.

也许这个 GNUmakefile 更简单:

test_c = echo testing...

$(TGTBUILD)/%f.c: $(CURDIR)/test/%.trm
ifeq (${BUILD},usb)
        $(test_c)
else
        echo BUILD is not usb
endif

【讨论】:

  • Jens,仅用于手动运行。我们不打算在 cron 工作中使用它。有没有办法只使用 make 语法而不是在 target 中使用 shell 命令?因为我现在面临您建议的更改的其他一些问题。更新了我的问题。
  • @santosh 我认为您想以最扭曲的方式做一些完全简单的事情。就像取决于$* 的值(% 中的词干),如果它出现在 PROJECTS 中,则执行某些操作,否则不执行任何操作。对吗?
  • Jens,是的,这是我的要求。是否可以在不涉及 makefile 规则中的 shell 脚本语法的情况下做到这一点?
猜你喜欢
  • 2014-05-09
  • 2015-08-03
  • 2014-06-26
  • 1970-01-01
  • 2014-04-30
  • 2015-10-05
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多