1. 程式人生 > >Kivy a to z -- Kivy的編譯過程-distribute.sh指令碼分析

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,kivypygame安裝到python-install\lib\python2.7\site-packages

14 再看來最後一個函式:run_distribute

這個函式的作用是把所有需要的檔案拷貝到dist/default目錄下,為下一步的apk的生成作準備。

15 好了,distribute.sh分析完畢了,這個時候應該對kivy的整個模組的編譯過程有一個比較完整的認識了

16 需要注意的地方有liblink以及biglink,這兩個過程在通常的編譯過程中都是不會特意這樣做的,有點奇怪。

17 (完)