在GNUmakefile中运行shell命令

时间:2020-04-20 06:52:49

标签: shell makefile gnu-make

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

我的目录结构类似于:-

/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

我的语法有问题吗?还是可以请我以其他方式满足我的要求?

1 个答案:

答案 0 :(得分:0)

至少这里是可疑的:您需要在value=idone之后加上分号;加上fi以终止if。然后

str = $*

失败,因为外壳变量分配中不能有空格。我建议改用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