LLVM 10.0.0是当前的最新版,从2020/3/24开始提供下载,在此记录的是LLVM 9.0.0 Release版本的安装(Debug 版本安装相同,参见step0.sh
中-DCMAKE_BUILD_TYPE=
),其发布时间是2019/9/19,前端clang版本是9.0.0。由于安装的时候属于最新版本,前端只能安装Clang
,为了安装Flang
前端,遇到太多的问题,在此记录一下安装过程,并且感谢当时和我一起安装软件的师兄!
0、准备
LLVM其官网下载地址为:https://releases.llvm.org/download.html#9.0.0 ,在此以centos源码安装为例。刚开始先从官网下载指定版本源码:
在目录下新建llvm-project-9.0.0
文件夹存放下载的源码。但是从源码你就会发现LLVM官网只提供给了C-like的前端Clang
,并没有提供Fortran的前端gfortran
或者Flang
,从GitHub上找到开源的Fortran前端Flang and F18
,其中F18是一个新的Fortran前端,我在安装之后使用的时候一直存在问题,后来还是继续使用Flang
,大家可以去尝试一下使用F18。
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相关的增强功能,地址:https://github.com/flang-compiler/llvm
该LLVM下载时注意选择你需要安装的对应版本,如下:
把以上三个文件源码下载到llvm-project-9.0.0
文件夹中,替换官网下载的llvm和clang源码,这里的三个文件一个不能少。若你只需要使用到Clang
前端的话从LLVM官网下载的源码就足够了,若你还需要Flang
前端的话,就需要采用这里下载的这个LLVM进行安装,而不是LLVM官网下载的llvm-9.0.0.src.tar.xz
这个文件!安装时需要注意。
1、建立安装脚本
安装过程需要使用到GCC,在此使用的GCC是gcc-8.2.0
,编译时也使用了Ninja
。关于Ninja的安装使用在Ninja安装和基本使用有相关介绍。
- step0.sh,配置选项
#!/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"
- step1.sh,llvm,需要注意lld文件的东西必须有(llvm官网下载)
#!/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
- step2.sh,flang-driver
#!/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
- step3.sh,openMP
#!/bin/bash
. 0-setup.sh
cd ./openmp
mkdir -p build && cd build
cmake $CMAKE_OPTIONS ..
ninja -j 16
ninja install
- step3.sh,flang
#!/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
以上就是安装时需要的主要脚本,关于其它工具openmp
、libcxxabi
、libcxx
、libunwind
、test-suite
等可根据需要进行安装,而且安装过程也较简单。
2. 安装和使用
建立了安装脚本之后,安装过程也就非常简单了,从step1.sh
开始依次执行安装便可。安装完成之后在安装目录下的bin中可查看安装的内容,如下所示:
使用的时候同样需要先source环境,使用clang -v
查看到信息如下:
[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测试代码:
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测试代码:
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。
- 注意glibc问题和DCMAKE设置等。