编译时通过命令行传参到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中
————————————————
版权声明:本文为CSDN博主「我心依依旧」的原创文章,遵循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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值