Makefile 的预定义项
可定义项 | 说明 | 必备 |
---|---|---|
PKG_* | 预设变量 | 部分必备 |
Package/conffiles | 软件包安装的配置文件全路径,每行一个。 比如:/etc/abc.conf | 可选 |
Package/description | Package/description | 必备 |
Build/Prepare | 编译前对代码的预处理操作 | 可选 |
Build/Configure | configure 步骤,一般默认即可 | 可选 |
Build/Compile | 代码编译步骤,一般使用默认即可 | 可选 |
Build/Install | 在编译完成后进行安装时的处理,如果不填写则自动执行make install | 可选 |
Build/InstallDev | 需要编译完成后的库或头文件,但是又不在目标设备上使用 | 可选 |
Build/Clean | 清理步骤 | 可选 |
Package/install | 软件包安装操作 | 必备 |
Package/preinst | 软件包安装之前处理的脚本 必须包含脚本头信息 #!/bin/sh 如果中断安装 , 在脚本中有 return false 即可实现 | 可选 |
Package/postinst | 软件包安装之后处理的脚本 必须包含脚本头信息 #!/bin/sh | 可选 |
Package/prerm | 软件包卸载之前处理的脚本 必须包含脚本头信息 #!/bin/sh 如果中断卸载 , 在脚本中有 return false 即可实现 | 可选 |
Package/postrm | 软件包卸载之后处理的脚本 必须包含脚本头信息 #!/bin/sh | 可选 |
Package/config | Config.in 定义,如果软件包支持一些CONFIG_* 选项,可以在此定义 | 可选 |
PKG_* 变量
变量名 | 说明 |
---|---|
PKG_NAME | 软件包的名称,在菜单选项中将看见,必须与目录名称一致。避免在包名中使用下划线,以避免构建失败 |
PKG_VERSION | 软件包版本,如果软件包的源代码是在线下载的,版本号要与服务器上的一致 |
PKG_RELEASE | 此包Makefile的版本。最初应设置为1,当 PKG_VERSION发生变化时,应重置为1。当 PKG_VERSION保持不变,但对已安装的工件进行功能更改时,递增它 |
PKG_BUILD_DIR | 软件包的编译过程目录名字。默认值$(PKG_NAME)-$(PKG_VERSION) 一般不用配置 |
PKG_SOURCE | 软件包源代码文件的名字 |
PKG_SOURCE_URL | 软件包源代码的下载地址,如果不填写就不下载 , 直接从 dl/ 下查找 |
PKG_MD5SUM | 对下载下来的软件包的Md5校验值 |
PKG_HASH | 对下载下来的软件包的 hash256 校验值 |
PKG_CAT | 指定使用哪个解压工具(zcat、bzcat、unzip) |
PKG_BUILD_DEPENDS | 需要在此包之前构建的包。指定目录名即可。语法与 DEPENDS 相同 |
PKG_CONFIG_DEPENDS | 指定哪些配置选项会影响构建配置,并应在更改时触发Build/Configure的重新配置 |
PKG_INSTALL | 将其设置为“1”将调用包的原始“make install”,前缀设置为 PKG_INSTALL_DIR |
PKG_INSTALL_DIR | 软件的安装目录,默认是$(PKG_BUILD_DIR)/ipkg-install |
PKG_SOURCE_PROTO | 通过代码仓库获得代码 git、svn bzr cvs darcs hg |
PKG_SOURCE_VERSION | commit hash or SVN revision to check out |
MAKE_PATH | OpenWRT的构建系统将尝在 PKG_BUILD_DIR 中运行make,但是有的包在PKG_BUILD_DIR没有Makefile,可以用此变量来支持执行 make 的目录 |
Package/ 软件包描述
选项 | 描述 | 必备 |
---|---|---|
SECTION | 软件包的分类,暂时没有作用 | 是 |
CATEGORY | 软件包所属的菜单选项中的菜单,值既可以是已经有的分类,也可以是自己的一个新分类。已经有的分类可以参考同类别软件包的 CATEGORY 写法 | 是 |
SUBMENU | 二级菜单名,会显示在CATEGORY的下一级 | 否 |
TITLE | 软件包显示的名称 | 是 |
URL | 软件包来源公司网站 | 否 |
MAINTAINER | 软件包的维护者信息 | 否 |
DEPENDS | 编译时依赖。软件包依赖哪些软件包 | 否 |
EXTRA_DEPENDS | 运行时依赖 | 否 |
USERID | 软件包安装的时候生成账号和组。 值格式为:账号 / 组 | 否 |
PKGARCH | 将其设置为“all”以生成一个包含“Architecture:all”的包。默认情况下,包是为目标体系结构构建的,生成的ipk文件也是这样标记的。但是如果一个包只包含脚本或资源,用PKGARCH:=all标记它将生成一个可以安装在任何目标体系结构上的ipk文件 | 否 |
DEPENDS
DEPENDS:=libpcap | 当 libpcap 被选中时,你的包才能在 menuconfig 中显示并配置 |
DEPENDS:=+libpcap | 当你选中你的包时,libpcap 也会被选中 |
DEPENDS:=@USB_SUPPORT | 你的包依赖 CONFIG_USB_SUPPORT 选项,只有CONFIG_USB_SUPPORT 选项被选中时你的包才会在 menuconfig 中显示并配置 |
DEPENDS:=+PACKAGE_arpd:libpcap | 如果配置了选项CONFIG_PACKAGE_arpd,则当前软件包会依赖 libpcap,当前软件包被选上时,软件包libpcap也将自动被选上 |
DEPENDS:=+@KERNEL_DEBUG_FS | 当前软件包被选中时,选项KERNEL_DEBUG_FS也会被选中 |
DEPENDS:=@PACKAGE_arpd:libpcap | 如果配置了选项CONFIG_PACKAGE_arpd,则当前软件包会依赖 libpcap。当libpcap未被选中时,当前软件包不可见。 |
PKG_BUILD_DEPENDS
如果你的包需要宿主工具才能为目标机器构建,这些应该放在 PKG_BUILD_DEPENDS
中,并以 /host
结束。例如, json-glib
包需要Meson构建系统来生成构建文件,以及主机上的Glib2
PKG_BUILD_DEPENDS:=glib2/host meson/host
HOST_BUILD_DEPENDS
包本身可能提供宿主工具,而构建或使用这些工具可能需要先构建其他宿主工具。其他工具则放在 HOST_BUILD_DEPENDS
中。例如,Meson包提供的主机工具需要另一个构建工具Ninja
HOST_BUILD_DEPENDS:=ninja/host
预设变量
CONFIGURE_ARGS
这个变量在执行 ./configure 配置脚本时,用于选择要附加什么参数,格式如下
CONFIGURE_ARGS += \
--libdir=/usr/lib/lighttpd \
--sysconfdir=/etc/lighttpd \
--enable-shared \
--enable-static \
--disable-rpath \
--without-attr \
--without-bzip2
CONFIGURE_VARS += \
ac_cv_file__proc_stat=yes \
ac_cv_file__proc_meminfo=yes \
ac_cv_func_malloc_0_nonnull=yes \
ac_cv_func_realloc_0_nonnull=yes
MAKE_FLAGS
这个变量用于定义系统默认执行 make 的时候,附加的参数有哪些,格式如下
MAKE_FLAGS += \
CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
LDFLAGS="$(TARGET_LDFLAGS) $(LIBS)"
Makefile demo
include $(TOPDIR)/rules.mk
PKG_NAME:=helloworld
PKG_VERSION:=1.0
PKG_RELEASE:=1
# PKG_* 变量需要在此之前定义
include $(INCLUDE_DIR)/package.mk
# 软件包定义;说明我们的软件包将如何以及在哪里出现在 make menuconfig 中
define Package/helloworld
SECTION:=examples
CATEGORY:=Examples
TITLE:=Hello, World!
endef
# 包描述;关于我们的包做什么的更详细的描述
define Package/helloworld/description
A simple "Hello, world!" -application.
endef
# 定义如何安装我们的软件
define Package/helloworld/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/bin
endef
# 这个命令总是在最后
$(eval $(call BuildPackage,helloworld))