1. 程式人生 > 其它 >把cpp編譯為so_在tinycolinux上編譯jupyter和rootcling組建混合cpp,python學習環境

把cpp編譯為so_在tinycolinux上編譯jupyter和rootcling組建混合cpp,python學習環境

技術標籤:把cpp編譯為so

本文關鍵字:升級/列舉tinycorelinux上的gcc,在tinycorelinux上安裝python jupyter

在前面《tinycolinux上編譯odoo》中我們談到python在流行的“one host one guest”學習語言選型組合中是對應於cpp的,還談到一些混合語言工具,如terralang,rootcling等,見《釋出qtcling》和《釋出terracling》,技術界二二相對的事物總有驚人的對應:cpp,py組合的cling就相當於lua,c組合的terralang:

事實上該如何評價cling和c++,py的關係呢:要把rootcling當工具而不是語言。它是搭建一個混合C++和PY的語言系統的REPL環境和學習平臺的極好工具,但是我們要實際拿來用中心依然是分開了的,獨立的二門語言,即C++和PY --- 畢竟C++歷史上不是以REPL方式拿來用的,terralang之於lua+c也是一樣的道理。

在更早一些的文章中我們提到和釋出過《釋出engitor》,jupyter只不過是IDE B/S化了,想象那個python idle ide,jupyter pythonkernel notebook本身就是這個IDE的線上化和極大化(它支援更多語言和可渲染HTML等)。只不過,在那裡我們還以技術狂想的形式設想了它其它方面的用途:它還可能與伺服器執行設施結合,給設計人員或開發人員提供線上支援開發的可能for both maintainer and developer(傳統上都是線上運營線下開發),更進一步,它還可以發展成visual builder技術,以實現applevel同時線上執行和視覺化編輯的平臺,我們稱它為appstackx。

視覺化的基礎概念是以拖拉方式就能使其在一起工作的可複用件,以前是lib reuse,元件就是一些二進位制介面透露出來的服務就能成為可複用件的東西,是demo as reuseable software componets當然,指令碼語言的元件天然是原始碼形式的。無論如何,這距我們的理想:tool as framework but not engine又進了一步:它使得中心可複用件的engine變得談化,用隨手能找到的工具來代替,由於工具不準備作複用件進入架構層,所以就談化了架構的存在降低了學習成本使得軟體開發真正意義上變成了組裝測試----要知道,為龐大複雜的軟體系統劃模組定介面是一件多麼可怕的事,而一個新手隨便找到能工作起來的東西搭個系統可以給他多大的自信和幫助(以後深入學習元件內部)。這叫入階平滑無欺。

下面,我們在tinycolinux上一步一步建立起這個REPL環境和其jupyter支援(root cling原始碼中有支援將這個c++ repl kernel為jupyter使用的模組clingkernel和kernel.json檔案),這就需要同時在tinycolinux原始碼編譯出rootcling,python等,又涉及到編譯最新的cmake,所以不妨看下《在tinycolinux上建立應用》的開頭我們為一個全新平臺準備gcc toolchain支援的描述 --- 我們這裡只升級GCC和GCC裡面帶的LIBSTDCXX,而會不是GLIBSTDC。

在tinycolinux上編譯gcc 4.8.1和cmake

首先,cling會用到新的支援C++11的GCC來編譯且會引用到GCC的標頭檔案來執行,所以我們使用在前文一直使用的gcc4.6.1來bootstrap到4.8.1,下載4.8.1的原始碼http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.1/gcc-4.8.1.tar.bz2,在/home/tc下解壓它,cd gcc-4.8.1 && ./contrib/download_prerequisites 會把編譯用到的庫下載解壓好,我們想直接覆蓋原來的GCC461安裝,所以直接 cd .. && mkdir gcc481build && ./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib && sudo make install,由於不帶prefix,它配置出來的configure和make之後的結果會預設安裝並覆蓋GCC461,也會升級libstdcxx.so,這樣就完成了我們的目的:在本系統上列舉一個新的高版本的gcc,gcc -v 發現輸出4.8.1。

由於編譯GCC,PYTHON,和接下來的CLING,可能會產生大量中間檔案,所以tinycolinuxhd映象放大為4G,將新GCC產生的/usr/lib/libstdc++.so改動連結指到/usr/local/libstdc++.so.6.0.18,而非隨系統自帶的libstdc++.so.6.0.13,否則接下來的CMAKE在./configure過程中會提示找不到c++stdlib 4.3.15,而且,4.x的curl.tcz,expat2.tcz,git.tcz,libssh2.tcz,libssl-0.9.8.tcz,openssl-1.0.0.tcz,sqlite3-dev.tcz全部下好按以前安裝tcz的方法安裝好,未來都有用。

現在安裝升級cmake(在lnmp src中有一箇舊版本2.x的cmake),以前的cling和llvm都是用標準./configure的現在都改用CMAKE了,依然配置安裝到預設/usr/目錄,我下載的原始碼是cmake-3.10.1.tar.gz,在/home/tc下解壓./configure && sudo make install,cmake -v發現是3.10。

安裝在前文《編譯odoo》中的python,由於jupyter會用到sqlite3模組,所以安裝完sqlite3-dev.tcz重新原始碼跑一次並安裝,(最好重啟一次)python的./configure會自動發現sqlite3開發庫會生成_sqlite3.pyd之類的支援。

這三大件準備好了就差不多了。

在tinycolinux上編譯root cling和配置jupyter支援

跟下載gcc481原始碼一樣,用GIT工具(上面提到要安裝tcz)以以下過程分別檢出llvm,clang,cling的原始碼(編譯llvm會統一編譯clang,cling),我檢出是20180115左右前後的版本,為了控制tinycolinuxhd大小,檢出後刪除根下.git和tools/clang,tools/cling下的.git:

git clone http://root.cern.ch/git/llvm.git src

cd src
git checkout cling-patches

cd tools
git clone http://root.cern.ch/git/cling.git
git clone http://root.cern.ch/git/clang.git

cd clang
git checkout cling-patches

cd ../..

建立與src並列的clingbuild,執行以下CMAKE配置過程:

cmake -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_INSTALL_PREFIX=/usr/local/cling -DPYTHON_EXECUTABLE=/usr/local/python/bin/python2.7 -DLLVM_TARGETS_TO_BUILD="XCore;X86" -DLLVM_BUILD_LLVM_DYLIB=true -DLLVM_LINK_LLVM_DYLIB=true -DLLVM_BUILD_TOOLS=false -DLLVM_BUILD_EXAMPLES=false -DLLVM_BUILD_TESTS=false -DLLVM_BUILD_DOCS=false ../src

以上cmake配置過程會顯示cling未來會引用GCC481的哪些路徑下的標頭檔案,如果找不到就直接呼叫GCC動態除錯路徑。

編譯並安裝cmake --build . ,編譯完整個cling會佔用大約2G不到,sudo cmake --build . --target install安裝,安裝也才300多M。

測試一下/usr/local/cling/bin/cling發現是5.0.0版本,現在來開啟它原始碼自帶的jupyter支援。首先在python中開啟juypter notebook:

sudo /usr/local/python/bin/pip install jupyter,安裝完後執行:/usr/local/python/bin/jupyter notebook --ip=0.0.0.0,(有時預設只繫結127.0.0.1),可以看到python2.7的kernel已在ip:8888下完全正確運行了。

當然,如果嫌老是打全路徑太麻煩,可以export PATH=(注意等號左右無空格)$PATH:/usr/local/python/bin。

現在,將cling原始碼下附帶的jupyter支援開啟,到/usr/local/cling/lib/jupyter/下,會發現有setup.py和幾個資料夾裡有kernel.json檔案。

首先為python安裝clingkernel支援,就是setup.py能做到的:sudo /usr/local/python/bin/python /usr/local/cling/lib/jupyter/setup.py

然後將某一個資料夾裡的對應的 kernel.json注入到jupyter,讓它知道:sudo /usr/local/python/bin/jupyter kernelspec install /usr/local/cling/lib/jupyter/某kernel.json所在資料夾。

完工,重新開啟jupyter notebook會發現可用的c++ repl !!


始終要記得,這是一個混合了python和C++的repl學習環境和工具,缺一不可成就cpp,py這對one host one guest好CP。下面就介紹在tinycolinux上安裝terralang吧。

dcc675c9edef6f428418853e18b8a2cf.png
(此處不設回覆和更新,點選GIF掃碼到微信參與留言或獲取資源)