方舟编译器HelloWorld

方舟编译器HelloWorld

方舟编译器已经开源,官网见

https://www.openarkcompiler.cn/home

根据官方文档进行操作

环境配置请阅读 Development_Preparation.md 文档

环境配置

硬件推荐配置

  • 2 GHz 双核处理器或者更高等级CPU

  • 2 GB 系统内存及以上

  • 200GB 可用磁盘空间

源码下载

下载地址:https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler/home,可以通过Clone or Download的方式下载openarkcompiler源码

注:默认源码下载目录为openarkcompiler

开发环境推荐

您需要安装一个64位版本的Ubuntu(推荐Ubuntu 16.04)

sudo apt-get -y install openjdk-8-jdk git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip lib32z1-dev qemu g++-multilib gcc-multilib libglib2.0-dev libpixman-1-dev linux-libc-dev:i386
sudo apt-get -y install gcc-5-aarch64-linux-gnu g++-5-aarch64-linux-gnu

安装Clang编译器并完成配置(用于编译方舟编译器代码)

下载clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04
LLVM下载地址:http://releases.llvm.org/download.html#8.0.0

放置到openarkcompiler/tools目录,打开openarkcompiler/build/config/BUILDCONFIG.gn文件,将GN_C_COMPILERGN_CXX_COMPILERGN_AR_COMPILER三个变量配置为Clang编译器所在路径,例如:

GN_C_COMPILER = "${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang"
GN_CXX_COMPILER = "${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang++"
GN_AR_COMPILER = "${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/llvm-ar"

其中${MAPLE_ROOT}为openarkcompiler源码根目录。

由于官方提供的地址(由于某种特殊原因墙)下载较慢,因此提供百度云下载地址

https://pan.baidu.com/s/1bGc-rC1gm8SeCiemJf01Hw

clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz

安装Ninja、GN 并完成配置

下载Ninja(v1.9.0)GN(Linux Version)
Ninja下载地址:https://github.com/ninja-build/ninja/releases
GN下载地址:https://archive.softwareheritage.org/browse/content/sha1_git:2dc0d5b26caef44f467de8120b26f8aad8b878be/raw/?filename=gn

将GN和Ninja可执行程序放置到openarkcompiler/tools目录,打开openarkcompiler/Makefile文件,将GN和NINJA两个变量配置为GN和Ninja可执行程序所在路径。例如:

GN := ${MAPLE_ROOT}/tools/gn/gn
NINJA := ${MAPLE_ROOT}/tools/ninja_1.9.0/ninja

由于官方提供的地址(由于某种特殊原因墙)下载较慢,因此提供百度云下载地址

GN的下载地址: https://pan.baidu.com/s/10x9XeVm0iN3fu2j6xgb4qw

Ninja的下载地址:https://pan.baidu.com/s/1TT0PN5d9t22_ubMWMURDDA

源码编译

在openarkcompiler目录下执行以下命令,编译出OpenArkCompiler,默认输出路径 openarkcompiler/out/bin。

source build/envsetup.sh
make

命令说明:

  • source build/envsetup.sh 初始化环境,将OpenArkCompiler工具链路径openarkcompiler/src/bin设置到环境变量中
  • make 编译OpenArkCompiler的Release版本
  • make BUILD_TYPE=DEBUG 编译OpenArkCompiler的Debug版本

环境配置

经过以上操作后,系统就编译好了maple了。

要编译成功samples 下的helloworld.java 还需要做如下修改

修改 build/core/java2jar.mk 为如下代码

$(APP_JAR): %.jar : %.java
        $(JAVA2JAR) $(APP_JAR)  "$(wildcard *.java)"

也就是将里面的

${MAPLE_ROOT}/libjava-core/java-core.jar

删除,让它不依赖于这个输入文件

修改 build/core/jbc2mpl.mk 为如下代码。

$(APP_MPL): %.mpl : %.jar $(JBC2MPL_BIN)
        $(JBC2MPL_BIN) -injar ${MAPLE_ROOT}/libjava-core/java-core.jar -injar $(APP_JAR) -out $(APP)

用java-core.jar 替换 libjava-core.mplt 也就是$(LIB_MPLT)

修改out/bin/java2jar 为如下代码

#!/bin/bash
OUTPUT=$1
CORE_ALL_JAR=$2
JAVA_FILE=$2
shift 2
javac -g -d . ${JAVA_FILE}
#javac -g -d . -bootclasspath ${CORE_ALL_JAR} $@
jar -cvf ${OUTPUT} *.class

下载java-core.jar 库

下载路径如下,并把相关库放到如下目录的libjava-core里面

https://gitee.com/mirrors/java-core

//OpenArkCompiler
//使用wget https://gitee.com/mirrors/java-core/blob/master/java-core.jar 获取的文件有问题
mkdir libjava-core
cd libjava-core
git clone https://gitee.com/mirrors/java-core.git
mv java-core/java-core.jar ./

libjava-core IR文件生成

source build/envsetup.sh
../out/bin/jbc2mpl -injar java-core.jar -out libjava-core

执行这个步骤需要一定的时间,笔者使用ubuntu虚拟机2G内存,执行失败,killed,后来修改成4G内存后执行成功,执行成功后生成一下文件

├── java-core
├── java-core.jar
├── libjava-core.mpl
└── libjava-core.mplt

开始编译HelloWorld

开始编译

//OpenArkCompiler/samples/helloworld

source build/envsetup.sh
# tree
.
├── HelloWorld.java
└── Makefile

root@susz-vm:/home/susz/OpenArkCompiler-0.2/harmonyos-OpenArkCompiler-master/OpenArkCompiler/samples/helloworld# make
/home/susz/OpenArkCompiler-0.2/harmonyos-OpenArkCompiler-master/OpenArkCompiler/out/bin/java2jar  HelloWorld.jar  "HelloWorld.java"
added manifest
adding: HelloWorld.class(in = 534) (out= 330)(deflated 38%)
/home/susz/OpenArkCompiler-0.2/harmonyos-OpenArkCompiler-master/OpenArkCompiler/out/bin/jbc2mpl --mplt /home/susz/OpenArkCompiler-0.2/harmonyos-OpenArkCompiler-master/OpenArkCompiler/libjava-core/libjava-core.mplt -injar  HelloWorld.jar -out HelloWorld
/home/susz/OpenArkCompiler-0.2/harmonyos-OpenArkCompiler-master/OpenArkCompiler/out/bin/maple --infile HelloWorld.mpl --run=me:mpl2mpl:mplcg --option="--quiet:--quiet --regnativefunc --maplelinker:--quiet --no-pie --verbose-asm --maplelinker --fpic" --save-temps
Starting mpl2mpl&mplme
Starting:/home/susz/OpenArkCompiler-0.2/harmonyos-OpenArkCompiler-master/OpenArkCompiler/out/bin/maple --run=me:mpl2mpl --option=" --quiet: --quiet --regnativefunc --maplelinker" HelloWorld.mpl --save-temps
Starting parse input
Parse consumed 0s
Processing mpl2mpl&mplme
Mpl2mpl&mplme consumed 0s
Starting mplcg
Starting:/home/susz/OpenArkCompiler-0.2/harmonyos-OpenArkCompiler-master/OpenArkCompiler/out/bin/mplcg --fpic  --maplelinker  --no-pie  --quiet  --verbose-asm  HelloWorld.VtableImpl.mpl
mplcg consumed 1s
root@susz-vm:/home/susz/OpenArkCompiler-0.2/harmonyos-OpenArkCompiler-master/OpenArkCompiler/samples/helloworld# 

编译成功以后生成以下文件

.
├── HelloWorld.class
├── HelloWorld.jar
├── HelloWorld.java
├── HelloWorld.mpl
├── HelloWorld.mplt
├── HelloWorld.VtableImpl.groots.txt
├── HelloWorld.VtableImpl.mpl
├── HelloWorld.VtableImpl.primordials.txt
├── HelloWorld.VtableImpl.s
└── Makefile

0 directories, 10 files

方舟编译器HelloWorld_第1张图片

https://zhuanlan.zhihu.com/p/81076176

https://blog.csdn.net/fu_shuwu/article/details/100595134

https://blog.csdn.net/littlebirdfirst/article/details/100634654

你可能感兴趣的:(编译器)