我需要根据用户输入来运行目标。当前在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
我的语法有问题吗?还是可以请我以其他方式满足我的要求?
答案 0 :(得分:0)
至少这里是可疑的:您需要在value=i
和done
之后加上分号;加上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