openwrt规则编译cmake软件包

软件包中有完整CMakelists.txt

include (TOPDIR)/rules.mk

PKG_NAME:=usrsctp
PKG_VERSION:=0.9.5.0
PKG_RELEASE:=3

PKG_SOURCE:=(PKG_NAME)-(PKG_VERSION).tar.gz
PKG_SOURCE_URL:= https://codeload.github.com/sctplab/usrsctp/tar.gz/v(PKG_VERSION)?
PKG_HASH:=260107caf318650a57a8caa593550e39bca6943e93f970c80d6c17e59d62cd92

PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE

PKG_BUILD_PARALLEL:=1

include (INCLUDE_DIR)/package.mk
include(INCLUDE_DIR)/cmake.mk

define Package/usrsctp
  SECTION:=libs
  CATEGORY:=Libraries
  TITLE:=sctp stack
  URL:=https://github.com/sctplab/usrsctp
endef

define Package/cJSON/description
  this is a userland SCTP stack
endef

CMAKE_OPTIONS += -DBUILD_SHARED_LIBS=on

#Provide compilation dependencies for other modules to call
define Build/InstallDev
    (INSTALL_DIR)(1)/usr/include
    (CP)(PKG_INSTALL_DIR)/usr/include/usrsctp.h (1)/usr/include(INSTALL_DIR) (1)/usr/lib(CP) (PKG_INSTALL_DIR)/usr/lib/libusrsctp.so*(1)/usr/lib/
    (INSTALL_DIR)(1)/usr/lib/pkgconfig
    (CP)(PKG_INSTALL_DIR)/usr/lib/pkgconfig/usrsctp.pc (1)/usr/lib/pkgconfig(SED) 's,/usr,(STAGING_DIR)/usr,g'(1)/usr/lib/pkgconfig/usrsctp.pc
endef

#Installed to the root file system for call at runtime
define Package/usrsctp/install
    (INSTALL_DIR)(1)/usr/lib
    (CP)(PKG_INSTALL_DIR)/usr/lib/libusrsctp.so* (1)/usr/lib/
endef(eval $(call BuildPackage,usrsctp))

如上是示例,这种类型比较简单,包含了cmake.mk后,openwrt会自动生成编译,只需要安装需要被其他代码依赖的库和头文件,以及运行时需要的库即可。

软件包中有完整CMakelists.txt但需要创建build目录

include (TOPDIR)/rules.mk

PKG_NAME:=libsrtp
PKG_VERSION:=2.6.0
PKG_RELEASE:=3

PKG_SOURCE:=(PKG_NAME)-(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/cisco/libsrtp/tar.gz/v(PKG_VERSION)?
PKG_HASH:=bf641aa654861be10570bfc137d1441283822418e9757dc71ebb69a6cf84ea6b

PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE

PKG_BUILD_PARALLEL:=1

include (INCLUDE_DIR)/package.mk
include(INCLUDE_DIR)/cmake.mk

define Package/libsrtp
  SECTION:=libs
  CATEGORY:=Libraries
  TITLE:=libsrtp Client Library
  URL:=https://github.com/cisco/libsrtp
endef

define Package/libsrtp/description
  srtp Library
endef

CMAKE_BINARY_SUBDIR=build

CMAKE_OPTIONS += -DBUILD_SHARED_LIBS=on -DTEST_APPS=off

define Build/InstallDev
    (INSTALL_DIR)(1)/usr/include/srtp2
    (CP)(PKG_INSTALL_DIR)/usr/include/srtp2/*.h (1)/usr/include/srtp2(INSTALL_DIR) (1)/usr/lib(CP) (PKG_INSTALL_DIR)/usr/lib/lib*.so*(1)/usr/lib/
endef

define Package/libsrtp/install
    (INSTALL_DIR)(1)/usr/lib
    (CP)(PKG_INSTALL_DIR)/usr/lib/lib*.so* (1)/usr/lib/
endef(eval $(call BuildPackage,libsrtp))

这种相对前面的方式类似,只是这种软件包CMakelist.text要求需要创建build目录进行编译,因此在Makefile中添加CMAKE_BINARY_SUBDIR=build进行声明。因此在编译输出目录,可以看到openwrt会先创建build目录,而第一种方式是没有创建build目录。

软件包中只有部分CMakelist.text

这种方式就是软件包中没有提供完整的CMakelist.txt,但是提供了部分,需要用户包含提供部分的Cmakelist.txt实现,这种方式目前是通过打patches的方式生成主要CMakelist.txt。

Makefile文件

include (TOPDIR)/rules.mk

PKG_NAME:=coreMQTT
PKG_VERSION:=2.3.1
PKG_RELEASE:=3

PKG_SOURCE:=(PKG_NAME)-(PKG_VERSION).tar.gz
PKG_SOURCE_URL:= https://codeload.github.com/FreeRTOS/coreMQTT/tar.gz/v(PKG_VERSION)?
PKG_HASH:=b8e95044e6ef8381610949b7fe546c5ddf4e52989ce9938209d5dd5f3371b5d7

PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE

PKG_BUILD_PARALLEL:=1

include (INCLUDE_DIR)/package.mk
include(INCLUDE_DIR)/cmake.mk

define Package/coreMQTT
  SECTION:=libs
  CATEGORY:=Libraries
  TITLE:=coreMQTT Client Library
  URL:=https://github.com/FreeRTOS/coreMQTT
endef

define Package/coreMQTT/description
  coreMQTT Client Library
endef

define Build/InstallDev
    (INSTALL_DIR)(1)/usr/include
    (CP)(PKG_INSTALL_DIR)/*.h (1)/usr/include(CP) (PKG_INSTALL_DIR)/include/*.h(1)/usr/include
    (INSTALL_DIR)(1)/usr/lib
    (CP)(PKG_INSTALL_DIR)/usr/lib/lib*.so* (1)/usr/lib/
endef

define Package/coreMQTT/install(INSTALL_DIR) (1)/usr/lib(CP) (PKG_INSTALL_DIR)/usr/lib/libcoreMQTT.so*(1)/usr/lib/
endef

(eval(call BuildPackage,coreMQTT))

patches

diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..754a6a2
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,24 @@
+cmake_minimum_required(VERSION 3.10)
+
+project(CoreMQTT)
+
+include({CMAKE_CURRENT_LIST_DIR}/mqttFilePaths.cmake)
+
+add_definitions("-DMQTT_DO_NOT_USE_CUSTOM_CONFIG")
+
+include_directories (
+{MQTT_INCLUDE_PUBLIC_DIRS}
+)
+
+add_library(coreMQTT SHARED {MQTT_SOURCES}{MQTT_SERIALIZER_SOURCES})
+
+install(TARGETS coreMQTT
+    LIBRARY DESTINATION {CMAKE_INSTALL_LIBDIR}
+    ARCHIVE DESTINATION{CMAKE_INSTALL_LIBDIR}
+    RUNTIME DESTINATION {CMAKE_INSTALL_BINDIR}
+)
+
+install(DIRECTORY{MQTT_INCLUDE_PUBLIC_DIRS}/
+       DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/
+    FILES_MATCHING PATTERN "*.h"
+)
--
2.25.1

以上是通过打patches生成主CMakelist.txt,可以看到包含了mqttFilePaths.cmake文件。