SRS的编译过程分析makefile—SRS源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
SRS 的 configure
脚本一共生成了两个 makefile
文件,如下:
trunk/makefile
trunk/objs/makefile
makefile
语法请看 《跟我一起写Makefile》。
虽然 makefile
是代码生成的,但是并没有做太多的封装,抽象,所以还是比较容易阅读的。SRS 的 makefile
总共 1000 行左右,依赖非常清晰。
SRS 的 makefile
的第一个 target
是 default
,而不是 all
,如下:
makefile
的规则是 ,第一个 不 以 .
开头的 target
就是默认的 target,所以 make
命令执行的时候,是执行 default
这个 target
个规则。
default
依赖 server
,server
又依赖 _prepare_dir
,如下
server: _prepare_dir
@echo "Build the SRS server, JOBS=${JOBS}, FORCE_MAKE_JOBS=YES"
$(MAKE)$(JOBS) -f ./objs/Makefile srs
@bash objs/_srs_build_summary.sh
_prepare_dir
是负责创建目录的,如下:
_prepare_dir:
@mkdir -p ./objs
@mkdir -p ./objs/src/core
@mkdir -p ./objs/src/kernel
@mkdir -p ./objs/src/protocol
@mkdir -p ./objs/src/app
@mkdir -p ./objs/src/main
@mkdir -p ./objs/src/main
_prepare_dir
创建完目录之后 ,会执行 make -f ./objs/Makefile srs
命令。-f
是指定 makefile
文件,后面的 srs
是一个 target
,所以实际执行的是 objs/Makefile
文件的 srs
target
的编译规律,如下:
# build ./objs/srs
srs: ./objs/srs
./objs/srs: ./objs/src/core/srs_core.o ./objs/src/core/srs_core_version.o ./objs/src/core/srs_core_version5.o ./objs/src/core/srs_core_autofree.o ./objs/src/core/srs_core_performance.o ./objs/src/core/srs_core_time.o
...省略代码... \
$(LINK) -o ./objs/srs ./objs/src/core/srs_core.o ./objs/src/core/srs_core_version.o ./objs/src/core/srs_core_version5.o ./objs/src/core/srs_core_autofree.o ./objs/src/core/srs_core_performance.o ./objs/src/core/srs_core_time.o ./objs/src/core/srs_core_platform.o ./objs/src/kernel/srs_kernel_error.o ./objs/src/kernel/srs_kernel_log.o
...省略代码... \
./objs/src/app/srs_app_rtc_codec.o ./objs/src/main/srs_main_server.o ./objs/st/libst.a ./objs/openssl/lib/libssl.a ./objs/openssl/lib/libcrypto.a ./objs/srtp2/lib/libsrtp2.a ./objs/ffmpeg/lib/libavcodec.a ./objs/ffmpeg/lib/libswresample.a ./objs/ffmpeg/lib/libavutil.a ./objs/opus/lib/libopus.a ./objs/srt/lib/libsrt.a -ldl -lpthread -lrt -rdynamic -fsanitize=address -fno-omit-frame-pointer -static-libasan
上面就是 srs
可执行文件的生成规则,很简单,就是用链接器把 一堆的 .o
文件跟静态库 链接起来就完事了。