不依賴官方LibPack編譯FreeCAD的一次嘗試
在Windows下編譯FreeCAD,通常的方法是依賴官方提供的LibPack,但是只有vs2008, vs2012, vs2013等幾個版本提供。比如現在感覺vs2017比較好用,可是沒有官方LibPack,那就很難在vs2017上編譯FreeCAD。
我不想再因為想看看FreeCAD源碼,而去安裝一個visual studio,不如探索一下,如何不依賴官方LibPack,生成出vs2017的工程項目。
方向確定了,那就幹起來唄。給cmake傳入FREECAD_LIBPACK_USE變量值為 OFF,關閉使用官方LibPack。看看會因為缺少哪些依賴庫而無法通過編譯。
第一個庫是 Python,需要確保在PATH路徑中找到 Python可執行程序。如果電腦安裝過python,cmake也會通過註冊表查找。建議采用python3,如果想要debug,那麽就必須有debug的python dll。通常的python安裝版默認是不帶的,可以在安裝時選擇需要debug的,估計這樣會從官網下載還是怎麽的,反正我在一臺電腦上安裝如果要debug,就總是安裝失敗,但是另外一臺電腦卻可以安裝成功。不知道這是什麽原因。也可以直接下載python源碼,裏邊有個PCBuild目錄,vs編譯不會太難。只是我也不怎麽熟悉python,從源碼再安裝,不知道那些文件應該怎麽放,也懶得比較了。
第二個庫是 boost,會由於找不到boost而無法繼續cmake,可以設置 BOOST_ROOT 指向 boost 安裝位置。在這裏有個提醒的是,從boost1.65還是哪個版本開始,boost.python的dll有所不同,在 src/Mod/Path/area 有個find_package( Boost COMPONENTS python${BOOST_PY_SUFFIX} ) 按命名查找,好像比較容易查找。推薦 boost1.68以上。這裏好像對cmake版本也有要求,我原來是3.9,後面升到3.14.1了。
第三個庫是 Xerces-C,這個庫是讀寫xml文件的,沒有預編譯的二進制庫可供下載,得去官網下載自己編譯。cmake編譯這個庫沒有什麽問題。
再就是 zlib,直接使用opencascade第三方庫裏的就可以了,可以設計通過定義 ZLIB_ROOT 讓 cmake 找到它。
FreeType,缺少這個,並不會影響cmake生成工程項目文件,只是提示 "Part module will lack of makeWireString()",就是 src/Mod/Part 裏的 Part::Module 會缺少 makeWireString() 函數的實現。
Eigen3,缺少它,也不會影響cmake生成工程項目文件吧,但是會關閉 flatmesh 模塊的生成。不過Eigen3是純C++頭文件使用的,添加上並不麻煩。
OpenCASCADE,從最新版7.3.0編譯出來,再設法讓cmake找到它。
還有 Coin3D,這是FreeCAD在顯示方面所依賴的庫。有個 pivy 是對 Coin3D 的python捆綁,在FreeCAD的github庫裏有,但是 python pip 不能安裝。
還有 Qt,沒有這個,就得不到UI界面了。不建議Qt4了,給 cmake 傳入 BUILD_QT5 為ON 啟用Qt5的編譯。
PySide2,這是Python對Qt5的捆綁。有些模塊會使用 pyside2-rcc.exe 去生成 Qt的資源文件qrc,缺少它的話,在這些地方會編譯失敗。可以通過 python 的pip 安裝 PySide2。
MedFile,認為這個庫很不常見,如果打開 FREECAD_USE_EXTERNAL_SMESH,就不需要 MedFile 了,可以通過 salome找到 med 的源碼;還有netgen, hdf5等很多庫,數量不少,都是網格方面的,為求簡便,也就不追求生成出所有的模塊,所以這些都還是跳過吧。如果真的有切實需要,再來處理它們。
當前狀態與結果
最終結果存儲在 我的github-FreeCAD fork,develop分支的 vsbuild 目錄,執行腳本 buildscript_vs2017.bat 疊加源碼同級目錄 FreeCAD-LibPack 可以得到vs2017的工程項目文件。
為了得到這些工程,關閉了不少模塊,在運行時也還有問題。這些問題主要出在python方面,最典型的是找不到 shiboken2。
對 FreeCAD 的感覺是,在很多的地方都會借助 python 來輔助搭建,比如導入dxf。現在發現好多庫都有 python 捆綁,比如vtk,ifcopenshell等等,好像這個世界是 python 的了。
佩服 python,有點酸溜溜,但是也得指明在這些地方,底層還都是C++。我覺得FreeCAD如果可以不依賴 python,只是在C++之上提供對 Python 的接口,整個源碼是不是會更純潔好理解一些。
導入dxf
導入dxf是在 Mod/Draft 內定義的,語句 App.addImportType("Autodesk DXF 2D (*.dxf)","importDXF") 表明導入dxf文件會由 importDXF 模塊來完成,這對應的是 importDXF.py 文件。看了一下這裏的源碼,可以發現它又要從另外一個地方下載似的。
importDXF.py 裏邊全部是Python語句,但事實上 Draft/App 之下又存有 C++版的 dxf 格式讀寫,看起來是向 Heeks 借用的 dxf.h/dxf.cpp。importDXF.py 裏在某種情況會調用 C++版的,但是我沒成功執行過,原因是缺少 shiboken2,這個我惱火的是我已經在 Python 那裏安裝 PySide2 時會有 shiboken2 呀,為什麽找不到呢。當然為了保持依賴庫在同一個地方(除了Qt之外),我將 Python 拷貝在 FreeCAD-LibPack/Python 裏邊,同時電腦 C 盤目錄之下還有一個python。
題外話
剛剛發現 FreeCAD 官方在發布 19_pre 時提供了 FreeCADLibs_12.1.2_x64_VC15.7z ,估計 vs2017 也可以使用 官方 LibPack 了。
不依賴官方LibPack編譯FreeCAD的一次嘗試