资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

编译时通过命令行传参到c文件-创新互联

实现过程
  1. 编译入口命令用bash脚本实现。通过对bash命令的参数进行解析,获取传递的参数。

    网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、成都微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了文圣免费建站欢迎大家使用!

使用的是$0,$1,$2 通过命令行传递参数,$2就是我们需要传递到c文件的参数。

## $1 --- compile type
## $2 --- board name
## $3 --- cpu name
## $4 --- version type
## $5 --- OS type
  1. bash获取的参数传递到make体系。通过在执行make命令时,添加参数时实现。

make $MAKE_OPTION "$1" BOARD_NAME_TMP="$2" CPU_NAME_TMP="$3" VERSION_TYPE_TMP=RELEASE OS_TYPE_TMP=LINUX
  1. 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)
  1. 在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
  1. 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
  1. cmakeCMakeLists.txt中添加_PHY_BOARD变量,变接收从cmake调用中传递来的参数。

set(_PHY_BOARD ${_PHY_BOARD})
  1. 添加传递到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://cdkjz.cn/article/dioscs.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220