1、docker内部只有wget以及git命令

项目需要,得更新docker容器中的gcc和LLVM版本但是由于没有预先安装apt、apt-get以及yum,导致很多安装过程就是鸡生蛋蛋生鸡反应。暂时没有找到合适的解决的方法,如果有大佬知道的话,欢迎留言哈(跪谢😉)
目前的解决方案就是绕过常规的shell脚本或者apt命令,直接从github上拉去源码进行本地的编译安装。

环境:

  • Win11-WLS2-Ubuntu20.04
  • Docker

2、安装gcc(trunk)版本

首先在github上克隆下gcc的项目:

git clone https://github.com/gcc-mirror/gcc.git

接着,按照参考资料说是要安装flex依赖,但是我已经装过了(况且我也没有flex就是了),此步骤因人而异:

apt install flex

然后就是进入下载的项目目录进行一些必要的配置:

cd gcc
./contrib/download_prerequisites

下一步需要自己构建build文件夹,进入并在其中进行一些配置:

mkdir build && cd build

配置这边我是参考的教程,但是应该是可以自己定义一些私人化设置的

../configure -v \
  --build=x86_64-linux-gnu \
  --host=x86_64-linux-gnu  \
  --target=x86_64-linux-gnu \
  --enable-checking=no      \
  --enable-languages=c,c++  \
  --disable-multilib        \
  --prefix=/usr/local       \
  --disable-bootstrap

make -j$(nproc)

最后执行安装:

make install

安装成功(貌似)

docker 内安装git docker 安装gcc_LLVM

gcc的安装路径为usr/local/bin

docker 内安装git docker 安装gcc_docker_02

3、安装LLVM

3.1 编译安装版本

步骤:
1、 拉取LLVM项目并进入项目目录

git clone https://github.com/llvm/llvm-project.git
cd llvm-project

2、创建并进入build文件夹

mkdir build && cd build

3、一些编译选项
具体参数含义官方有给英文解释,具体也可以参考这篇官方安装教程

cmake -G Ninja -DCMAKE_BUILD_TYPE="Release" -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;compiler-rt" -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_ENABLE_RTTI=ON  -DLLVM_ENABLE_EN=ON  -DCMAKE_INSTALL_PREFIX="/usr" ../llvm

有一个选项,看到新的安装教程里面没有:
-DLLVM_ENABLE_RTTI=ON
4、用ninja开始编译

ninja && ninja install -j1# 这里可以根据自己虚拟机分配的内核数量将1改为2、3、4……但是基于拉跨的内存,设置为1了就

于是开始了漫长的等待,(大概是一个多小时,具体要看计算机性能了
5、最后检验一下自己是否安装成功

echo $? # 输出0表示编译过程没有出错
echo $PATH # 表示安装路径
llvm-as --version # 显示版本

docker 内安装git docker 安装gcc_docker 内安装git_03

我们可以进入安装目录查看安装结果:

docker 内安装git docker 安装gcc_git_04

3.1.1 遇到的BUG

docker 内安装git docker 安装gcc_git_05


c++: fatal error: Killed signal terminated program cc1plus compilation terminated. 遇到的问题是内存不足的问题

3.1.1.1 失败的尝试——在docker容器内重新设置swap大小

退出容器,用最高权限重新激活进入容器

docker run -it --privileged=true mydce:v1.4 bash

运行以下命令:

docker 内安装git docker 安装gcc_LLVM_06


可以看到,并没有改变容器内的实际分区大小

3.1.1.2 成功的尝试——在docker容器外重新设置swap大小

docker 内安装git docker 安装gcc_git_07


可以看到确实有改变了虚拟机的swap空间,下面激活容器看看容器有无变化

docker 内安装git docker 安装gcc_docker 内安装git_08


可以看到,docker容器内的swap分区也增加了(看来是伴随虚拟机的主设置的🤣)

虚拟机中运行的命令具体如下:

sudo su
dd if=/dev/zero of=/swapfile bs=1G count=16
#空间大小是bs*count=16G,可以改成自己想要的,一开始设置为6,但是进度3/4的时候又报同样的错误了
mkswap /swapfile
chmod 0600 /swapfile  
swapon /swapfile
#使用刚才创建的swap空间
3.1.1.3 WLS空间不够的问题

谁知道呢,安装完LLVM之后,再装GCC结果中途报错退出,再看C盘,直接200G内存给我干没了(于是狼狈开始清理WLS2占用的C盘空间)

罪魁祸首:

docker 内安装git docker 安装gcc_docker 内安装git_09

diskpart
select vdisk file="C:\Users\moumo\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

但是效果不明显2333,尝试了多次,甚至一气之下删除ubuntu所有镜像文件再执行相关命令还是无用,只能含泪删除ubuntu子系统(需要在cmd中取消注册的),将C盘下的硬盘映像文件一并删除(好了,重装了适合15.0的ubuntu18.04版本,准备继续开坑)

3.2 pre-build版本

由于没有找到对应Ubuntu20.04版本的,所以没有使用,具体可以查看官网

参考资料

  1. 安装GCC trunk 版本
  2. 管理WSL中的磁盘大小
  3. WSL2-ubuntu20.04安装LLVM 15 记录贴