分析下Skia的构建系统,具体编译过程参看Windows下从源码编译Skia。这里以ninja为例来分析。执行下面三条命令就可以完成编译:
SET "GYP_GENERATORS=ninja"
python bin/sync-and-gyp
ninja -C out\Release
“python bin/sync-and-gyp”会生成ninja脚本。下面来分析脚本层级以及某个模块的脚本内容和结构。关于ninja,参考https://ninja-build.org/manual.html或http://guiquanz.me/2014/07/28/a_intro_to_Ninja/。
ninja脚本层级及模块脚本说明
skia\gyp下面的gyp脚本是模板,执行sync-and-gyp时会根据这些模板来动态生成实际的构建脚本。很多模块依赖、条件等都可以在这个目录下的gyp或gypi中找到。
sync-and-gyp之后,out\Release\build.ninja,是总的编译脚本。里面定义了all,还定义了默认编译目标为most。most对应的ninja脚本是out\Release\obj\gyp\most.ninja。
如果想编译某个单独的模块,可以执行“ninja module_name”,比如“ninja images”,“ninja giflib”等。
具体到某个模块的编译脚本,都在out\Release\obj\gyp\目录下。某个模块的ninja脚本中,定义了具体的编译规则。以images.ninja(对应skia_images.lib)为例来说明下,它的内容如下:
arch = environment.x86
cc = $cl_x86
cxx = $cl_x86
cc_host = $cl_x86
cxx_host = $cl_x86
asm = $ml_x86
build obj\gyp\images.actions_depends.stamp: stamp obj\gyp\libjpeg-turbo.lib $
obj\gyp\libwebp.actions_depends.stamp
pdbname_c = images.pdb
pdbname_cc = images.pdb
pchprefix = images
defines = -DSK_INTERNAL -DSK_GAMMA_SRGB -DSK_GAMMA_APPLY_TO_A8 $
-DSK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1 -DSK_SUPPORT_GPU=0 $
-DSK_FORCE_DISTANCE_FIELD_TEXT=0 -DSK_BUILD_FOR_WIN32 $
-D_CRT_SECURE_NO_WARNINGS -DGR_GL_FUNCTION_TYPE=__stdcall $
-D_HAS_EXCEPTIONS=0 -DNDEBUG -DNDEBUG
asmflags =
rcflags = /I..\..\gyp
includes = -I..\..\include\images -I..\..\include\private -I..\..\src\lazy $
-I..\..\src\core -I..\..\src\image -I..\..\include\c $
-I..\..\include\config -I..\..\include\core -I..\..\include\pathops $
-I..\..\gyp\config\win -I..\..\third_party\externals\libjpeg-turbo $
-I..\..\third_party\externals\libpng -I..\..\third_party\libpng $
-I..\..\third_party\externals\giflib -I..\..\third_party\giflib $
-I..\..\third_party\etc1 -I..\..\third_party\ktx $
-I..\..\third_party\externals\libwebp\src -I..\..\include\utils $
-I..\..\src\utils -I..\..\include\utils\win
midl_includes =
cflags = /wd4275 /wd4345 /wd4355 /Ox /Ot /fp:precise /W3 /WX /Zi /GR- /MD $
/we4189 /arch:SSE2 /FS
cflags_c = -DSK_A32_