由於 Heresy 這邊是用 Qt(官網)作為圖形介面程式開發的環境,所以在很久之前,Heresy 曾經記錄過自己建置 Qt 4.6.3 的經驗;不過後來,由於決定放棄自己建置、而是改用 Qt 官方提供的 Qt SDK,所以就沒研究怎麼自行建置了。
但是相對地,當引進 GitLab CI/CD 後,就變成得研究怎麼在 Windows Docker 裡面安裝 Qt SDK 了。
開始玩這部分後,才發現 Qt 在這部份真的很討厭…本來以為弄好第一次後,以後就沒什麼問題了,但是後來 Qt 一直修改他的安裝程式,導致常常過一段時間要重建 Docker image 的時候,安裝 Qt SDK 的腳本就廢掉、要修改(2020/02)…
而後來呢,Qt 更是直接把離線安裝程式拿掉,強制一定要使用線上安裝版,然後下載速度又慢到不行…
所以後來呢,Heresy 只好又開始研究怎麼自己建置 Qt 了。
這次使用的版本是 Visual Studio 2019、建置的 Qt 版本是 Qt 6.1.0,原始碼可以從官方網站下載(頁面、下載速度很慢)。
準備建置環境
根據官方的《Qt for Windows – Building from Source》,自行建置 Qt SDK,除了需要 Visual Studio 2019 外,還需要下列工具:
- CMake 3.16+(官網)
- Ninja(官網)
- Perl(Heresy 這邊是用 Strawberry Perl)
- Python 3(官網)
而由於 Heresy 是想要透過 Docker 來建置 Qt,所以這邊需要的工具,也都是寫成 Dockerfile 來玩了~
下面就是一個可以用來建置 Qt 6.1.0 的 Dockerfile:
# escape=`
# Use the latest Windows Server Core image with .NET Framework 4.8.
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-20H2
# Restore the default Windows shell for correct batch processing.
SHELL ["cmd", "/S", "/C"]
# Download the Build Tools 2019 bootstrapper.
ADD https://aka.ms/vs/16/release/vs_buildtools.exe C:TEMPvs_buildtools.exe
ADD https://aka.ms/vs/16/release/channel C:TEMPVisualStudio.chman
# Install Build Tools excluding workloads and components with known issues.
RUN C:TEMPvs_buildtools.exe --quiet --wait --norestart --nocache `
--channelUri C:TEMPVisualStudio.chman `
--installChannelUri C:TEMPVisualStudio.chman `
--installPath C:BuildTools `
--add Microsoft.VisualStudio.Workload.VCTools `
--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
--add Microsoft.VisualStudio.Component.VC.ATLMFC `
--add Microsoft.VisualStudio.Component.Windows10SDK.19041
# Install 7-Zip
ADD https://www.7-zip.org/a/7z1900-x64.exe C:TEMP7z.exe
RUN C:TEMP7z.exe /S /D=C:7Zip
# Download CMake
ADD https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2-windows-x86_64.msi C:TEMPcmake.msi
RUN C:TEMPcmake.msi /qn
# Install Perl
ADD https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.msi C:TEMPstrawberry-perl.msi
RUN C:TEMPstrawberry-perl.msi /qn
# Install Python
ADD https://www.python.org/ftp/python/3.9.5/python-3.9.5-amd64.exe C:TEMPpython.exe
RUN c:temppython.exe /quiet InstallAllUsers=1 PrependPath=1
# Download ninja
ADD https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-win.zip C:TEMPninja.zip
RUN C:7Zip7z.exe x C:TEMPninja.zip -y -oc:ninja
# clean download files
RUN del C:TEMP* /q
# add PATH
RUN setx /M "path" "%path%;c:ninja;C:7Zip;C:Strawberryperlbin;C:Program FilesCMakebin"
# Start developer command prompt with any other commands specified.
ENTRYPOINT c:BuildToolsVCAuxiliaryBuildvcvars64.bat &&
之後只要執行:
docker build -t qtbuilder S:qtbuilder
就可以建立出一個名為「qtbuilder」的 Docker image,可以用來建置 Qt SDK 了。
當然,如果不想用 Docker 來建置,也可以把上述軟體都直接裝在電腦上來建置,不過記得要設置環境路徑、讓系統能找到上述的程式執行檔就是了。
建置流程
準備建置
接下來,就是要開始建置了~這邊首先是要把 Qt 的原始碼解壓縮。
這裡下載的檔案是「qt-everywhere-src-6.1.0.zip」,假設是把它解壓縮後放到「s:qt-everywhere-src-6.1.0」。
然後,就是建立 Docker 的容器、在裡面準備來建置了~
docker run -it --rm --isolation process --storage-opt size=64G
-v S:qt-everywhere-src-6.1.0:c:code
qtbuilder cmd
這邊就是 Qt 的原始碼對應到 Docker 內的 c:code 這個路徑來做存取;所以如果路徑不一樣的話,請自行修改紅字的部分。
另外要注意的,是由於建置 Qt 會需要大量的磁碟空間,所以這邊也有透過「–storage-opt size=64G」這個參數,調高 Docker 內部的磁碟空間(預設應該是 20GB)、否則建置到一半就會碰到磁碟空間不足的問題;如果不想用預設的內部空間玩的話,那就要自己額外去控制 volume mapping、並修改相對的路徑了。
在進入 Docker 後,則是先執行下面的指令:
mkdir c:build_debug c:build_release cd c:code_output cd c:build_debug c:codeconfigure -prefix c:code_output -debug cd c:build_release c:codeconfigure -prefix c:code_output -release
這邊會建立三個資料夾、build_debug、build_release 和 _output,前面兩個是用來放置建置過程的相關檔案的,一個是 debug 版、一個則是 release 版。
後者則是最後產生的 Qt SDK 檔案,這邊放在 c:code 裡面是為了把最後需要的檔案放在 「s:qt-everywhere-src-6.1.0」這個從外部對應進來的資料夾裡面;如果像另外兩個資料夾一樣直接放在 c: 下的話,一關閉 docker 容器就會全部消失了。
而 configure 的部分,則是透過 Qt 提供的腳本,來產生 CMake 建置所需要的檔案;這邊的「-prefix c:code_output」是指定建置後要把檔案放到哪裡;最後面的「-debug」或「-release」則是告訴它要建置 debug 或 release。
如果只想建置 debug、release 其中一個,那就只要選其中一個就好。
其他的參數,則可以參考官方的文件。
開始建置
上面的 configure 完成後,就可以依序建置不同的版本了。
以 debug 板來說,就是執行:
cd c:build_debug cmake --build . cmake --install .
開始建置 Qt SDK 的 debug 了。
由於 Qt 本身算是相當肥大的函式庫,所以這邊的建置過程會很花時間,建議找一台好一點的閒置電腦來跑。
其中,cmake –build 是開始建置,建置完成後,建置好的檔案會散落在各地很難處理;所以接下來就是執行 cmake –install,要求他把必要的檔案、複製(安裝)到之前指定的輸出位置(_output)、方便後續使用。
而 Heresy 這邊是刻意把 debug 和 release 版的輸出路徑設成一樣,這樣在執行過後,就會把兩者的產出結果都放在一起了。
所以等 debug 版建置好後,只要再執行:
cd c:build_release cmake --build . cmake --install .
就可以建置 release 版了。
當兩者都完成後,就可以關掉 docker 了;此時,在「S:qt-everywhere-src-6.1.0_output」下就可以找到建置完的 Qt 6.1.0 SDK 了~
不過 Heresy 這邊建置出來的檔案、整個資料大小高達 2.6GB 左右…恩,很可怕呢~ XD
附註:
-
下載的 Qt 6.1.0 裡面的 README 還是寫 Qt5… orz
裡面寫的需求也不一樣。 -
Qt 提供的 configure 雖然可以指定「-debug-and-release」要求同時建置 debug 和 release 的版本;但是儘管在建置(cmake build)的過程的確同時建置了兩個版本,但是在要求他把檔案複製到輸出路徑的時候(cmake install),他卻只複製了 release 版…
所以這邊還是採用個別建置的方法。