天天看點

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

本文關鍵字:更新/枚舉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吧。

(此處不設回複,掃碼到微信參與留言,或直接點選到原文)

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

繼續閱讀