简介
编译mesa需要用到meson,meson要用最新版本的才能支持mesa中的meson.build新语法。所以我们要手动安装meson,但是最新的meson的版本又需要依赖3.8以上的python。
如果你的ubuntu自带的python没有3.8以上,卸载python再安装python3.8又可能会破坏原先的系统环境。
一般我们会使用virtualenv来搭建特定版本的python的运行环境,去编译运行,但是我这里出现的3.8版本的virtualenv 运行的python一直是ubuntu自带3.6。
为了避免其他同时搭建mesa编译环境出现和我一样的问题,还是弄了个docker环境,内部仅运行一个python版本。
提示
以下全凭记忆编写,个中细节,参考者自行补全
一、创建docker容器
1. docker安装
sudo apt install docker.io
2. 修改权限,不带sudo
docker用户组加上当前用户
sudo usermod -a -G docker `whoami`
sudo service docker restart
3. 获取镜像
选择一个最干净版本的ubuntu20.04,里面既没有python2,也没有python3
docker pull ubuntu:20.04
4. 创建并运行容器
# 创建容器 suchp-mesa是指容器的名称
docker create -it --name suchp-mesa ubuntu:20.04
# 运行容器 suchp-mesa
docker start suchp-mesa
# 进入容器中
docker exec -it suchp-mesa /bin/bash
二、安装python开发环境
此时的ubuntu中什么都没有, 我们需要先通过apt安装一个python版本,但是ubuntu默认源下载太慢,老三步走起来
1. 更新源
echo "网易镜像源,去百度找找" > /etc/apt/sources.list
apt update
apt list --upgradable
2. 安装工具
# 安装python,ubuntu22.04默认是3.8版本,我们先安装,等会就卸载了
apt install python3
# 安装git
apt install git
# 搞个vim吧
apt install vim-tiny
3. 下载pip源码
不直接下载python3-pip,因为依赖太多的,直接运行源码就可以了,pip运行依赖distutils这个库,也需要下载。
cd home
git clone https://github.com/pypa/pip.git
git clone https://github.com/pypa/distutils.git
直接进入pip目录运行 python src/pip会报错找不到distutils
,设置环境变量PYTHONPATH
就可以找到了。
export PYTHONPATH=/home/distutils
4. 下载安装virtualenv
下载
cd /home/pip
# virtualenv创建python虚拟运行环境
python3 src/pip install virtualenv
有了这个就可以创建独属于某特定版本的python运行环境了。我们在/home
目录下创建一个python3.8_venv
的目录用于保存python3.8的运行环境
cd /home
virtualenv python3.8_venv
进入python3.8的运行环境
cd /home/python3.8_venv
# 进入python虚拟开发环境
source bin/activate
# 退出python虚拟开发环境
deactivate
于是乎你就有了一个专门运行python3.8的环境,此时你可以卸载原来的python了
apt autoremove python3
安装setuptools
进入虚拟环境去安装setuptools,这个基本python必备
cd /home/python3.8_venv
source bin/activate
cd /home/pip
python3 src/pip install setuptools
deactivate
三、编译mesa
下载安装meson
cd /home/python3.8_env
source bin/activate
cd /home
git clone https://github.com/mesonbuild/meson.git
cd meson
# 编译meson
python3 setup.py build
# 安装meson到虚拟环境中
python3 setup.py install
下载mesa
cd /home
git clone https://github.com/mesa3d/mesa.git
cd mesa
修改meson_options.txt
@@ -71,7 +71,7 @@ option(
option(
'gallium-drivers',
type : 'array',
- value : ['auto'],
+ value : ['swrast'],
choices : [
'auto', 'kmsro', 'radeonsi', 'r300', 'r600', 'nouveau', 'freedreno',
'swrast', 'v3d', 'vc4', 'etnaviv', 'tegra', 'i915', 'svga', 'virgl',
@@ -88,7 +88,7 @@ option(
option(
'gallium-vdpau',
type : 'combo',
- value : 'auto',
+ value : 'disabled',
choices : ['auto', 'true', 'false', 'enabled', 'disabled'],
description : 'enable gallium vdpau frontend.',
)
@@ -101,7 +101,7 @@ option(
option(
'gallium-xvmc',
type : 'combo',
- value : 'auto',
+ value : 'disabled',
choices : ['auto', 'true', 'false', 'enabled', 'disabled'],
description : 'enable gallium xvmc frontend.',
)
@@ -114,7 +114,7 @@ option(
option(
'gallium-omx',
type : 'combo',
- value : 'auto',
+ value : 'disabled',
choices : ['auto', 'disabled', 'bellagio', 'tizonia'],
description : 'enable gallium omx frontend.',
)
@@ -127,7 +127,7 @@ option(
option(
'gallium-va',
type : 'combo',
- value : 'auto',
+ value : 'disabled',
choices : ['auto', 'true', 'false', 'enabled', 'disabled'],
description : 'enable gallium va frontend.',
)
@@ -140,7 +140,7 @@ option(
option(
'gallium-xa',
type : 'combo',
- value : 'auto',
+ value : 'disabled',
choices : ['auto', 'true', 'false', 'enabled', 'disabled'],
description : 'enable gallium xa frontend.',
)
@@ -191,7 +191,7 @@ option(
option(
'vulkan-drivers',
type : 'array',
- value : ['auto'],
+ value : ['swrast'],
choices : ['auto', 'amd', 'broadcom', 'freedreno', 'intel', 'panfrost', 'swrast', 'virtio-experimental'],
description : 'List of vulkan drivers to build. If this is set to auto all drivers applicable to the target OS/architecture will be built'
)
@@ -294,7 +294,7 @@ option(
option(
'egl',
type : 'combo',
- value : 'auto',
+ value : 'disabled',
choices : ['auto', 'true', 'false', 'enabled', 'disabled'],
description : 'Build support for EGL platform'
)
构建编译
# 这里要修改的就多了
meson build
ninja -C build
四、总结
将容器打包成镜像,可以分享给其他同事运行了