DTK入门指引
2022-04-18 10:56:07

一、必要的准备

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 packages@deepin.com
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)