1.为什么要使用cmake
此前,笔者的公司之前linux下的工程,很多是使用scons工具进行编译,其优点是编译脚本是使用python编写语法简单,缺点也很多,一是无法像make一样多线程编译(笔者未找到相应方法,如果有,请赐教),二是像无法添加到openwrt工程中;使用cmake的好处很多,其CMakeLists.txt文件编写也很简单,支持make -j多线程编译,也可以将自己的工程添加到openwrt中,对笔者来说,QtCreator也支持cmake,更是方便。
2.在openwrt的menuconfig中添加自有工程
首先,要在openwrt的目录下创建你的工程的目录,如:
mkdir -p package/my_company/my_project
并在此目录下,创建Makefile文件,及src目录和files目录。 其中Makefile文件的内容如下:
include $(TOPDIR)/rules.mk
PKG_NAME:=my_project
PKG_VERSION:=2016-11-22
PKG_RELEASE=1
PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=
PKG_MAINTAINER:=cairui <cairui1989@foxmail.com>
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk #如果使用cmake,则必须增加此行
define Package/my_project
SECTION:=net
CATEGORY:=my_company
DEPENDS:=+kmod-tun +libpthread +librt +libubox +libuci +libstdcpp #添加所需的依赖库,不添加,则会编译报错
TITLE:=orayboxvpn from makefile
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Package/orayboxvpn/description
my_project by cairui from cmake in 20161122
endef
define Package/orayboxvpn/install
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) $(PKG_BUILD_DIR)/my_projext $(1)/sbin/
$(INSTALL_BIN) ./files/config/* $(1)/etc/my_projext
endef
$(eval $(call BuildPackage,my_project))
根据上述的Makefile文件可看出,src目录下放入源代码及CMakeLists文件,files目录下放入配置文件等。 需要注意的是,由于我们 的工程使用cmake来编译,所以需要include $(INCLUDE_DIR)/cmake.mk,此时menuconfig会将src目录下的CMakeLists.txt文件拷贝到build_dir/targetxxxx/my_project目录下,切自动执行cmake命令,生成Makefile文件。
3.CMakeLists.txt文件需要注意的地方
CMakeLists.txt文件我们之前在用来交叉编译的时候,会set(CMAKE_C_COMPILER ...)来指定交叉编译工具,然而在这里,并不需要指定,因为查看openwrt中的include/cmake.mk文件中可以发现,在openwrt中make的时候,cmake会传入交叉编译工具的路径,即openwrt编译出来的gcc的路径,且还会传入一些其他的宏,具体可查看cmake.mk文件。
4.编译自己的工程
当完成了上述的操作之后,便可以很方便的编译自己的工程了,使用make package/my_company/my_project/compile V=s命令,就可以编译出,且会在bin/里生成相应的ipk文件。 make的时候,会发现,openwrt首先会编译依赖的选项,然后再编译my_project,所以非常的方便。