SRS的编译过程分析configure—SRS源码分析

SRS 的 configure 只有 800 行,相对于 FFmpeg 的 8000 行 configure,还是比较简单的,他的主要流程如下:

本文主要提取一些重点来讲解一下。

1,解析参数,创建目录

bash 复制代码
. $SRS_WORKDIR/auto/options.sh
. $SRS_WORKDIR/auto/setup_variables.sh

configure 脚本支持很多参数,例如 xxx,xxx,推荐阅读《SRS的编译参数configure》。而 options.sh 这个脚本就负责解析这些编译参数。

setup_variables.sh 这个脚本主要是检测 gcc 编译器是否安装,输出 SRS 的版本信息,还有创建一堆输出目录,如下:

上面这个 objs 以及很大串的 Platform 文件夹 都是 setup_variables.sh 脚本创建的。

在 options.sh、setup_variables.sh 的前面,有一个 . 点号,这个其实是 source 命令的缩写,如下:

bash 复制代码
. $SRS_WORKDIR/auto/options.sh
等级于
source $SRS_WORKDIR/auto/options.sh

source 的作用是让 shell 脚本能用上当前环境创建的变量,更详细的用法请阅读《Linux下source命令详解》,SRS 的 configure 在很多地方都用了这种 . 点号写法,有兴趣可以关注一下。


2,处理依赖 depends.sh

bash 复制代码
# apply user options.
. $SRS_WORKDIR/auto/depends.sh

# the auto generated variables.
. $SRS_WORKDIR/auto/auto_headers.sh

depends.sh 脚本主要做的是下面三件事情。

  1. 检测 make,gcc,g++,pkg-config 等软件是否安装。
  2. 创建 nginx 目录以及相关的 HTML 页面,例如 HLS 页面,WebRTC 的推拉流页面等等。
  3. 编译依赖的第三方库的源代码,例如 StateThreads 协程库 libst.a ,openssl,libsrtp,libopus,FFmpeg,libsrt 等等。

通常 shell 脚本都是不编译项目代码,只是检测环境是否支持编译,而是在 make 进行编译的。但是 depends.sh 会对第三方的项目代码进行编译。这是不同的地方。他在编译这些第三方库的源代码的时候,是把源代码拷贝到 SRS_PLATFORM 目录再进行编译的。

auto_headers.sh 脚本做的事情相对就比较简单了,就是把 shell 里面的一些变量,转成 C 语言的宏定义,然后写入到 srs_auto_headers.hpp 头文件里面,例如 SRS_SRT_BOOL 这个宏就是控制是否启用 SRT 相关的代码。


3,shell 重点语法

这里来讲解一下 configure 里面用到的一些不太容易看到的 shell 的语法。

第一点: SRS_MODULES=() 定义一维数组,这是定义一位数组的写法。

第二点: cat ,END 写入输出文件。

这种写法是把中间的内容保存到 ${SRS_OBJS}/Makefile 文件里面,注意他是有两个 END 的,而输出文件在 第一个 END 的后面。

关于 PHONY 的用法,请阅读《Makefile中.PHONY的作用》


4,modules.sh 生成相关模块的 makefile

上图中 configure 这些模块化的 代码,都是定义这个模块的 文件,例如 KERNEL 模块的文件是 srs_kernel_error,srs_kernel_log 等等,

modules.sh 会往 objs/Makefile 写入这些模块的 文件的编译规则, 不过实际上就是把相关的 .c 文件编译成 .o 文件而已,没有生成动态库,静态库,或者可执行文件。


5,apps.sh 生成可执行文件的编译规则

apps.sh 主要就是生成下图这一堆 可执行文件 的 makefile 规则的


configure 里面第 1~473 行代码,都是往 trunk/objs/makefile 写入内容,而从 473 行开始,就是生成 根目录的 makefile 了,也就是 trunk/makefile 。

trunk/makefile 会去调 trunk/objs/makefile 的代码完成编译的,如下:


关于 configure 脚本支持的参数,请阅读《SRS的编译参数configure》


本文是《 SRS原理 》一书中的文章,如需观看更多内容,请购买本书。

相关推荐
天天不在5511 天前
从拉代码到编出库,WebRTC 上的几道坎
音视频开发
刃若新发3 天前
Windows 用本地 MP4 文件搭建 RTSP/HTTP-FLV 播放环境指引
音视频开发
屏什么录12 天前
录屏超过两小时就卡顿崩盘?从参数调优到代码实现,一文彻底搞定长时间录屏
前端·音视频开发
字节跳动视频云技术团队13 天前
720P 直升 8K,解密 2026 抖音美好奇妙夜巨幕超分黑科技
人工智能·音视频开发
VimorphTech16 天前
文件名是 MP4 就能处理?用 ffprobe 检查视频流、音轨和时长
java·音视频开发
冬奇Lab19 天前
开源项目第242期:HyperFrames —— 写 HTML 就能渲染视频,专为 AI Agent 设计的确定性视频框架
人工智能·开源·音视频开发
屏什么录24 天前
电脑如何录屏幕视频和声音?从工具到代码,7 种方案帮你彻底搞定
前端·音视频开发
VimorphTech24 天前
转写结果怎么生成双语字幕?TypeScript 实现 SRT、WebVTT 与索引匹配
javascript·音视频开发
音视频牛哥1 个月前
人形机器人的未来发展趋势是什么?从VLA、实时视觉到规模化运营
机器学习·机器人·音视频开发
霍营_托尼1 个月前
纯前端播 40GB 本地视频?我把浏览器改造成了「磁盘流式」播放器
前端·javascript·音视频开发