Kivy a to z -- Kivy的編譯過程-distribute.sh指令碼分析
1 這一節重點來分析一下distribute.sh,以此來了解一下Kivy的整個編譯過程
2 在上一篇文章中,我們講到編譯的方法:
./distribute.sh -m 'openssl pyjnius pil kivy'
3 那整個過程是怎麼進行的,下面來分析一下:
4 首先來看下這個指令碼檔案的最後一行指令碼:run
function run() { check_build_deps run_prepare run_source_modules run_get_packages run_prebuild run_build run_biglink run_postbuild run_pymodules_install run_distribute info "All done !" }
剛好是十個函式,這十個函式到底各自做了什麼呢,一直來分析一下:
5 check_build_deps
該函式用於檢測編譯所依賴的軟體包是否存在:build-essential zlib1g-dev cython
6 run_prepare
檢測NDK,SDK是否已經安裝,環境變數是否已經設定
檢測tar bzip2 unzip make gcc g++是否已經安裝
檢查dist/default是否已經存在,如已經存在,提示是否刪除
建立一堆的目錄等等
7 run_source_modules
該函式的主要作用是根據要編譯的模組呼叫recipes目錄下相應的recipes.sh載入相應的環境變數以及編譯函式
並且會檢查模組的依賴關係,把一些依賴的模組也編譯進去,例如要編譯openssl pyjnius pil kivy,那麼實際會編譯的模組包含以下這些:
hostpython jpeg openssl png python pil sdl pygame pyjnius android kivy
8 run_get_packages
run_source_modules已經把下載的路徑的環境變數給設定好了,接下來就是下載相應的程式碼並解壓了
所有的程式碼會被下載到.packages目錄下,並被解壓到build目錄下
9 run_prebuild
該函式會呼叫各模組的recipes.sh裡的prebuild_xxx
如prebuild_python就會給Python打上patch
10 run_build
這裡就開始編譯各個模組了
這裡要特別注意的是,如果是一個python模組,如pyjnius
在build_xxx中,如build_pyjnius中
會有下面的指令碼:
export LDSHARED="$LIBLINK"
而$LIBLINK即為src\tools\liblink,它會在build/objects生成相應的以.so.o結尾的動態庫
上演了一場替換大法。
11 run_biglink
將build\objects目錄下的所有.so.o動態庫檔案連結成一個動態庫檔案:libpymodules.so
12 run_postbuild
該函式會呼叫各模組的recipes.sh裡的postbuild_xxx以完以一些編譯前的初始化工作
13 run_pymodules_install
將所有的python模組,如jnius,pil,kivy,pygame安裝到python-install\lib\python2.7\site-packages
14 再看來最後一個函式:run_distribute
這個函式的作用是把所有需要的檔案拷貝到dist/default目錄下,為下一步的apk的生成作準備。
15 好了,distribute.sh分析完畢了,這個時候應該對kivy的整個模組的編譯過程有一個比較完整的認識了
16 需要注意的地方有liblink以及biglink,這兩個過程在通常的編譯過程中都是不會特意這樣做的,有點奇怪。
17 (完)