在学习 vlc-libde265 的过程中想要尝试对 Makefile.am 进行一下解读,由于篇幅太长单独整理一下。
vlc-libde265 Makefile.am 试读
Makefile.am文件其实和Makefile文件很类似,只不过是一编译规则更加抽象的编译文件。
先从一个部分的文件看看 Makefile.am 这类文件书写的一般规律:
lib_LTLIBRARIES = libde265_plugin.la
CFLAGS = -DVLC_MODULE_COPYRIGHT="\"Copyright \(c) struktur AG\""
CFLAGS += -DVLC_MODULE_LICENSE=\"LGPL\"
libde265_plugin_la_CFLAGS = -DMODULE_STRING=\"de265\" $(libde265_CFLAGS) $(vlc_CFLAGS)
libde265_plugin_la_CPPFLAGS = -DMODULE_STRING=\"de265\" $(libde265_CFLAGS) $(vlc_CFLAGS)
libde265_plugin_la_LIBADD = $(libde265_LIBS) $(vlc_LIBS)
libde265_plugin_la_LDFLAGS = -avoid-version -module -export-symbol-regex ^vlc_entry $(libde265_LDFLAGS) $(vlc_LDFLAGS)
libde265_plugin_la_SOURCES = \
src/codec/libde265dec.c \
include/libde265_plugin_common.h
从第一行可以看出这里要生成的是一个名叫 libde265_plugin 的共享库(lib_LTLIBRARIES 是静态库的定义)。
后面两行 CFLAGS 主要是用于指明 C 语言编译过程所用到的头文件。
之后看起来一大堆的配置仔细看其实很快就能发现:每个变量都多了 libde265_plugin_la_ 的前缀。
没错!这一堆设置的就是 libde265_plugin.la 编译时的参数啦:
- xxx_CFLAGS: C 语言编译时的头文件
- xxx_CPPFLAGS: C++ 语言编译时的头文件
- xxx_LIBADD: 编译时需要的其他库
- xxx_LDFLAGS: 编译器会用到的一些优化参数
- xxx_SOURCES: 生成时用到的源文件
后面的几个模块其实也都大同小异,也就是说我们可以通过这样的模式找到他生成的每个文件具体使用了哪些 src 文件:
Lib Name | Sources |
---|---|
libde265_plugin.la | src/codec/libde265dec.c |
include/libde265_plugin_common.h | |
libde265demux_plugin.la | src/demux/libde265demux.c |
include/libde265_plugin_common.h | |
libde265_mkv_plugin.la | src/demux/vobsub.h |
src/demux/mp4/libmp4.c | |
src/demux/mp4/libmp4.h | |
src/demux/mkv/chapter_command.cpp | |
src/demux/mkv/chapter_command.hpp | |
src/demux/mkv/chapters.cpp | |
src/demux/mkv/chapters.hpp | |
src/demux/mkv/demux.cpp | |
src/demux/mkv/demux.hpp | |
src/demux/mkv/Ebml_parser.cpp | |
src/demux/mkv/Ebml_parser.hpp | |
src/demux/mkv/matroska_segment.cpp | |
src/demux/mkv/matroska_segment.hpp | |
src/demux/mkv/matroska_segment_parse.cpp | |
src/demux/mkv/mkv.cpp | |
src/demux/mkv/mkv.hpp | |
src/demux/mkv/stream_io_callback.cpp | |
src/demux/mkv/stream_io_callback.hpp | |
src/demux/mkv/util.cpp | |
src/demux/mkv/util.hpp | |
src/demux/mkv/virtual_segment.cpp | |
src/demux/mkv/virtual_segment.hpp | |
include/libde265_plugin_common.h | |
include/vlc_codecs.h | |
libde265_mp4_plugin.la | src/demux/mp4/id3genres.h |
src/demux/mp4/libmp4.c | |
src/demux/mp4/libmp4.h | |
src/demux/mp4/mp4.c | |
libde265_ts_plugin.la | src/demux/dvb-text.h |
src/demux/ts.c | |
src/mux/mpeg/csa.c | |
src/mux/mpeg/csa.h | |
src/mux/mpeg/dvbpsi_compat.h | |
include/libde265_plugin_common.h | |
include/vlc_codecs.h |
一下这么多源文件看起来是有点多,那我们不妨暂时先只看一下生成的库都是什么在什么条件下才进行的:
Conditions | Lib Name |
---|---|
Default | libde265_plugin.la |
Default | libde265demux_plugin.la |
! HAVE_VLC_HEVC | libde265_mkv_plugin.la |
! HAVE_VLC_HEVC_MP4 | libde265_mp4_plugin.la |
! HAVE_VLC_HEVC_TS | libde265_ts_plugin.la |
明显我这里写的感叹号不是想告诉你我有多惊讶...也就是说只有在某些条件不满足的情况下才会对这些库进行编译,从宏变量名字其实就可以大致了解它的作用了:如果现在没有这些模块,则针对性的编译出他的功能。再结合库的文件名,它们的作用就非常明白了:
Lib Name | 作用 |
---|---|
libde265_plugin.la | H.265 解码模块 |
libde265demux_plugin.la | H.265 解复用模块 |
libde265_mkv_plugin.la | H.265 处理 mkv 格式模块 |
libde265_mp4_plugin.la | H.265 处理 mp4 格式模块 |
libde265_ts_plugin.la | H.265 处理 TS 格式模块 |
真的是这样吗?嘿嘿,其实我也不知道。目前这些推断仅仅是通过一个 Makefile 文件推断出的,是否正确还得继续看看他们的源文件到底怎么写的。
网友评论