DTK入门指引
一、必要的准备
1. 快速开始
编译方法适用于 deepin-20,UOS20。
建议准备一个干净的虚拟机环境,下面的安装过程都可以不看,直接执行后面的脚本。
如果你需要掌握详细的构建流程,那么请一步一步往下看。
2. 激活系统并取得 root 权限
Deepin 社区版的可以直接获取root权限进行开发, DTK 桌面系统适用于 UOS 各个版本;
UOS 专业版可以直接获取试用期激活,个人版会联网自动激活,在设置中心进入开发者模式,以使用 root 权限进行开发;
3. 安装开发环境
sudo sed -i "s%#deb-src%deb-src%g" /etc/apt/sources.list
sudo apt update
sudo apt install git qtcreator qt5-default build-essential
安装期间有很多提示:dpkg-query: 软件包 xxxx 没有被安装。忽略即可。
安装期间会有弹窗提示,要选 yes。
注意,apt 使用官方的源获取,请勿手动修改源。
二、DTK 环境配置
1. 项目源码获取
DTK 用到的主要是 dtkcore,dtkwidget,dtkgui,qt5integration 这几个库。
git 的代码你可以同步到 gitee 进行下载,替换成你自己的链接即可。
- git 获取:
clone_uri="https://github.com/linuxdeepin"
clone_list="dtkcore dtkgui dtkwidget qt5integration";
for i in $clone_list; do git clone $clone_uri/$i.git; done;
- apt 获取:
apt source dtkcore dtkwidget dtkgui qt5integration
每个项目都可以独立编译,项目所依赖的环境,可以在以下位置的 control 文件里面找到:
find . -name "control"
./dtkwidget-5.4.16/debian/control
./qt5integration-5.1.11/debian/control
./dtkcore-5.4.13/debian/control
./dtkgui-5.4.13/debian/control
查看依赖项:
head -n 20 ./dtkwidget-5.4.16/debian/control
Build-Depends 后面这些就是该项目所依赖的包,可以使用 apt 命令全部安装,后面有更便捷的方法去安装这些依赖:
Source: dtkwidget
Section: libdevel
Priority: optional
Maintainer: Deepin Packages Builder [email protected]
Build-Depends: debhelper (>= 9), pkg-config, libudev-dev, libqt5x11extras5-dev, libxext-dev, qttools5-dev-tools, x11proto-xext-dev, libxcb-util0-dev, libstartup-notification0-dev, libmtdev-dev, qtbase5-private-dev, libegl1-mesa-dev, libudev-dev, libfontconfig1-dev, libfreetype6-dev, libglib2.0-dev, libxrender-dev, libdtkcore-dev, libgsettings-qt-dev, libqt5svg5-dev, libxi-dev, libdtkgui-dev, libcups2-dev, libgtest-dev
2. 安装依赖
使用一行命令安装以上全部的依赖:
sudo apt build-dep dtkcore dtkwidget dtkgui qt5integration
三、编译及运行
1. 手动编译的方法
从git获取的代码,使用命令行编译的方法:
cur_dir=`pwd` dtk_list="dtkcore dtkgui dtkwidget qt5integration"; for i in $dtk_list; do mkdir -p $i/build; cd $i/build; qmake ../*.pro CONFIG+=debug && make -j4 && cd $cur_dir; done;
也可以打开 qtcreator 直接编译,其它几个项目也是一样的。
打开的项目的时候注意要选择 debug 版本:
cd qt5inteegration && nohup qtcreator *.pro
编译成功以后,可以运行如下几个示例程序:
# qt5inteegration 示例的生成目录: ./qt5inteegration/bin/styles
dtkwidget 示例的生成目录:
./dtkwidget/examples/dwidget-examples/collections/collections
dtkgui 示例的生成目录: ./dtkgui/bin/taskbar
> 下面是一些有用的命令,可能对你有帮助:
sudo apt --fix-broken install # 如果安装的时候遇到版本问题可修复后重新安装 apt depends deepin-sdk # 查看库之间的依赖关系 apt depends libdtkwidget-dev # 带 dev 的是编译时库,不带 dev 的是运行时库 apt policy deepin-sdk # 查看当前版本和最新可安装版本
## 2. 自动化编译运行脚本
该脚本是从 apt 源里面获取源码。如果有提交代码的需要请从 git 上获取代码。
将以下内容保存到桌面上的 build.sh 里面:
#!/bin/sh
DTK主要就是下面几个库
DTK_LIST="dtkcore dtkwidget dtkgui qt5integration"
1.更改源以获取 DTK 源码、相关依赖软件
sudo sed -i "s%#deb-src%deb-src%g" /etc/apt/sources.list sudo apt update
2.安装 git、Qt、编译工具集
sudo apt -y install git qtcreator qt5-default build-essential
3. 安装 DTK 依赖环境
sudo apt -y build-dep $DTK_LIST
4.在桌面创建目录存放源码
WORK_SPACE=~/Desktop/DTK_SRC && mkdir -p $WORK_SPACE && cd $WORK_SPACE
5.下载代码
apt source $DTK_LIST
6.建立 build 目录并编译
SRC_LIST=$(find . -maxdepth 1 -mindepth 1 -type d) for proj in $SRC_LIST; do mkdir -p $proj/build && cd $proj/build; qmake ../*.pro CONFIG+=debug && make -j4 && cd $WORK_SPACE; done;
7. 查看编译产物
find . -perm /111 ! -type d ! -name "*.[[:digit:]]" ! -regex ".*(.svg|.sh|.json)" # 全部可执行文件、动态库等
echo "======================编译完成========================"
dtkgui、dtkwidget 的示例以及全部的库整合到 qt5integration 里面所写的示例程序:
echo "示例程序:" EXAMP=$(find . -type f -perm /111 -regex ".*(collections|styles|taskbar)") echo "$EXAMP"
echo "动态库:" find . -name "*.so" echo "单元测试:" find . -type f -perm /111 -name "tests"
运行示例程序,必须是桌面环境才行,不能是 ssh 连接虚拟机
if [ -n $DISPLAY ] then for exe in $EXAMP; do $exe & done; fi
> 将以上内容保存并执行:`sh ./build.sh`(注意不要加sudo,手动输入密码)。
如果有基于 DTK 的库开发自己的应用程序的需要,则可以使用以下命令安装 DTK 的库:
sudo apt -y install deepin-sdk # 就是安装已编译好的 dtkcore、dtkgui、dtkwidget 库
## 3.常见问题
* 如果某个项目第一次编译失败了,依赖安装后不能直接编译,要清空源码,或者执行 git clean -dfx 清空生成的文件再次去编译才行。
* 更安全的做法:树外编译,即单独建立 build 目录,在里面执行: `qmake ..`,不会污染源码。
* 遇到版本不兼容的问题导致安装失败,执行 sudo apt --fix-broken install 后再次安装就可以了。
* 一般来说,不要超过 4 线程去编译源码,除非依赖关系非常严格且明确(实际上自动生成Makefile往往很难严格的保证这一点),否则部分情况下可能会编译失败,需要全部清空重来。
* 注意使用 qtcreator 打开的时候要选debug版本才会有图形界面,否则只有单元测试:
![](/upload/1619660301659131853.png)
* 使用命令行编译时,qmake 后面要加 CONFIG+=debug,否则没有示例程序只有单元测试:
![](/upload/1619660308265930786.png)