闫刚 px4架构的cmake移植到linux上

px4架构的cmake移植到linux上

px4的cmake架构非常棒,今天我一不小心移植到自己的代码中,从而后期全部按照px4的cmake提供的模块接口px4_add_module进行添加子模块非常酷。

仓库地址:

$git clone http://www.github.com/yangang123/cpp_test.git
$git checkout develop

图一 PX4的源码cmake架构

图二 px4添加一个驱动模块的CMakeLists.txt文件

图三 openSTM的源码架构

图四 openSTM中添加子模块CMakeLists.txt文件

现在,在我们的软件工程中添加一个hello的模块,也是非常的方便

make openSTM-v1

我们输入make openSTM-v1,然后的执行的流程过程如下图所示

makefile 
  |
  v
CMakeLists.txt  -> cmake/configs/openSTM-v1.cmake -> cmake/common/px4_base.cmake 
    #调用出所有的子模块
    -> set(config_module_list)        
    
    #遍历所有的子模块
    -> foreach(module ${config_module_list}) 
   
    #添加子目录
    add_subdirectory(src/${module})

    #进入固件目录   
    -> add_subdirectory(src/firmware) -> add_executable(${FIRMWARE_NAME}) 

图五 openSTM编译

Makefie基础

1. call是Makefile的函数

define hello
echo hello
endf
all:
 $(call target)

2 .定义个函数

define 函数名(XXX)
函数体
endef
函数体中每行不需要加TAB键
函数体中可包含:命令 脚本 调用函数等
函数体中的 ( n ) 为 调 用 体 传 递 进 来 的 参 数 , (n)为调用体传递进来的参数, (n)(0)为函数本来, ( 1 ) 第 一 个 参 数 , (1) 第一个参数, (1)(2)第二个参数
若实在其他函数中调用的, ( n ) 来 自 这 个 函 数 传 递 的 ; 若 在 s h e l l 下 调 用 的 , (n)来自这个函数传递的;若在shell下调用的, (n)shell(n)来自于用户传递的。

3. makefile语法

在makefile中的命令使用@,表示不打印当前命令,否则执行当前命令之前,会把这条命令执行以下

@echo hello
hello
echo hello
echo hello
hello

下面,我讲一个makefile最复杂的地方,主要功能,管理build目录的功能

4 描述如何编译cmake

define cmake-build
@if [ $(PX4_CMAKE_GENERATOR) = "Ninja" ] && [ -e $(PWD)/build_$@/Makefile ]; then rm -rf $(PWD)/build_$@; fi
@if [ ! -e $(PWD)/build_$@/CMakeCache.txt ]; then mkdir -p $(PWD)/build_$@ && cd $(PWD)/build_$@ && cmake .. -G$(PX4_CMAKE_GENERATOR) -DCONFIG=$(1) || (cd .. && rm -rf $(PWD)/build_$@); fi
@$(PX4_MAKE) -C $(PWD)/build_$@ $(PX4_MAKE_ARGS) $(ARGS)
endef
# create empty targets to avoid msgs for targets passed to cmake
define cmake-targ
$(1):
    @#
.PHONY: $(1)
endef
openSTM-v1:
    $(call cmake-build,openSTM-v1)
all: openSTM-v1

分析第一行

第一行 @if [ $(PX4_CMAKE_GENERATOR) = “Ninja” ] && [ -e KaTeX parse error: Expected group after '_' at position 12: (PWD)/build_̲@/Makefile ]; then rm -rf KaTeX parse error: Expected group after '_' at position 12: (PWD)/build_̲@; fi

分解开后

if [ $(PX4_CMAKE_GENERATOR) = "Ninja" ] && [ -e $(PWD)/build_$@/Makefile ];
then rm -rf $(PWD)/build_$@;
fi

说明: 当判断系统有ninja构建,同时在build文件中makefile这个文件,就会执行删除当前build文件,这个操作的主要目的是如果源码没有个ninja构建会影响ninja构建,直接删除旧的build构建文件

分析第二行

第二行@if [ ! -e $(PWD)/build_$@/CMakeCache.txt ]; then mkdir -p $(PWD)/build_$@ && cd $(PWD)/build_$@ && cmake .. -G$(PX4_CMAKE_GENERATOR) -DCONFIG=$(1) || (cd .. && rm -rf $(PWD)/build_$@); fi

分解开后
if [ ! -e $(PWD)/build_$@/CMakeCache.txt ]; 
then mkdir -p $(PWD)/build_$@ && cd $(PWD)/build_$@ 
&& cmake .. -G$(PX4_CMAKE_GENERATOR) -DCONFIG=$(1) || (cd .. && rm -rf $(PWD)/build_$@)
;fi

说明: 如果在build中文件不存在cmakecache.txt文件, 那么就创建build文件,同时打开build,然后cmake …/去构建项目, -G是执行构建的的方式,-DCONFIG, 会自动把CONFIG作为变量进行传递到各个cmake文件中。
PX4_CMAKE_GENERATOR ?= “Ninja” PX4_CMAKE_GENERATOR ?= “MSYS Makefiles” PX4_CMAKE_GENERATOR ?= "Unix Makefiles”

技巧:

  1. 判断build中的Makefile判断是否ninja构建, 在ninja中构建的build目录,没有makefile文件build.ninja CMakeCache.txt CMakeFiles cmake_install.cmake rules.ninja src2. 判断CMakeCache.txt是否存在,判断是否构建软件build目录
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值