shell - 在 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
我的语法有什么问题吗?或者你能建议我用其他方法来实现我的要求吗?
解决方案
至少这里是可疑的:你需要在value=i
and之后使用分号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
推荐阅读
- amazon-web-services - 从 EC2 迁移到 Elastic Beanstalk
- heroku - 如何免费托管大型网站?
- c# - 将桌面应用程序的数据库与另一台计算机上的数据库连接起来
- selenium-chromedriver - 如何在 Selenium Appium C# 中使用 headless
- html - 使用CSS网格布局,如何移动外壳密码旁边的“复选框”?
- javascript - 如何在 react-native 中渲染 json 数据
- python - 地理数据框中所有线串(约 100 万)的凸壳
- vue.js - 处理内部组件中的嵌套对象变量未定义错误 - vuejs
- rust - 无法在已实现的方法中序列化结构,因为“特性 `serde::Serialize` 没有为 `Self` 实现”
- c++ - 在大数据的情况下,std::sort 是否会混淆数据