在學習 vlc-libde265 的過程中想要嘗試對 Makefile.am 進行一下解讀盒刚,由于篇幅太長單獨整理一下屈暗。
vlc-libde265 Makefile.am 試讀
Makefile.am文件其實和Makefile文件很類似勉吻,只不過是一編譯規(guī)則更加抽象的編譯文件党窜。
先從一個部分的文件看看 Makefile.am 這類文件書寫的一般規(guī)律:
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 是靜態(tài)庫的定義)壳澳。
后面兩行 CFLAGS 主要是用于指明 C 語言編譯過程所用到的頭文件又谋。
之后看起來一大堆的配置仔細看其實很快就能發(fā)現(xiàn):每個變量都多了 libde265_plugin_la_ 的前綴荞胡。
沒錯妈踊!這一堆設置的就是 libde265_plugin.la 編譯時的參數(shù)啦:
- xxx_CFLAGS: C 語言編譯時的頭文件
- xxx_CPPFLAGS: C++ 語言編譯時的頭文件
- xxx_LIBADD: 編譯時需要的其他庫
- xxx_LDFLAGS: 編譯器會用到的一些優(yōu)化參數(shù)
- 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 |
明顯我這里寫的感嘆號不是想告訴你我有多驚訝...也就是說只有在某些條件不滿足的情況下才會對這些庫進行編譯廊营,從宏變量名字其實就可以大致了解它的作用了:如果現(xiàn)在沒有這些模塊,則針對性的編譯出他的功能萝勤。再結合庫的文件名赘风,它們的作用就非常明白了:
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 文件推斷出的,是否正確還得繼續(xù)看看他們的源文件到底怎么寫的假哎。