Skip to content

Latest commit

 

History

History
157 lines (146 loc) · 11.4 KB

统信UOS下编译skia.md

File metadata and controls

157 lines (146 loc) · 11.4 KB

统信UOS下编译Skia源码的方法

  • 修改日期:2025-02-08
  • 操作系统:UOS 20 专业版(1070) 64位版本
  • 编译器可选择:LLVM
  • 操作过程中,源码根目录是/home/develop目录,如果使用其他目录,可替换为实际的目录
  • 说明1:该编译Skia源码的方法,是为了适配nim duilib 项目使用Skia库,如果用于其他库使用,可能需要修改编译参数
  • 说明2:最新的编译方法中,不再使用Skia中依赖的第三方库,所以不再需要运行python3 tools/git-sync-deps来获取第三方库的源码

一、准备工作

(说明:系统提供的开发工具版本比较低,不能满足要求,需要使用源码编译开发工具的最新版,包括gcc/g++、llvm/clang/clang++、gn等)

  1. 安装完成系统后,可用升级系统到最新:
    (1)升级系统:sudo apt update
    (2)升级系统:sudo apt upgrade
  2. 安装gcc/g++: 系统中用sudo apt install gcc g++安装,安装后的版本号为:8.3.0;
    这个版本太低,不能用于编译skia和nim_duilib,需要手工编译最新版的gcc/g++,详见后续文档;
  3. 安装gdb: 系统中用sudo apt install gdb安装,安装后的版本号为:8.2.1;
  4. 安装make: 系统中用sudo apt install make安装,安装后的版本号为:4.2.1;
  5. 安装cmake: 系统中用sudo apt install cmake安装,安装后的版本号为:3.22.1;
  6. 安装git:系统中用sudo apt install git安装,安装后的版本号为:2.20.1;
  7. 安装ninja:系统中用sudo apt install ninja-build安装,安装后的版本号为:1.8.2-1;
  8. 编译安装最新版本的binutils(因系统自带的版本较低,使用ld/gold链接gcc/g++/llvm/clang/clang++的时候,会遇到错误)
    (1)创建源码目录:cd /home/develop; mkdir src
    (2)设置工作目录:cd /home/develop/src
    (3)下载源码:wget https://ftp.gnu.org/gnu/binutils/binutils-2.43.1.tar.gz
    (4)解压源码:tar -xzf binutils-2.43.1.tar.gz
    (5)进入源码目录:cd binutils-2.43.1
    (6)运行配置脚本:./configure --prefix=/home/develop/install/binutils-2.43.1/ --disable-werror --enable-gprofng=no
       备注:使用--enable-gprofng=no选项是因为gprofng的源码有编译错误。
    (7)编译:make
    (8)安装:make install
  9. 从源码编译安装python3的较新版本(3.13.0),因系统自带的版本(3.7.3)太低,无法编译llvm,所以必须升级
    (1)设置工作目录:cd /home/develop/src
    (2)下载源码:wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tar.xz
    (3)解压源码:tar -xJf Python-3.13.0.tar.xz
    (4)进入源码目录:cd Python-3.13.0
    (5)运行配置脚本:./configure --prefix=/home/develop/install/Python-3.13.0/
    (6)编译:make
    (7)安装:make install
       备注:make install 时会遇到错误,但不影响。
  10. 从源码编译安装gcc/g++ 的较新版本(14.2.0),因系统自带的版本太低,必须升级
    (0)编译资源需求:4GB内存,磁盘空间:12GB
    (1)设置工作目录:cd /home/develop/src
    (2)下载源码:wget https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.gz
    (3)解压源码:tar -xzf gcc-14.2.0.tar.gz
    (4)下载gcc依赖的第三方库:进入gcc-14.2.0目录,然后下载依赖的第三方库
      cd /home/develop/src/gcc-14.2.0
      ./contrib/download_prerequisites
    (5)配置(说明:由于UOS自带的ld(v2.31.1)链接gcc/g++时失败,所以使用源码编译安装的最新版ld(v2.43.1)):
      mkdir -p /home/develop/src/gcc-14.2.0.build
      cd /home/develop/src/gcc-14.2.0.build
      export LD="/home/develop/install/binutils-2.43.1/bin/ld"; ../gcc-14.2.0/configure --prefix=/home/develop/install/gcc-14.2.0 --disable-multilib --enable-ld --enable-bootstrap
      注意:运行configure的过程中,如果遇到错误,请留意系统的安全拦截提示,按照安全拦截提示,允许任意程序执行即可。
    (6)编译:make -j 12 多进程编译,编译参数可参考电脑实际有几个核心。
    (7)安装:make install
    (8)设置环境变量,以使新版gcc/g++可用(将下列内容放在/home/develop/source.sh文件中,便于使用:source /home/develop/source.sh):
#!/bin/bash
# python3 
export PATH=/home/develop/install/Python-3.13.0/bin/:$PATH

# binutils
export PATH=/home/develop/install/binutils-2.43.1/bin/:$PATH

# gcc/g++ 14.2
export PATH=/home/develop/install/gcc-14.2.0/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/gcc-14.2.0/lib64/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$CPLUS_INCLUDE_PATH
  1. 从源码编译安装llvm/clang/clang++的较新版本(19.1.3),因系统自带的版本太低,必须升级
    (0)编译资源需求:16GB内存,
    (1)设置工作目录:cd /home/develop/src
    (2)下载源码:wget https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-19.1.3.tar.gz
    (3)解压源码:tar -xzf llvmorg-19.1.3.tar.gz
    (4)使用gcc/g++最新版:source /home/develop/source.sh
    (5)生成编译配置:cmake -S ./llvm-project-llvmorg-19.1.3/llvm/ -B ./llvm-project-llvmorg-19.1.3.build -G Ninja -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/home/develop/install/gcc-14.2.0/bin/gcc -DCMAKE_CXX_COMPILER=/home/develop/install/gcc-14.2.0/bin/g++ -DCMAKE_INSTALL_PREFIX=/home/develop/install/LLVM-19.1.3
    (6)编译源码:ninja -C ./llvm-project-llvmorg-19.1.3.build
    (7)安装:ninja -C ./llvm-project-llvmorg-19.1.3.build install
    (8)设置环境变量,以使新版llvm/clang/clang++可用(将下列内容放在/home/develop/source.sh文件中,便于使用:source /home/develop/source.sh):
#!/bin/bash
# python3 
export PATH=/home/develop/install/Python-3.13.0/bin/:$PATH

# binutils
export PATH=/home/develop/install/binutils-2.43.1/bin/:$PATH

# gcc/g++ 14.2
export PATH=/home/develop/install/gcc-14.2.0/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/gcc-14.2.0/lib64/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$CPLUS_INCLUDE_PATH

# llvm/clang/clang++
export PATH=/home/develop/install/LLVM-19.1.3/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/LLVM-19.1.3/lib/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/LLVM-19.1.3/include/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/LLVM-19.1.3/include/:$CPLUS_INCLUDE_PATH
  1. 从源码编译安装gn(没找到系统自带的,所以从源码编译):
    (1)设置工作目录:cd /home/develop/src
    (2)下载源码:git clone https://github.com/rhett-lee/gn.git
    (3)进入源码目录:cd /home/develop/src/gn
    (4)使用gcc/g++最新版:source /home/develop/source.sh
    (5)生成编译配置:export CXX=g++; python3 build/gen.py
    (6)编译源码:ninja -C out
    (7)设置环境变量,以使gn可用(将下列内容放在/home/develop/source.sh文件中,便于使用:source /home/develop/source.sh):
#!/bin/bash
# python3 
export PATH=/home/develop/install/Python-3.13.0/bin/:$PATH

# binutils
export PATH=/home/develop/install/binutils-2.43.1/bin/:$PATH

# gcc/g++ 14.2
export PATH=/home/develop/install/gcc-14.2.0/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/gcc-14.2.0/lib64/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$CPLUS_INCLUDE_PATH

# llvm/clang/clang++
export PATH=/home/develop/install/LLVM-19.1.3/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/LLVM-19.1.3/lib/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/LLVM-19.1.3/include/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/LLVM-19.1.3/include/:$CPLUS_INCLUDE_PATH

# gn
export PATH=/home/develop/src/gn/out/:$PATH
  1. 安装libfontconfig开发库(Skia依赖该库):sudo apt install libfontconfig1-dev,安装后版本号为2.13.1.1-2+sign
  2. 安装OpenGL:sudo apt install libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev

二、获取skia源码及相关依赖

  1. > cd /home/develop
  2. > git clone https://github.com/google/skia.git
  3. > git checkout 8e83e49cba3a28671d07661d88bddc3e84ae132d
  4. 备注:skia源码更新的日期:Date: 2025/2/8 1:12:45
  5. 更新修改代码:
  • 下载需要更新的代码到本地:git clone https://github.com/rhett-lee/skia_compile
  • 更新文件:解压Skia.2025-02-08.src.zip,将解压后的文件,覆盖/home/develop/skia/目录中的所有同名文件。
  • 注意事项:该修改的代码的SHA-1值,需要比对,如果不是这个版本的代码,直接覆盖可能有问题,需要手工修改;
  • 修改代码解决的问题:修改部分其他源码:修复运行时的几个小问题。

三、编译skia(编译器:LLVM)

  1. 进入skia源码目录:
    > cd /home/develop/skia
  2. 使用clang/clang++最新版:source /home/develop/source.sh
  3. 编译skia静态库(LLVM.x64.Release)
  • gn gen out/LLVM.x64.Release --args="target_cpu=\"x64\" cc=\"clang\" cxx=\"clang++\" clang_win_version=\"17\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\"]"
  • ninja -C out/LLVM.x64.Release

四、编译skia(编译器:gcc/g++,如果不使用LLVM编译器,也可选择用gcc/g++编译)

  1. 进入skia源码目录:
    > cd /home/develop/skia
  2. 使用gcc/g++最新版:source /home/develop/source.sh
  3. 编译skia静态库(LLVM.x64.Release)
  • gn gen out/LLVM.x64.Release --args="target_cpu=\"x64\" cc=\"gcc\" cxx=\"g++\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\"]"
  • ninja -C out/LLVM.x64.Release