VLC的引用了很多开源的第三方库,均放到VLC目录下的contrib中(本来开始编译是2.1.x以上版本,以前或以后可能会变化),在Windows版本编译中,contrib文件夹中仅仅下载VLC官网上已经编译好的预编译包后解压到该目录下,要修改编译脚本(compile.sh和 contrib/src下的main.mak)为fetch所有第三方包中,下载后开始自动编译(由main.mak和contrib/src/***/rules.mak控制)。
一旦编译通过,一般来说,在下一次执行VLC编译脚本时,就不会再重新编译第三方包了,因为对于make来说,这些第三方包处于已安装状态,所以一旦修改了这些第三方库文件,就需要重新编译,重新编译前就需要将已安装的包卸载掉,编译脚本通过判断隐藏文件(.包名)和prefix路径下的文件,一旦存在就不需要重新编译(此处为各个包中make install决定),对于开发者来说,只需要在compile.sh(android版为compile-libvlc.sh)中的make contrib 前加上make clean即可,但此处需要注意,不能直接加上make clean,因为clean对于main.mak来说,会连同第三方库源码包都删除掉,而我们只需要删除已安装的文件即可,因此在main.mak中新增一个参数动作cleaninstall,如下:
installclean:
-$(RM) $(foreach p,$(PKGS_ALL),.$(p) .sum-$(p) .dep-$(p))
-$(RM) toolchain.cmake
-$(RM) -R "$(PREFIX)"
以上代码可在main.mak中先搜索install:后,在此段后面加上即可,修改完成后,在回到compile.sh(android版为compile-libvlc.sh)中的contrib编译段的make 前加上make cleaninstall,
接下来,再修改contrib/src下的各个包的rules.mak,让make时,不再重新解压源码(即注释掉download和UNPACK相关的命令)直接make即可。
其实还可以修改更准确的,比如实现clean指定的某一个第三方包,如以下内容为删除DVD相关的几个库,实现只重新编译这几个库:
cleandvd:
-$(RM) "./.dvdcss"
-$(RM) "./.sum-dvdcss"
-$(RM) "./.dep-dvdcss"
-$(RM) "./.dvdnav"
-$(RM) "./.sum-dvdnav"
-$(RM) "./.dep-dvdnav"
-$(RM) "./.dvdread"
-$(RM) "./.sum-dvdread"
-$(RM) "./.dep-dvdread"
# -$(RM) toolchain.cmake
-$(RM) -R "$(PREFIX)/include/dvdcss/*.*"
-$(RM) -R "$(PREFIX)/include/dvdnav/*.*"
-$(RM) -R "$(PREFIX)/include/dvdread/*.*"
-$(RM) -R "$(PREFIX)/share/doc/libdvdcss/*.*"
-$(RM) -R "$(PREFIX)/share/doc/libdvdnav/*.*"
-$(RM) -R "$(PREFIX)/share/doc/libdvdread/*.*"
-$(RM) "$(PREFIX)/lib/libdvdcss.*"
-$(RM) "$(PREFIX)/lib/libdvdnav.*"
-$(RM) "$(PREFIX)/lib/libdvdread.*"
-$(RM) "$(PREFIX)/lib/pkgconfig/dvdcss.*"
-$(RM) "$(PREFIX)/lib/pkgconfig/dvdnav.*"
-$(RM) "$(PREFIX)/lib/pkgconfig/dvdread.*"