OpenWrt自定义包非依赖场景下Makefile变量共享求助
我之前在做OpenWrt自定义包的时候也碰到过一模一样的需求——非编译依赖的包控制其他包的编译变量,直接改rules.mk确实没用,因为OpenWrt的build系统是靠配置驱动的,得用config选项来联动。给你一套完整的可落地的实现示例:
实现步骤与示例
1. 配置包B的选项与变量触发
首先在包B的Config.in文件里定义配置选项,同时关联我们需要的全局变量:
# package/B/Config.in config PACKAGE_B bool "Package B (controls variable1 for other packages)" help Enable this option to set custom compilation flags for Package A and other dependent packages. # 定义全局变量,根据PACKAGE_B的选择动态赋值 config VARIABLE1_FLAGS string default "-Dxyz -Dabc" if PACKAGE_B default "" # 未选中Package B时,变量为空
注意:要把这个Config.in加入到OpenWrt的全局配置树中,如果是自定义feed,就在feed根目录的Config.in里添加:
source "package/B/Config.in"
如果是主源码中的包,就在package/Config.in里添加上述行。
2. 配置包B的Makefile(可选:无实际编译内容)
如果包B只是用来控制变量,不需要编译任何二进制文件,它的Makefile可以简化成这样(只处理配置逻辑,无实际构建):
# package/B/Makefile include $(TOPDIR)/rules.mk PKG_NAME:=B PKG_VERSION:=1.0.0 PKG_RELEASE:=1 include $(INCLUDE_DIR)/package.mk define Package/B SECTION:=utils CATEGORY:=Utilities TITLE:=Variable Control Package B DESCRIPTION:=Only controls global compilation flags, no actual binaries installed endef # 空编译步骤:不需要生成任何文件 define Build/Compile endef # 空安装步骤:不需要安装任何文件 define Package/B/install endef $(eval $(call BuildPackage,B))
3. 在包A的Makefile中使用变量
OpenWrt会自动把config选项转换为CONFIG_xxx格式的Makefile全局变量,包A可以直接读取CONFIG_VARIABLE1_FLAGS。根据包A的构建方式,有两种用法:
情况1:包A是原生Makefile构建的项目
# package/A/Makefile include $(TOPDIR)/rules.mk # ... 其他常规定义(PKG_NAME、VERSION等) ... define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CFLAGS="$(TARGET_CFLAGS) $(CONFIG_VARIABLE1_FLAGS)" \ LDFLAGS="$(TARGET_LDFLAGS)" \ $(MAKE_FLAGS) endef # ... 其他规则(Package/install等) ... $(eval $(call BuildPackage,A))
情况2:包A是Autotools(configure)构建的项目
# package/A/Makefile include $(TOPDIR)/rules.mk # ... 其他常规定义 ... CONFIGURE_ARGS += \ --enable-your-feature \ $(CONFIG_VARIABLE1_FLAGS) # 直接将动态flags传递给configure脚本 # ... 其他规则 ... $(eval $(call BuildPackage,A))
为什么之前rules.mk的设置没生效?
直接在rules.mk里硬设variable1=的问题在于:
- rules.mk的变量是全局默认值,无法根据配置选项(比如PACKAGE_B的选中状态)动态修改
- 包的Makefile中定义的变量优先级高于rules.mk,很容易被覆盖
- OpenWrt的build系统核心是配置驱动,所有动态变量必须通过config系统生成的
auto.conf传递,才能被所有包正确读取
内容的提问来源于stack exchange,提问作者mqm
相关产品推荐
相关产品推荐

