编译时通过命令行传参到c文件-创新互联
编译入口命令用bash脚本实现。通过对bash命令的参数进行解析,获取传递的参数。
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、成都微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了文圣免费建站欢迎大家使用!
使用的是$0,$1,$2 通过命令行传递参数,$2就是我们需要传递到c文件的参数。
## $1 --- compile type
## $2 --- board name
## $3 --- cpu name
## $4 --- version type
## $5 --- OS type
bash获取的参数传递到make体系。通过在执行make命令时,添加参数时实现。
make $MAKE_OPTION "$1" BOARD_NAME_TMP="$2" CPU_NAME_TMP="$3" VERSION_TYPE_TMP=RELEASE OS_TYPE_TMP=LINUX
make体系中export供其他make使用。同时make 里调用了shell命令,用bash脚本编译其他模块。
cd ${SCP_SRC_DIR};${SCP_MAKE};cp ${SCP_BUILD_BIN} ${SCPBIN_DIR}/scp.bin
export SCP_MAKE=./build.sh -p zx8c -b scp_ramfw -r debug -m all -h $(_PHY_BOARD)
在build.sh中增加新的单板宏的传递。使用getopts获取上级调用传递来的参数。
while getopts ":p:b:r:m:h:" opt; do
case $opt in
p)
PRODUCT_NAME=$OPTARG
echo "the value of p is $OPTARG"
;;
b)
BOARD_NAME=$OPTARG
echo "the value of b is $OPTARG"
;;
r)
MODE=$OPTARG
echo "the value of r is $OPTARG"
;;
m)
COMPILE_MODE=$OPTARG
echo "the value of m is $OPTARG"
;;
h)
_PHY_BOARD=$OPTARG
echo "the value of h is $OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG"
;;
esac
bash脚本中调用cmake的地方,添加新的单板宏用来将该参数传递到cmake体系。
echo _PHY_BOARD:$_PHY_BOARD
cmake -DBOARD=$BOARD_NAME -D_PHY_BOARD=$_PHY_BOARD -DBOARD_PATH=$BOARD_PATH -DBOARD_FAMILY=arm -DBOARD_ARCH=arm
cmakeCMakeLists.txt中添加_PHY_BOARD变量,变接收从cmake调用中传递来的参数。
set(_PHY_BOARD ${_PHY_BOARD})
添加传递到C文件的宏定义
zephyr_compile_definitions(
-DBUILD_VERSION_MAJOR=CONFIG_SCP_BUILD_VERSION_MAJOR
-DBUILD_VERSION_MINOR=CONFIG_SCP_BUILD_VERSION_MINOR
-DBUILD_VERSION_PATCH=CONFIG_SCP_BUILD_VERSION_PATCH
-DBUILD_VERISON_STRING=CONFIG_SCP_BUILD_VERISON_STRING
-D_PHY_BOARD='${_PHY_BOARD}'
)
用到的技术- bash中命令参数的传递和获取
getopts传递参数
语法格式:getopts [option[:]] [DESCPRITION] VARIABLE
option:表示为某个脚本可以使用的选项
“:”:如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
VARIABLE:表示将某个选项保存在变量VARIABLE中
————————————————
版权声明:本文为博主「我心依依旧」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a200822146085/article/details/89300464
$0,$1,$2 通过命令行传递参数
采用$0,$1,$2…等方式获取脚本命令行传入的参数,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数
- 用到的基本的shell语法
if 条件
then
执行的命令1
else
执行的命令2
fi
case $变量名 in
"值1")
如果是变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值不是以上的值,则执行此程序
;;
esac
while语法:
while CONDITION; do
循环体
done
- makefile中的参数的传递和获取
make -f make/makefile "$1" _COMPILE_TARGET="$1" _PHY_BOARD=_BT_3G_"$2" _CPU_TYPE=_CPU_"$3" _BSP_VERSION_TYPE=_BSP_"$4" _OS_TYPE=_OS_"$5"
- cmake中参数的传递和获取
cmake 指向CMakeLists.txt所在的目录,例如cmake .. 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译。
cmake -Dweight=100
set(weight 100 CACHE INTERNAL "定义一个INTERNAL类型的缓存变量")
set(weight_two 0.3 CACHE INTERNAL "定义一个INTERNAL类型的缓存变量")
- c文件中获取make定义变量的方法
通过 gcc 的 -D 选项来满足这一需求,它等同于在 C 文件中通过 #define 语句定义一个宏
$(CC) -o $@ $^ -DDEBUG_PRINT
- 常用调试方法
#error 不能打印变量值
#error用于生成一个编译错误消息
#error error-message
Cmake打印变量信息message("FACE_INCLUDE_DIRS:" ${CODEC_INCLUDE_DIRS})
相关引用https://blog.csdn.net/a200822146085/article/details/89300464
https://blog.csdn.net/weixin_44359953/article/details/125503678
https://cmake.org/cmake/help/v3.11/command/set.html#set
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章名称:编译时通过命令行传参到c文件-创新互联
转载注明:http://pwwzsj.com/article/dioscs.html