如何用单个OpenWrt软件包Makefile支持多版本?
当然可以实现!在OpenWrt生态里,我们有两种常用的方式,能让单个软件包Makefile支持多个版本的构建,刚好可以结合你给出的test1示例来讲解:
方案1:通过变量覆盖实现版本切换(适合编译时指定版本)
这种方式是把版本相关的参数做成可配置的默认值,编译时通过命令行变量来切换版本,非常适合开发或批量编译场景。
修改你的test1 Makefile如下:
PKG_NAME:=test1 PKG_RELEASE:=1 # 设置默认版本,编译时可以通过 PKG_VERSION=xxx 覆盖 PKG_VERSION?=1.2 # 对应不同版本的Git Commit Hash ifeq ($(PKG_VERSION),1.2) PKG_REV:=4f0c448faacfbcae185631ece73f196dc66851ca else ifeq ($(PKG_VERSION),2.0) # 替换成v2.0对应的commit hash PKG_REV:=abc123def456ghi789jkl012mno345pqr678stu901 endif PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REV).tar.gz PKG_SOURCE_URL:=ssh://git@<>:123456/<remote>/test1.git PKG_SOURCE_PROTO:=git PKG_SOURCE_VERSION:=$(PKG_REV) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) # 后续的编译、安装规则保持不变
使用方式:
- 编译默认的1.2版本:
make package/test1/compile - 编译2.0版本:
make package/test1/compile PKG_VERSION=2.0
方案2:创建Package Variants(适合用户在界面选择版本)
如果希望用户能在OpenWrt的LuCI或menuconfig里直接选择安装哪个版本,可以在同一个Makefile里定义多个独立的包条目(变种),每个变种对应一个软件版本,安装后不会互相冲突。
示例代码如下:
PKG_NAME:=test1 PKG_RELEASE:=1 # 定义不同版本的参数 TEST1_V1_VERSION:=1.2 TEST1_V1_REV:=4f0c448faacfbcae185631ece73f196dc66851ca TEST1_V2_VERSION:=2.0 TEST1_V2_REV:=abc123def456ghi789jkl012mno345pqr678stu901 # 通用编译模板,避免重复写相同的编译逻辑 define Build/CompileTemplate $(MAKE) -C $(PKG_BUILD_DIR) \ $(TARGET_CONFIGURE_OPTS) \ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \ LDFLAGS="$(TARGET_LDFLAGS)" endef # ========== 版本1.2的包定义 ========== define Package/test1 SECTION:=utils CATEGORY:=Utilities TITLE:=Test1 (v1.2) URL:=your-project-url endef define Package/test1/description 稳定版测试工具,版本1.2 endef define Build/Prepare/test1 mkdir -p $(BUILD_DIR)/$(PKG_NAME)-$(TEST1_V1_VERSION) $(PKG_UNPACK) $(Build/Patch) endef define Package/test1/install $(INSTALL_DIR) $(1)/usr/bin # 安装时指定不同的二进制文件名,避免冲突 $(INSTALL_BIN) $(PKG_BUILD_DIR)/test1 $(1)/usr/bin/test1-v1 endef # ========== 版本2.0的包定义 ========== define Package/test1-latest SECTION:=utils CATEGORY:=Utilities TITLE:=Test1 (v2.0, Latest) URL:=your-project-url endef define Package/test1-latest/description 最新版测试工具,版本2.0 endef define Build/Prepare/test1-latest mkdir -p $(BUILD_DIR)/$(PKG_NAME)-$(TEST1_V2_VERSION) $(PKG_UNPACK) $(Build/Patch) endef define Package/test1-latest/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/test1 $(1)/usr/bin/test1-v2 endef # 注册两个包到OpenWrt构建系统 $(eval $(call BuildPackage,test1)) $(eval $(call BuildPackage,test1-latest))
优势:
- 用户在
make menuconfig里能看到两个独立的包选项,自由选择安装 - 两个版本的二进制文件命名不同(
test1-v1和test1-v2),不会覆盖冲突
额外注意事项
- 如果不同版本需要不同的补丁,可以在
Build/Prepare阶段为每个版本指定单独的补丁目录,比如$(Build/Patch)/test1-v1 - 确保每个版本对应的
PKG_REV是有效的Git commit hash,避免拉取代码失败 - 如果版本差异极大,可以把不同版本的构建逻辑拆分到单独的
.inc文件中,再在主Makefile里include,保持代码整洁
内容的提问来源于stack exchange,提问作者tomereli
相关产品推荐
相关产品推荐

