方舟编译器已经开源,官网见
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+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_COMPILER
、GN_CXX_COMPILER
和GN_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(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
//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
https://zhuanlan.zhihu.com/p/81076176
https://blog.csdn.net/fu_shuwu/article/details/100595134
https://blog.csdn.net/littlebirdfirst/article/details/100634654