LLVM 9.0 Clang、Flang及工具的详细安装过程

??LLVM 10.0.0是当前的最新版,从2020/3/24开始提供下载,在此记录的是LLVM 9.0.0版本的安装,其发布时间是2019/9/19,前端clang版本是9.0.0。由于安装的时候属于最新版本,前端只能安装Clang,为了安装Flang前端,遇到太多的问题,踩了太多的坑,以至于当时我们两个人搞了好几天才安装上,在此记录一下安装过程,并且感谢当时和我一起安装软件的师兄!

0、准备

??LLVM其官网下载地址为:https://releases.llvm.org/download.html#9.0.0 ,在此以centos源码安装为例。刚开始先从官网下载指定版本源码:
1

??在目录下新建llvm-project-9.0.0文件夹存放下载的源码。但是从源码你就会发现LLVM官网只提供给了C-like的前端Clang,并没有提供Fortran的前端gfortran或者Flang,从GitHub上找到开源的Fortran前端Flang and F18,其中F18是一个新的Fortran前端,我在安装之后使用的时候一直存在问题,后来还是继续使用Flang,大家可以去尝试一下。

??flang-compiler/flang的GitHub地址为:https://github.com/flang-compiler/flang ,需要注意的是:当前的Flang由三个部分组成:flang、flang-driver、llvm

  • flang:是产生LLVM IR的编译器前端和中端的源代码,地址:https://github.com/flang-compiler/flang
  • flang-driver:是从clang派生的驱动程序,地址:https://github.com/flang-compiler/flang-driver
  • llvm:该LLVM是LLVM的一个分支,具有与Fortran相关的增强功能

??把以上三个文件源码下载到llvm-project-9.0.0文件夹中,三个文件一个不能少。若你只需要使用到Clang前端的话从LLVM官网下载的源码就足够了,若你还需要Flang前端的话,就需要采用这里下载的这个LLVM进行安装,而不是LLVM官网下载的llvm-9.0.0.src.tar.xz这个文件!安装时需要注意。

1、建立安装脚本

??安装过程需要使用到GCC,在此使用的GCC是gcc-8.2.0,编译时也使用了Ninja。关于Ninja的安装使用在Ninja安装和基本使用有相关介绍。

  1. step0.sh,配置选项
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash                                        
INSTALL_PREFIX=/home/zgl/llvm-9.0.0     //安装路径
GCC_DIR=/home/zgl/gcc-8.2.0-exe         //gcc的安装位置
 
CMAKE_OPTIONS="-G Ninja \               //Ninja配置选项
   -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
   -DLLVM_CONFIG=$INSTALL_PREFIX/bin/llvm-config \
   -DCMAKE_CXX_COMPILER=$INSTALL_PREFIX/bin/clang++ \
   -DCMAKE_C_COMPILER=$INSTALL_PREFIX/bin/clang \
   -DCMAKE_Fortran_COMPILER=$INSTALL_PREFIX/bin/flang \
   -DCMAKE_BUILD_TYPE=Release \
   -DLLVM_TARGETS_TO_BUILD=X86"
  1. step1.sh,llvm参数
1
2
3
4
5
6
7
8
#!/bin/bash
 . step0.sh

cd ./llvm
mkdir  build && cd build
cmake $CMAKE_OPTIONS -DLLVM_ENABLE_PROJECTS=lld -DCMAKE_C_COMPILER=$GCC_DIR/bin/gcc -DCMAKE_CXX_COMPILER=$GCC_DIR/bin/g++ ..
ninja -j 64
ninja install
  1. step2.sh,flang-driver参数
1
2
3
4
5
6
7
8
#!/bin/bash
 . step0.sh

cd ./flang-driver
mkdir -p build && cd build
cmake $CMAKE_OPTIONS -DCMAKE_C_COMPILER=$GCC_DIR/bin/gcc -DCMAKE_CXX_COMPILER=$GCC_DIR/bin/g++ ..
ninja -j 32
 ninja install

  1. step3.sh,flang参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
 . step0.sh

(cd ./flang/runtime/libpgmath
mkdir -p build && cd build
cmake $CMAKE_OPTIONS ..
ninja -j 32
ninja install)

cd ./flang
mkdir -p build && cd build
cmake $CMAKE_OPTIONS -G "Unix Makefiles"  ..
make -j 16
make install

以上就是安装时需要的主要脚本,关于其它工具openmplibcxxabilibcxxlibunwindtest-suite等可根据需要进行安装,而且安装过程也较简单。

2. 安装和使用

??建立了安装脚本之后,安装过程也就非常简单了,从step0.sh开始依次执行安装便可。安装完成之后在安装目录下的bin中可查看安装的内容,如下所示:
2

使用的时候同样需要先source环境,使用clang -v查看到信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[zgl@aoide ~]$ clang -v
clang version 9.0.0
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/zgl/llvm-9.0.0/bin
Found candidate GCC installation: ......
Found candidate GCC installation: ......
Found candidate GCC installation: ......
Found candidate GCC installation: ......
Found candidate GCC installation: ......
Selected GCC installation: ......
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64

对于如下test.c测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct si{
    long pot;
    int or;
    long *x;
    int *y;
    double z;
    int h;
    char c;
    short sh;
};
struct t{
    char str;
    int val;
    struct si s;
    double a;
};
int main(){
    typedef struct si arc;
    register arc *arcs;
    printf("%lu\n",sizeof(struct si));        
    return 0;
}

使用clang size.c -o size.put./size.put便能得到结果:48
对于如下hello.f90测试代码:

1
2
3
program hello
    print *, "Fortran: Hello World!"
end program hello

使用flang hello.f90 -o hello.out./hello.out便能得到结果:Fortran: Hello World!

注意事项

  • 前面也说到,若你只需要使用到Clang前端的话从LLVM官网下载的源码就足够了,若你还需要Flang前端的话,就需要采用flang相关的LLVM进行安装,而不是LLVM官网下载的llvm-9.0.0.src.tar.xz这个文件。
  • 安装时需要先安装llvm,再安装clang或者flang-driver。
  • 其他一些由于系统库版本或是其它原因在此也不做说明了。