首页 > 解决方案 > 在 GNUmakefile 中运行 shell 命令

问题描述

我需要根据用户输入运行目标。目前在我们的 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)变量在运行时具有用户给定的项目。我usb在运行makefile时给出了。所以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

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

标签: shellmakefilegnu-make

解决方案


至少这里是可疑的:你需要在value=iand之后使用分号done;加上一个fi终止if. 然后

str = $*

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

FOO=bar echo "$FOO"

不会回显条,而

FOO=bar; echo "$FOO"

将要。接下来,value=i应该是value=$$i并且*$value*应该是*$$value*,否则当你指的是一个shellmake变量时,你会认为你引用了一个make变量。

除此之外,您的构建看起来太复杂了。是时候将构建重构为更简单了。需要用户输入的构建是可憎的(不能从 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

推荐阅读