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文件。