通过分析makefile编译构建过程,梳理各个具体目录的作用和联系
这是一张freewind画的结构图,个人通过分析查看跟踪makefile整理,使用vlc版本为3.0.6 for linux
ubuntu 18.04编译,默认配置。
为了方便查看已经缩减了很多具体的细节,后续文字补充;
分析过程中碰到的一些疑惑,记录下:
1.0 vlc 顶层目录下的makefile , 查看 all:目标规则,
all:
$(MAKE) $(AM_MAKEFLAGS) all-recursive
相当于make all-recursive, 可是直接找 all-recursive: 可能找不到这个target的依赖规则,但是能看到RECURSIVE_TARGETS = all-recursive.... am__recursive_targets=$(RECURSIVE_TARGETS) .. am__recursive_targets 这个target是有对应规则的,把对应变量展开,就能看到其实是多个target对应一条规则的用法。
2.0 $(am__recursive_targets): 的规则中执行的命令中,调用的shell 脚本执行,
保证在一个线程中执行shell脚本的命令,所有的命令都在一行中完成,这与makefile的作用机制有关
要调用shell里面的变量使用$$
3.0 对于一些变量值,可以在编译的时候使用 echo 输出,方便分析
4.0 分析一个具体的编译文件命令:以src目录下makefile为例,追踪依赖关系,最后落实到具体的 .c 文件编译到 .lo 文件
echo上面的几个变量,$(LTCOMPILE):
../doltcompile gcc -DHAVE_CONFIG_H -I. -I.. -DMODULE_STRING="core" -DLOCALEDIR="/usr/local/share/locale" -DPKGDATADIR="/usr/local/share/vlc" -DPKGLIBDIR="/usr/local/lib/vlc" -DHAVE_DYNAMIC_PLUGINS -I../include -I../include -g -O2 -Wall -Wextra -Wsign-compare -Wundef -Wpointer-arith -Wvolatile-register-var -Wformat -Wformat-security -Wbad-function-cast -Wwrite-strings -Wmissing-prototypes -Werror-implicit-function-declaration -Winit-self -Wlogical-op -Wshadow=local -pipe -fvisibility=hidden -O3 -fno-math-errno -funsafe-math-optimizations -fno-rounding-math -fno-signaling-nans -fcx-limited-range -funroll-loops -fomit-frame-pointer -fstack-protector-strong
第二行命令展开,即对应实际的编译命令
<== ../doltcompile gcc .... -MT $@ -MD -MP .deps -c -o $@ $<
<== gcc XX.lo -c -o XX.lo XX.c
再简化一下这个图(实在是难看)