You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:20:19