
Termux-Tools源码构建实战Autoconf构建体系与TERMUX_PREFIX变量替换机制完整解析【免费下载链接】termux-toolsScripts and small programs that are packaged into termuxs termux-tools package项目地址: https://gitcode.com/gh_mirrors/te/termux-toolsTermux-Tools 是 Android 终端 Termux 的核心工具包本文以源码构建为主线完整解析它的 Autoconf 构建体系与 TERMUX_PREFIX 变量替换机制从 configure.ac 中的变量定义到 Makefile 里一行 sed 完成模板变成品的全过程最终手把手带你跑通 autoconf → configure → make 三步构建。一、 5分钟认识 Termux-Tools它负责 Termux 的哪些基础零件Termux-Tools 本身不是一个大型程序而是一组脚本 小型 C 程序 配置文件的集合打包成termux-tools后安装到 Termux 的 usr 前缀目录中。它负责的内容包括类别内容所在位置常用脚本chsh、pkg、su、termux-info、termux-setup-storage等 19 个scripts/系统包装器df、top、ping、logcat等/system/bin工具的包装脚本scripts/Makefile.am登录环境登录脚本login、欢迎语 motd、属性初始化脚本motds/镜像源按大洲划分的软件源配置中国大陆、亚洲、欧洲等mirrors/文档与配置man 手册页、termux.properties示例doc/C 小程序cmd命令转发工具src/cmd.c理解了这一点就能明白为什么它的构建体系是Autoconf 而非 CMake大部分产物其实是文本文件构建的核心工作是变量替换而不是编译。二、⚙️ Autoconf 构建体系全景configure.ac 里的 7 个关键变量2.1 项目目录结构五个子目录各司其职根目录 Makefile.am 声明了子目录构建顺序SUBDIRS . scripts doc mirrors motds src每个子目录都有自己的Makefile.am如 scripts/Makefile.am、motds/Makefile.am由 configure.ac 第 97-98 行的AC_CONFIG_FILES统一驱动生成对应的 MakefileAC_CONFIG_FILES([Makefile scripts/Makefile doc/Makefile mirrors/Makefile motds/Makefile src/Makefile])2.2 configure.ac 如何定义变量并允许覆盖configure.ac 是整个构建体系的总开关它做三件事① 声明项目身份AC_INIT([termux-tools], [1.48.0])同时AC_PREREQ([2.69])要求 autoconf 版本不低于 2.69。② 定义 7 个核心变量且全部支持环境变量覆盖。这是它最精妙的设计——每个变量都优先读取构建环境提供的值读不到才用默认值占位符内部变量默认值以 com.termux 为例可覆盖环境变量TERMUX_PREFIXtermux_prefix$base_dir/usrTERMUX_PREFIXTERMUX_APP_PACKAGEtermux_app_packagecom.termuxTERMUX_APP_PACKAGETERMUX_BASE_DIRtermux_base_dir/data/data/com.termux/filesTERMUX_BASE_DIRTERMUX_CACHE_DIRtermux_cache_dir/data/data/com.termux/cacheTERMUX_CACHE_DIRTERMUX_HOMEtermux_android_home/data/data/com.termux/files/homeTERMUX_ANDROID_HOMEPACKAGE_VERSIONPACKAGE_VERSION1.48.0AC_INIT 自动提供—TERMUX_PACKAGE_FORMATtermux_package_formatdebianTERMUX_PACKAGE_FORMATTERMUX_PACKAGE_MANAGERtermux_package_manageraptTERMUX_PACKAGE_MANAGER③ 双通道导出变量AC_SUBST—— 把变量注入所有 Makefile供 shell 模板替换使用AC_DEFINE_UNQUOTED—— 写入config.h供 src/cmd.c 这类 C 程序在编译期引用配合AM_CFLAGS -Wall -Wextra -pedantic严格编译见 src/Makefile.am。 为什么默认值指向/data/data/com.termux/files因为 Android 的 SELinux 策略只允许应用在私有目录下运行程序这个路径正是 Termux 的前缀prefix所在。而 Termux 官方交叉编译时会通过环境变量传入真实值同一套源码即可复用于任意第三方 fork如 com.termux.x11。三、 TERMUX_PREFIX 变量替换机制一行 sed 完成模板变成品3.1 do_subst8 个占位符的替换规则所有.in结尾的文件都是模板。以 scripts/Makefile.am 为例它定义了替换命令do_subst sed -e s%[]TERMUX_PREFIX[]%$(termux_prefix)%g \ -e s%[]TERMUX_APP_PACKAGE[]%${termux_app_package}%g \ -e s%[]TERMUX_BASE_DIR[]%${termux_base_dir}%g \ ...共 8 条规则注意 sed 里用的是[]转义方括号——因为 Autoconf 的AC_CONFIG_FILES只处理Makefile.in这类文件而脚本模板刻意绕过Autoconf 自身的VAR替换通道改用 Makefile 中的 sed 二次替换。这样占位符可以在make阶段按最终确定的值替换且模板文件可以任意多规则却只写一处。然后配合两条规则宏批量生成 30 个工具define tool-rule # 脚本类sed 替换 加执行权限 $1: $1.in Makefile $(do_subst) $(srcdir)/$1.in $1 chmod ux $1 endef3.2 两个典型模板替换前后对比示例 1动态欢迎语motds/motd.sh.in 第一行替换前: #!TERMUX_PREFIX/bin/bash 替换后: #!/data/data/com.termux/files/usr/bin/bash示例 2登录脚本scripts/login.in 中脚本通过TERMUX_PREFIX/etc/motd读取欢迎语、通过TERMUX_PACKAGE_FORMAT区分 apt/pacman 体系——构建完成后脚本里已经没有任何占位符拿起来就能跑。示例 3信息收集工具scripts/termux-info.in 同时用到三个变量TERMUX_PREFIX/etc/apt定位仓库配置、PACKAGE_VERSION打印版本1.48.0、TERMUX_APP_PACKAGE正则转义后匹配插件包。机制总结configure.ac定值 →AC_SUBST进 Makefile →do_subst的 sed 规则在make时把.in模板渲染成成品文件。这就是 Termux-Tools 变量替换机制的全部秘密。四、 Termux-Tools 源码构建三步走autoconf → configure → make4.1 第1步生成 configure 脚本configure.ac 头部注释明确提示了重建方式。获取源码后git clone https://gitcode.com/gh_mirrors/te/termux-tools cd termux-tools autoconf # 由 configure.ac 生成可执行的 configure 脚本4.2 第2步运行 configure可自定义前缀# 默认构建前缀为 /data/data/com.termux/files/usr ./configure # 自定义前缀所有 TERMUX_PREFIX 将被替换为你指定的路径 TERMUX_PREFIX/opt/termux ./configure这一步会把 7 个变量写进各目录的 Makefile 中是变量替换链条的第二环。4.3 第3步make 编译与 make install 安装make # sed 渲染全部 .in 模板 编译 cmd 程序 make install # 按下面这张表安装到目标前缀make期间终端会连续打印Creating termux-info、Creating motd.sh等提示——每打印一次就是一次 sed 替换落盘。五、 构建产物去哪了make install 安装路径速查表构建产物安装目标$prefix 前缀目录chsh、pkg、su、termux-*等 19 个脚本$prefix/bin/df、top、ping等系统包装器 动态生成的 motd$prefix/bin/、$prefix/etc/termux-open额外软链$prefix/bin/xdg-opentermux-login.sh$prefix/etc/init-termux-properties.sh$prefix/etc/profile.d/见 init-termux-properties.sh.intermux.properties 示例$prefix/share/examples/termux/termux.1man 页pandoc 从 doc/termux.1.md.in 转换man 目录全部镜像源配置$prefix/etc/termux/mirrors/按大洲分目录另外两个值得注意的构建行为镜像源清理机制mirrors/Makefile.am 中维护了一份pkgdata_MIRRORS_REMOVED失效镜像清单make install时会顺带从目标系统删除这些旧配置防止pkg选中已下线镜像Debian 包控制文件根 Makefile.am 的create-deb-control-files目标自动生成conffiles与preinst标记哪些文件属于用户可修改的配置供打包器使用。六、️ 构建排错清单4 个高频问题速查症状原因解决方案configure.ac: error: Autoconf version 2.69 or higher is requiredautoconf 版本低于 2.69升级 autoconf 到 2.69./configure: No such file or directory源码包未附带 configure 脚本先执行autoconf生成生成的脚本里仍残留TERMUX_PREFIX字样Makefile 未被 configure 重新生成旧 Makefile 干扰删除各目录 Makefile 后重跑./configure makemake install报权限错误默认装到系统目录加DESTDIR/tmp/test ./install先装到临时目录验证七、️ 核心文件地图从源码到成品的完整链路最后用一张文件导航收束全文方便你按图索骥构建总配置configure.ac —— 变量定义、AC_SUBST、AC_CONFIG_FILES 都在这里根构建规则Makefile.am —— SUBDIRS 顺序、sed-rule 宏、deb 控制文件脚本渲染规则scripts/Makefile.am —— tool-rule 与 wrapper-rule 双规则宏替换机制模板示例scripts/chsh.in、scripts/login.inC 程序消费 config.h 的通道src/cmd.c src/Makefile.am镜像源管理mirrors/Makefile.am镜像格式说明见 README.md一句话总结Termux-Tools 的 Autoconf 体系 configure.ac 定变量 Makefile 做 sed 渲染而 TERMUX_PREFIX 替换机制 让同一套脚本模板适配任意 Android 应用私有目录。掌握这条configure.ac → Makefile → .in 模板的三环节链路你就看懂了 Termux 整个生态的构建范式。【免费下载链接】termux-toolsScripts and small programs that are packaged into termuxs termux-tools package项目地址: https://gitcode.com/gh_mirrors/te/termux-tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考