From 7d2a4df482f18115b3f981e4bb44f2ab18aee728 Mon Sep 17 00:00:00 2001 From: lordwithcc Date: Fri, 30 Sep 2022 09:51:12 +0800 Subject: [PATCH] Modify the instructions Signed-off-by: lordwithcc --- build/README.md | 75 ---- build/ark_var.gni | 3 + build/compile_script/.gn | 4 +- build/compile_script/ark.py | 286 +++++++------ .../compile_script/{test.js => helloworld.ts} | 4 +- build/config/BUILDCONFIG.gn | 4 +- build/core/gn/BUILD.gn | 8 +- .../prebuilts_download/prebuilts_download.py | 2 +- .../prebuilts_download/prebuilts_download.sh | 2 +- .../prebuilts_download_config.json | 392 +++++++++++++++++- build/preconfig_ubuntu.md | 32 -- build/templates/cxx/cxx.gni | 6 +- build/third_party_gn/icu/icu4c/BUILD.gn | 47 ++- build/third_party_gn/protobuf/BUILD.gn | 9 +- build/toolchain/wrapper_utils.py | 96 +++++ figures/zh-cn_image_arkcompiler.png | Bin 34397 -> 0 bytes 16 files changed, 690 insertions(+), 280 deletions(-) delete mode 100644 build/README.md rename build/compile_script/{test.js => helloworld.ts} (90%) delete mode 100644 build/preconfig_ubuntu.md create mode 100644 build/toolchain/wrapper_utils.py delete mode 100644 figures/zh-cn_image_arkcompiler.png diff --git a/build/README.md b/build/README.md deleted file mode 100644 index a930d7a8..00000000 --- a/build/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# 方舟编译器部件 - -## 简介 -方舟编译器部件供了一个基于GN和Ninja的集成编译构建框架。构建流程由鸿蒙方舟编译分流,并在构建基础上增加跨平台方式。 - -方舟编译器部件架构图: - -![](../figures/zh-cn_image_arkcompiler.png) - -## 目录结构 -``` -/arkcompiler/ -├── profiler # 性能调优组件 -├── ets_runtime # 方舟eTS(兼容JS/TS)运行时时 -├── runtime_core # 方舟运行时公共库 -├── ets_frontend # 方舟eTS(兼容JS/TS)前端编译器 -├── toolchain # 方舟运行时调试调优工具链 -│ └── build # 编译配置 -├── third_party # 三方库 -│ └── protobuf -│ └── icu -│ └── zlib -│ └── bounds_checking_function -``` - -## 环境配置 -获取源码及安装依赖工具,详细参考[点击这里](https://gitee.com/lordwithcc/arkcompiler_toolchain/blob/add_standalone_part/build/preconfig_ubuntu.md) - -## 使用说明 -abc文件:由方舟前端将js文件转换生成的字节码文件 - -ark_js_vm:运行abc文件的工具 - -### step1 生成编译产物ark_js_vm -``` -python ark.py x64.release -``` -### step2 将js文件转换为abc文件 -``` -./out/x64.release/ark/ark/es2abc test.js -``` -### step3 执行生成的abc文件 -``` -LD_LIBRARY_PATH=out/x64.release:prebuilts/clang/ohos/linux-x86_64/llvm/lib ./out/x64.release/ark/ark_js_runtime/ark_js_vm test.abc -``` -### 执行262测试套 -``` -python ark.py x64.release -test262 -``` - -## 编译选项 - -交叉编译可根据目标选择不同平台,在x64平台构建android_arm目标平台 -``` -python ark.py android_arm.release -``` -编译模式选择,在x64平台构建debug版本 -``` -python ark.py x64.debug -``` -获取更多编译说明 -``` -python ark.py -help -``` - -## 相关仓 -[arkcompiler\_runtime\_core](https://gitee.com/openharmony/arkcompiler_runtime_core) - -[arkcompiler\_ets\_runtime](https://gitee.com/openharmony/arkcompiler_ets_runtime) - -[arkcompiler\_ets\_frontend](https://gitee.com/openharmony/arkcompiler_ets_frontend) - -**[arkcompiler\_toolchain](https://gitee.com/openharmony/arkcompiler_toolchain)** - -[developtools\_profiler](https://gitee.com/openharmony/developtools_profiler) \ No newline at end of file diff --git a/build/ark_var.gni b/build/ark_var.gni index 82914ea3..4739e065 100644 --- a/build/ark_var.gni +++ b/build/ark_var.gni @@ -14,4 +14,7 @@ declare_args() { # build version build_public_version = true + + # system package dir + system_base_dir = "system" } diff --git a/build/compile_script/.gn b/build/compile_script/.gn index 3c041cd9..fa5e690c 100755 --- a/build/compile_script/.gn +++ b/build/compile_script/.gn @@ -12,10 +12,10 @@ # limitations under the License. # The location of the build configuration file. -buildconfig = "//toolchain/build/config/BUILDCONFIG.gn" +buildconfig = "//arkcompiler/toolchain/build/config/BUILDCONFIG.gn" # The source root location. -root = "//toolchain/build/core/gn" +root = "//arkcompiler/toolchain/build/core/gn" # The executable used to execute scripts in action and exec_script. script_executable = "/usr/bin/env" diff --git a/build/compile_script/ark.py b/build/compile_script/ark.py index d07b664e..c0624fda 100644 --- a/build/compile_script/ark.py +++ b/build/compile_script/ark.py @@ -25,7 +25,7 @@ import sys USE_PTY = "linux" in sys.platform if USE_PTY: - import pty + import pty ARCHES = ["x64", "arm", "arm64"] DEFAULT_ARCHES = "x64" @@ -33,7 +33,7 @@ MODES = ["release", "debug"] DEFAULT_MODES = "release" TARGETS = ["ark_js_vm"] DEFAULT_TARGETS = "all" -TARGETS_TEST = ["-test262"] +TARGETS_TEST = ["test262"] USER_ARGS_TEMPLATE = """\ @@ -53,160 +53,172 @@ for example , python ark.py x64.release target: only support ark_js_vm and all now clean: clear your data in output dir [test] --test262: run test262 +test262: run test262 """ def PrintHelp(): - print(Help_message) - sys.exit(0) + print(Help_message) + sys.exit(0) + def _Call(cmd, silent=False): - if not silent: print("# %s" % cmd) - return subprocess.call(cmd, shell=True) + if not silent: + print("# %s" % cmd) + return subprocess.call(cmd, shell=True) + def _Write(filename, content, mode): - with open(filename, mode) as f: - f.write(content) - -def GetPath(arch,mode): - subdir = "%s.%s" % (arch, mode) - return os.path.join(OUTDIR, subdir) - -def _CallWithOutput(cmd,file): - host, guest = pty.openpty() - h = subprocess.Popen(cmd, shell=True, stdin=guest, stdout=guest, stderr=guest) - os.close(guest) - output_data = [] - while True: - try: - build_data = os.read(host, 512).decode('utf-8') - except OSError as error: - if error == errno.ENOENT: - print ("no such file") - elif error == errno.EPERM: - print ("permission denied") - break - else: - if not build_data: - break - print(build_data) - sys.stdout.flush() - _Write(file, build_data, "a") - os.close(host) - h.wait() - return h.returncode + with open(filename, mode) as f: + f.write(content) + + +def GetPath(arch, mode): + subdir = "%s.%s" % (arch, mode) + return os.path.join(OUTDIR, subdir) + + +def _CallWithOutput(cmd, file): + host, guest = pty.openpty() + h = subprocess.Popen(cmd, shell=True, stdin=guest, stdout=guest, stderr=guest) + os.close(guest) + output_data = [] + while True: + try: + build_data = os.read(host, 512).decode('utf-8') + except OSError as error: + if error == errno.ENOENT: + print("no such file") + elif error == errno.EPERM: + print("permission denied") + break + else: + if not build_data: + break + print(build_data) + sys.stdout.flush() + _Write(file, build_data, "a") + os.close(host) + h.wait() + return h.returncode + def Get_args(argvs): - args_list = argvs - args_len = len(args_list) - if args_len < 1: - print("Wrong usage") - PrintHelp() - elif args_len == 1: - args_out = args_list - if "-help" in args_out: - PrintHelp() - else : - args_out = args_list - return Get_templete(args_out) + args_list = argvs + args_len = len(args_list) + if args_len < 1: + print("Wrong usage") + PrintHelp() + elif args_len == 1: + args_out = args_list + if "--help" in args_out: + PrintHelp() + else : + args_out = args_list + return Get_templete(args_out) + def Get_templete(args_list): - global_arche = DEFAULT_ARCHES - global_mode = DEFAULT_MODES - global_target = DEFAULT_TARGETS - global_test = '' - global_clean = False - for args in args_list: - parameter = args.split(".") - for part in parameter: - if part in ARCHES: - global_arche = part - elif part in MODES: - global_mode = part - elif part in TARGETS: - global_target = part - elif part == "clean": - global_clean = True - elif part in TARGETS_TEST: - global_test = part - else: - print("\033[34mUnkown word: %s\033[0m" % part) - sys.exit(1) - # Determine the target CPU - if global_arche in ("arm", "arm64"): - ARK_cpu = global_arche - else: - ARK_cpu = "x64" - target_cpu = "target_cpu = \"%s\"" % ARK_cpu - # Determine the target OS,Only ohos for now - ARK_os = "ohos" - target_os = "target_os = \"%s\"" % ARK_os - if global_mode == "debug": - is_debug = "is_debug = true" - else: - is_debug = "is_debug = false" - all_part = (is_debug+"\n"+target_os+"\n"+target_cpu) - return [global_arche,global_mode,global_target,global_clean,USER_ARGS_TEMPLATE%(all_part),global_test] + global_arche = DEFAULT_ARCHES + global_mode = DEFAULT_MODES + global_target = DEFAULT_TARGETS + global_test = '' + global_clean = False + for args in args_list: + parameter = args.split(".") + for part in parameter: + if part in ARCHES: + global_arche = part + elif part in MODES: + global_mode = part + elif part in TARGETS: + global_target = part + elif part == "clean": + global_clean = True + elif part in TARGETS_TEST: + global_test = part + else: + print("\033[34mUnkown word: %s\033[0m" % part) + sys.exit(1) +# Determine the target CPU + if global_arche in ("arm", "arm64"): + ARK_cpu = global_arche + else: + ARK_cpu = "x64" + target_cpu = "target_cpu = \"%s\"" % ARK_cpu +# Determine the target OS,Only ohos for now + ARK_os = "ohos" + target_os = "target_os = \"%s\"" % ARK_os + if global_mode == "debug": + is_debug = "is_debug = true" + else: + is_debug = "is_debug = false" + all_part = (is_debug + "\n" + target_os + "\n" + target_cpu) + return [global_arche, global_mode, global_target, global_clean, USER_ARGS_TEMPLATE%(all_part), global_test] def Build(template): - arch = template[0] - mode = template[1] - target = template[2] - clean = template[3] - template_part = template[4] - path = GetPath(arch,mode) - if not os.path.exists(path): - print("# mkdir -p %s" % path) - os.makedirs(path) - if clean: - print("=== start clean ===") - code = _Call("./prebuilts/build-tools/linux-x86/bin/gn clean %s" % path) - code += _Call("./prebuilts/build-tools/linux-x86/bin/ninja -C %s -t clean" % path) - if code != 0: return code - print("=== clean success! ===") - build_log = os.path.join(path, "build.log") - if not os.path.exists("args.gn"): - args_gn = os.path.join(path, "args.gn") - _Write(args_gn, template_part, "w") - if not os.path.exists("build.ninja"): - build_ninja = os.path.join(path, "build.ninja") - code = _Call("./prebuilts/build-tools/linux-x86/bin/gn gen %s" % path) - print("=== gn success! ===") - if code != 0: return code - pass_code = _CallWithOutput("./prebuilts/build-tools/linux-x86/bin/ninja -C %s %s" % - (path, target),build_log) - if pass_code == 0:print("=== ninja success! ===") - return pass_code + arch = template[0] + mode = template[1] + target = template[2] + clean = template[3] + template_part = template[4] + path = GetPath(arch, mode) + if not os.path.exists(path): + print("# mkdir -p %s" % path) + os.makedirs(path) + if clean: + print("=== start clean ===") + code = _Call("./prebuilts/build-tools/linux-x86/bin/gn clean %s" % path) + code += _Call("./prebuilts/build-tools/linux-x86/bin/ninja -C %s -t clean" % path) + if code != 0: + return code + print("=== clean success! ===") + build_log = os.path.join(path, "build.log") + if not os.path.exists("args.gn"): + args_gn = os.path.join(path, "args.gn") + _Write(args_gn, template_part, "w") + if not os.path.exists("build.ninja"): + build_ninja = os.path.join(path, "build.ninja") + code = _Call("./prebuilts/build-tools/linux-x86/bin/gn gen %s" % path) + if code != 0: + return code + else: + print("=== gn success! ===") + pass_code = _CallWithOutput("./prebuilts/build-tools/linux-x86/bin/ninja -C %s %s" % + (path, target), build_log) + if pass_code == 0: + print("=== ninja success! ===") + return pass_code def RunTest(template): - arch = template[0] - mode = template[1] - test = template[5] - test_dir = arch+"."+mode - test262_code = '''cd ets_frontend - python3 test262/run_test262.py --es2021 all --timeout 180000 --libs-dir ../out/%s:../prebuilts/clang/ohos/linux-x86_64/llvm/lib --ark-tool=../out/%s/ark/ark_js_runtime/ark_js_vm --ark-frontend-binary=../out/%s/clang_x64/ark/ark/es2abc --merge-abc-binary=../out/%s/clang_x64/ark/ark/merge_abc --ark-frontend=es2panda - '''%(test_dir,test_dir,test_dir,test_dir) - if ("-test262" == test): - print("=== come to test ===") - return _Call(test262_code) - else: - print("=== nothing to test ===") - return 0 + arch = template[0] + mode = template[1] + test = template[5] + test_dir = arch + "." + mode + test262_code = '''cd arkcompiler/ets_frontend + python3 test262/run_test262.py --es2021 all --timeout 180000 --libs-dir ../../out/%s:../../prebuilts/clang/ohos/linux-x86_64/llvm/lib --ark-tool=../../out/%s/ark/ark_js_runtime/ark_js_vm --ark-frontend-binary=../../out/%s/clang_x64/ark/ark/es2abc --merge-abc-binary=../../out/%s/ark/ark/merge_abc --ark-frontend=es2panda + '''%(test_dir, test_dir, test_dir, test_dir) + if ("test262" == test): + print("=== come to test ===") + return _Call(test262_code) + else: + print("=== nothing to test ===") + return 0 def Main(argvs): - pass_code = 0 - templete = Get_args(argvs) - pass_code += Build(templete) - if pass_code == 0: - pass_code += RunTest(templete) - if pass_code == 0: - print('\033[32mDone!\033[0m', '\033[32mARK_{} compilation finished successfully.\033[0m'.format(argvs[0].split('.')[0])) - else: - print('\033[31mError!\033[0m', '\033[31mARK_{} compilation finished with errors.\033[0m'.format(argvs[0].split('.')[0])) - return pass_code + pass_code = 0 + templete = Get_args(argvs) + pass_code += Build(templete) + if pass_code == 0: + pass_code += RunTest(templete) + if pass_code == 0: + print('\033[32mDone!\033[0m', '\033[32mARK_{} compilation finished successfully.\033[0m'.format(argvs[0].split('.')[0])) + else: + print('\033[31mError!\033[0m', '\033[31mARK_{} compilation finished with errors.\033[0m'.format(argvs[0].split('.')[0])) + return pass_code + if __name__ == "__main__": - sys.exit(Main(sys.argv[1:])) \ No newline at end of file + sys.exit(Main(sys.argv[1:])) \ No newline at end of file diff --git a/build/compile_script/test.js b/build/compile_script/helloworld.ts similarity index 90% rename from build/compile_script/test.js rename to build/compile_script/helloworld.ts index b431aa41..dc82d481 100644 --- a/build/compile_script/test.js +++ b/build/compile_script/helloworld.ts @@ -13,6 +13,6 @@ * limitations under the License. */ -"use strict"; -print("Hello World !"); +declare function print(arg:any):string; +print("Hello world!"); diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn index 10a7d3f8..e953da08 100644 --- a/build/config/BUILDCONFIG.gn +++ b/build/config/BUILDCONFIG.gn @@ -15,7 +15,7 @@ declare_args() { another_path = true ark_standalone_build = true use_musl = false - build_root = "//toolchain/build" + build_root = "//arkcompiler/toolchain/build" } if (target_os == "") { @@ -52,7 +52,7 @@ declare_args() { declare_args() { host_toolchain = "" custom_toolchain = "" - is_standard_system = false + is_standard_system = true is_clang = current_os != "linux" || (current_cpu != "s390x" && current_cpu != "s390" && diff --git a/build/core/gn/BUILD.gn b/build/core/gn/BUILD.gn index fcf776fc..d215bb9d 100644 --- a/build/core/gn/BUILD.gn +++ b/build/core/gn/BUILD.gn @@ -11,8 +11,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import("//ets_frontend/ts2panda/ts2abc_config.gni") -import("//ets_runtime/js_runtime_config.gni") +import("//arkcompiler/ets_frontend/ts2panda/ts2abc_config.gni") +import("//arkcompiler/ets_runtime/js_runtime_config.gni") print("root_out_dir=$root_out_dir") print("root_build_dir=$root_build_dir") @@ -26,9 +26,9 @@ print("target_os=$target_os, target_cpu=$target_cpu") print() group("ark_js_packages") { - deps = [ "//ets_runtime/ecmascript/js_vm:ark_js_vm" ] + deps = [ "//arkcompiler/ets_runtime/ecmascript/js_vm:ark_js_vm" ] } group("ark_es2abc") { - deps = [ "//ets_frontend/es2panda:es2panda" ] + deps = [ "//arkcompiler/ets_frontend/es2panda:es2panda" ] } diff --git a/build/prebuilts_download/prebuilts_download.py b/build/prebuilts_download/prebuilts_download.py index 179d265c..90f4e431 100644 --- a/build/prebuilts_download/prebuilts_download.py +++ b/build/prebuilts_download/prebuilts_download.py @@ -233,7 +233,7 @@ def main(): host_platform = args.host_platform host_cpu = args.host_cpu tool_repo = args.tool_repo - config_file = os.path.join(args.code_dir, 'toolchain/build/prebuilts_download/prebuilts_download_config.json') + config_file = os.path.join(args.code_dir, 'arkcompiler/toolchain/build/prebuilts_download/prebuilts_download_config.json') config_info = read_json_file(config_file) args.npm_install_config = config_info.get('npm_install_path') node_modules_copy_config = config_info.get('node_modules_copy') diff --git a/build/prebuilts_download/prebuilts_download.sh b/build/prebuilts_download/prebuilts_download.sh index a64070ca..ef8b3da7 100644 --- a/build/prebuilts_download/prebuilts_download.sh +++ b/build/prebuilts_download/prebuilts_download.sh @@ -130,7 +130,7 @@ script_path=$(cd $(dirname $0);pwd) code_dir=$(dirname ${script_path}) pip3 install --trusted-host $trusted_host -i $pypi_url rich echo "prebuilts_download start" -python3 "${code_dir}/prebuilts_download/prebuilts_download.py" $wget_ssl_check $tool_repo $npm_registry $help $cpu $platform $npm_para +python3 "arkcompiler/toolchain/build/prebuilts_download/prebuilts_download.py" $wget_ssl_check $tool_repo $npm_registry $help $cpu $platform $npm_para echo "prebuilts_download end" echo -e "\n" diff --git a/build/prebuilts_download/prebuilts_download_config.json b/build/prebuilts_download/prebuilts_download_config.json index 83c57a34..c3ed7c54 100644 --- a/build/prebuilts_download/prebuilts_download_config.json +++ b/build/prebuilts_download/prebuilts_download_config.json @@ -1,24 +1,128 @@ { - "prebuilts_download_dir": "../../OpenHarmony_canary_prebuilts", - "npm_install_path": ["ets_frontend/ts2panda"], + "prebuilts_download_dir": "../OpenHarmony_canary_prebuilts", + "npm_install_path": [ + "developtools/ace_ets2bundle/compiler", + "developtools/ace_js2bundle/ace-loader", + "third_party/jsframework", + "arkcompiler/ets_frontend/ts2panda", + "interface/sdk-js/build-tools" + ], "node_modules_copy": [ { - "src": "ets_frontend/ts2panda/node_modules", + "src": "third_party/jsframework/node_modules", + "dest": "prebuilts/build-tools/common/js-framework/node_modules", + "use_symlink": "True" + }, + { + "src": "arkcompiler/ets_frontend/ts2panda/node_modules", "dest": "prebuilts/build-tools/common/ts2abc/node_modules", "use_symlink": "True" + }, + { + "src": "test/testfwk/arkxtest/jsunit", + "dest": "developtools/ace_ets2bundle/compiler/node_modules/@ohos/hypium", + "use_symlink": "False" + }, + { + "src": "test/testfwk/arkxtest/jsunit", + "dest": "developtools/ace_js2bundle/ace-loader/node_modules/@ohos/hypium", + "use_symlink": "False" + }, + { + "src": "test/testfwk/arkxtest/jsunit/", + "dest": "developtools/ace_ets2bundle/compiler/node_modules/hypium/", + "use_symlink": "False" + }, + { + "src": "test/testfwk/arkxtest/jsunit/", + "dest": "developtools/ace_js2bundle/ace-loader/node_modules/hypium/", + "use_symlink": "False" } ], "file_handle_config": [ { - "src": "/prebuilts/clang/ohos/linux-x86_64/clang-971024-20220827", + "src": "/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi", + "tmp": "/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi2", + "dest": "/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi" + }, + { + "src": "/prebuilts/clang/ohos/windows-x86_64/clang_windows-x86_64-942740-20220927", + "dest": "/prebuilts/clang/ohos/windows-x86_64/llvm", + "rename": "true", + "symlink_src": "/lib/clang/12.0.1", + "symlink_dest": "/lib/clang/current" + }, + { + "src": "/prebuilts/clang/ohos/linux-x86_64/clang_linux-x86_64-942740-20220927", "dest": "/prebuilts/clang/ohos/linux-x86_64/llvm", + "rename": "true", "symlink_src": "/lib/clang/12.0.1", "symlink_dest": "/lib/clang/current" + }, + { + "src": "/prebuilts/clang/ohos/darwin-arm64/clang_darwin-arm64-942740-20220927", + "dest": "/prebuilts/clang/ohos/darwin-arm64/llvm", + "rename": "true", + "symlink_src": "/lib/clang/12.0.1", + "symlink_dest": "/lib/clang/current" + }, + { + "src": "/prebuilts/clang/ohos/darwin-x86_64/clang_darwin-x86_64-942740-20220927", + "dest": "/prebuilts/clang/ohos/darwin-x86_64/llvm", + "rename": "true", + "symlink_src": "/lib/clang/12.0.1", + "symlink_dest": "/lib/clang/current" + }, + { + "src": "/prebuilts/gcc/linux-x86/esp/esp-2019r2-8.2.0/xtensa-esp32-elf", + "dest": "/prebuilts/gcc/linux-x86/esp/esp-2019r2-8.2.0" + }, + { + "src": "/prebuilts/clang/ohos/windows-x86_64/libcxx-ndk_windows-x86_64-942740-20220927", + "dest": "/prebuilts/clang/ohos/windows-x86_64/libcxx-ndk", + "rename": "true" + }, + { + "src": "/prebuilts/clang/ohos/linux-x86_64/libcxx-ndk_linux-x86_64-942740-20220927", + "dest": "/prebuilts/clang/ohos/linux-x86_64/libcxx-ndk", + "rename": "true" + }, + { + "src": "/prebuilts/clang/ohos/darwin-arm64/libcxx-ndk_darwin-arm64-942740-20220927", + "dest": "/prebuilts/clang/ohos/darwin-arm64/libcxx-ndk", + "rename": "true" + }, + { + "src": "/prebuilts/clang/ohos/darwin-x86_64/libcxx-ndk_darwin-x86_64-942740-20220927", + "dest": "/prebuilts/clang/ohos/darwin-x86_64/libcxx-ndk", + "rename": "true" } ], "linux": { - "x86_64": { + "node_config": [ + { + "unzip_dir": "prebuilts/build-tools/common/nodejs", + "file_path": "/nodejs/v12.18.4/node-v12.18.4-linux-x64.tar.gz", + "unzip_filename": "node-v12.18.4-linux-x64" + } + ], + "arm64": { "copy_config": [ + { + "unzip_dir": "prebuilts/sdk/js-loader/build-tools", + "file_path": "/openharmony/compiler/ace-loader/1.0/ace-loader-1.0.tar.gz", + "unzip_filename": "ace-loader" + }, + { + "unzip_dir": "prebuilts/build-tools/common", + "file_path": "/openharmony/compiler/restool/2.007/restool-2.007.tar.gz", + "unzip_filename": "restool" + }, + { + "unzip_dir": "prebuilts/cmake", + "file_path": "/openharmony/compiler/cmake/3.16.5/linux/cmake-linux-x86-3.16.5.tar.gz", + "unzip_filename": "linux" + }, { "unzip_dir": "prebuilts/build-tools/linux-x86/bin", "file_path": "/openharmony/compiler/gn/1717/linux/gn-linux-x86-1717.tar.gz", @@ -31,23 +135,289 @@ }, { "unzip_dir": "prebuilts/ark_tools", - "file_path": "/openharmony/compiler/llvm_prebuilt_libs/ark_js_prebuilts_20220815.tar.gz", + "file_path": "/openharmony/compiler/llvm_prebuilt_libs/ark_js_prebuilts_20220923.tar.gz", "unzip_filename": "ark_js_prebuilts" + } + ], + "linux_copy_config": [ + { + "unzip_dir": "prebuilts/cmake", + "file_path": "/openharmony/compiler/cmake/3.16.5/windows/cmake-windows-x86-3.16.5.tar.gz", + "unzip_filename": "windows-x86" + }, + { + "unzip_dir": "prebuilts/mingw-w64/ohos/linux-x86_64", + "file_path": "/openharmony/compiler/mingw-w64/7.0.0/clang-mingw.tar.gz", + "unzip_filename": "clang-mingw" + }, + { + "unzip_dir": "prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi", + "file_path": "/openharmony/compiler/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi/1.0/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi.tar.gz", + "unzip_filename": "prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi" + }, + { + "unzip_dir": "prebuilts/gcc/linux-x86/aarch64", + "file_path": "/openharmony/compiler/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi/1.0/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz", + "unzip_filename": "gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu" }, { - "unzip_dir": "prebuilts/build-tools/common/nodejs", - "file_path": "/nodejs/v12.18.4/node-v12.18.4-linux-x64.tar.gz", - "unzip_filename": "node-v12.18.4-linux-x64" + "unzip_dir": "prebuilts/previewer/windows", + "file_path": "/openharmony/develop_tools/previewer/3.2.8.1/previewer-3.2.8.1-master-20221008.win.tar.gz", + "unzip_filename": "previewer" + }, + { + "unzip_dir": "prebuilts/clang/ohos/windows-x86_64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/windows/clang_windows-x86_64-942740-20220927.tar.bz2", + "unzip_filename": "llvm" + }, + { + "unzip_dir": "prebuilts/clang/ohos/windows-x86_64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/windows/libcxx-ndk_windows-x86_64-942740-20220927.tar.bz2", + "unzip_filename": "libcxx-ndk" + }, + { + "unzip_dir": "prebuilts/clang/ohos/linux-x86_64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/linux/clang_linux-x86_64-942740-20220927.tar.bz2", + "unzip_filename": "llvm" + }, + { + "unzip_dir": "prebuilts/clang/ohos/linux-x86_64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/linux/libcxx-ndk_linux-x86_64-942740-20220927.tar.bz2", + "unzip_filename": "libcxx-ndk" + }, + { + "unzip_dir": "prebuilts/gcc/linux-x86/esp", + "file_path": "/openharmony/compiler/gcc_esp/2019r2-8.2.0/linux/esp-2019r2-8.2.0.zip", + "unzip_filename": "esp-2019r2-8.2.0" + }, + { + "unzip_dir": "prebuilts/gcc/linux-x86/csky", + "file_path": "/openharmony/compiler/gcc_csky/v3.10.29/linux/csky-v3.10.29.tar.gz", + "unzip_filename": "csky" + }, + { + "unzip_dir": "prebuilts/python", + "file_path": "/openharmony/compiler/python/3.9.2/linux/python-linux-x86-3.9.2_20200510.tar.gz", + "unzip_filename": "linux-x86" + } + ] + }, + "x86_64": { + "copy_config": [ + { + "unzip_dir": "prebuilts/sdk/js-loader/build-tools", + "file_path": "/openharmony/compiler/ace-loader/1.0/ace-loader-1.0.tar.gz", + "unzip_filename": "ace-loader" + }, + { + "unzip_dir": "prebuilts/build-tools/common", + "file_path": "/openharmony/compiler/restool/2.007/restool-2.007.tar.gz", + "unzip_filename": "restool" + }, + { + "unzip_dir": "prebuilts/cmake", + "file_path": "/openharmony/compiler/cmake/3.16.5/linux/cmake-linux-x86-3.16.5.tar.gz", + "unzip_filename": "linux" + }, + { + "unzip_dir": "prebuilts/build-tools/linux-x86/bin", + "file_path": "/openharmony/compiler/gn/1717/linux/gn-linux-x86-1717.tar.gz", + "unzip_filename": "gn" + }, + { + "unzip_dir": "prebuilts/build-tools/linux-x86/bin", + "file_path": "/openharmony/compiler/ninja/1.10.1/linux/ninja-linux-x86-1.10.1.tar.gz", + "unzip_filename": "ninja" + }, + { + "unzip_dir": "prebuilts/ark_tools", + "file_path": "/openharmony/compiler/llvm_prebuilt_libs/ark_js_prebuilts_20220923.tar.gz", + "unzip_filename": "ark_js_prebuilts" } ], "linux_copy_config": [ + { + "unzip_dir": "prebuilts/cmake", + "file_path": "/openharmony/compiler/cmake/3.16.5/windows/cmake-windows-x86-3.16.5.tar.gz", + "unzip_filename": "windows-x86" + }, + { + "unzip_dir": "prebuilts/mingw-w64/ohos/linux-x86_64", + "file_path": "/openharmony/compiler/mingw-w64/7.0.0/clang-mingw.tar.gz", + "unzip_filename": "clang-mingw" + }, + { + "unzip_dir": "prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi", + "file_path": "/openharmony/compiler/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi/1.0/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi.tar.gz", + "unzip_filename": "prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi" + }, + { + "unzip_dir": "prebuilts/gcc/linux-x86/aarch64", + "file_path": "/openharmony/compiler/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi/1.0/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz", + "unzip_filename": "gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu" + }, + { + "unzip_dir": "prebuilts/previewer/windows", + "file_path": "/openharmony/develop_tools/previewer/3.2.8.1/previewer-3.2.8.1-master-20221008.win.tar.gz", + "unzip_filename": "previewer" + }, + { + "unzip_dir": "prebuilts/clang/ohos/windows-x86_64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/windows/clang_windows-x86_64-942740-20220927.tar.bz2", + "unzip_filename": "llvm" + }, + { + "unzip_dir": "prebuilts/clang/ohos/windows-x86_64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/windows/libcxx-ndk_windows-x86_64-942740-20220927.tar.bz2", + "unzip_filename": "libcxx-ndk" + }, + { + "unzip_dir": "prebuilts/clang/ohos/linux-x86_64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/linux/clang_linux-x86_64-942740-20220927.tar.bz2", + "unzip_filename": "llvm" + }, { "unzip_dir": "prebuilts/clang/ohos/linux-x86_64", - "file_path": "/openharmony/compiler/clang/12.0.1-971024/linux/clang-971024-linux-x86_64-20220827.tar.bz2", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/linux/libcxx-ndk_linux-x86_64-942740-20220927.tar.bz2", + "unzip_filename": "libcxx-ndk" + }, + { + "unzip_dir": "prebuilts/gcc/linux-x86/esp", + "file_path": "/openharmony/compiler/gcc_esp/2019r2-8.2.0/linux/esp-2019r2-8.2.0.zip", + "unzip_filename": "esp-2019r2-8.2.0" + }, + { + "unzip_dir": "prebuilts/gcc/linux-x86/csky", + "file_path": "/openharmony/compiler/gcc_csky/v3.10.29/linux/csky-v3.10.29.tar.gz", + "unzip_filename": "csky" + }, + { + "unzip_dir": "prebuilts/python", + "file_path": "/openharmony/compiler/python/3.9.2/linux/python-linux-x86-3.9.2_20200510.tar.gz", + "unzip_filename": "linux-x86" + } + ] + } + }, + "darwin": { + "node_config": [ + { + "unzip_dir": "prebuilts/build-tools/common/nodejs", + "file_path": "/nodejs/v12.18.4/node-v12.18.4-darwin-x64.tar.gz", + "unzip_filename": "node-v12.18.4-darwin-x64" + } + ], + "arm64": { + "copy_config": [ + { + "unzip_dir": "prebuilts/sdk/js-loader/build-tools", + "file_path": "/openharmony/compiler/ace-loader/1.0/ace-loader-1.0.tar.gz", + "unzip_filename": "ace-loader" + }, + { + "unzip_dir": "prebuilts/build-tools/common", + "file_path": "/openharmony/compiler/restool/2.007/restool-2.007.tar.gz", + "unzip_filename": "restool" + }, + { + "unzip_dir": "prebuilts/cmake", + "file_path": "/openharmony/compiler/cmake/3.16.5/darwin/cmake-darwin-x86-3.16.5.tar.gz", + "unzip_filename": "darwin" + }, + { + "unzip_dir": "prebuilts/build-tools/darwin-x86/bin", + "file_path": "/openharmony/compiler/gn/1717/darwin/gn-darwin-x86-1717.tar.gz", + "unzip_filename": "gn" + }, + { + "unzip_dir": "prebuilts/build-tools/darwin-x86/bin", + "file_path": "/openharmony/compiler/ninja/1.10.1/darwin/ninja-darwin-x86-1.10.1.tar.gz", + "unzip_filename": "ninja" + }, + { + "unzip_dir": "prebuilts/ark_tools", + "file_path": "/openharmony/compiler/llvm_prebuilt_libs/ark_js_prebuilts_20220923.tar.gz", + "unzip_filename": "ark_js_prebuilts" + } + ], + "darwin_copy_config": [ + { + "unzip_dir": "prebuilts/previewer/darwin", + "file_path": "/openharmony/develop_tools/previewer/3.2.8.1/previewer-3.2.8.1-master-20221008.mac-arm64.tar.gz", + "unzip_filename": "previewer" + }, + { + "unzip_dir": "prebuilts/clang/ohos/darwin-arm64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/darwin/clang_darwin-arm64-942740-20220927.tar.bz2", + "unzip_filename": "llvm" + }, + { + "unzip_dir": "prebuilts/clang/ohos/darwin-arm64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/darwin/libcxx-ndk_darwin-arm64-942740-20220927.tar.bz2", + "unzip_filename": "libcxx-ndk" + }, + { + "unzip_dir": "prebuilts/python", + "file_path": "/openharmony/compiler/python/3.9.2/darwin/python-darwin-x86-3.9.2_202205071615.tar.gz", + "unzip_filename": "darwin-x86" + } + ] + }, + "x86_64": { + "copy_config": [ + { + "unzip_dir": "prebuilts/sdk/js-loader/build-tools", + "file_path": "/openharmony/compiler/ace-loader/1.0/ace-loader-1.0.tar.gz", + "unzip_filename": "ace-loader" + }, + { + "unzip_dir": "prebuilts/build-tools/common", + "file_path": "/openharmony/compiler/restool/2.007/restool-2.007.tar.gz", + "unzip_filename": "restool" + }, + { + "unzip_dir": "prebuilts/cmake", + "file_path": "/openharmony/compiler/cmake/3.16.5/darwin/cmake-darwin-x86-3.16.5.tar.gz", + "unzip_filename": "darwin" + }, + { + "unzip_dir": "prebuilts/build-tools/darwin-x86/bin", + "file_path": "/openharmony/compiler/gn/1717/darwin/gn-darwin-x86-1717.tar.gz", + "unzip_filename": "gn" + }, + { + "unzip_dir": "prebuilts/build-tools/darwin-x86/bin", + "file_path": "/openharmony/compiler/ninja/1.10.1/darwin/ninja-darwin-x86-1.10.1.tar.gz", + "unzip_filename": "ninja" + }, + { + "unzip_dir": "prebuilts/ark_tools", + "file_path": "/openharmony/compiler/llvm_prebuilt_libs/ark_js_prebuilts_20220923.tar.gz", + "unzip_filename": "ark_js_prebuilts" + } + ], + "darwin_copy_config": [ + { + "unzip_dir": "prebuilts/previewer/darwin", + "file_path": "/openharmony/develop_tools/previewer/3.2.8.1/previewer-3.2.8.1-master-20221008.mac.tar.gz", + "unzip_filename": "previewer" + }, + { + "unzip_dir": "prebuilts/clang/ohos/darwin-x86_64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/darwin/clang_darwin-x86_64-942740-20220927.tar.bz2", "unzip_filename": "llvm" + }, + { + "unzip_dir": "prebuilts/clang/ohos/darwin-x86_64", + "file_path": "/openharmony/compiler/clang/12.0.1-942740/darwin/libcxx-ndk_darwin-x86_64-942740-20220927.tar.bz2", + "unzip_filename": "libcxx-ndk" + }, + { + "unzip_dir": "prebuilts/python", + "file_path": "/openharmony/compiler/python/3.9.2/darwin/python-darwin-x86-3.9.2_202205071615.tar.gz", + "unzip_filename": "darwin-x86" } ] } } } - diff --git a/build/preconfig_ubuntu.md b/build/preconfig_ubuntu.md deleted file mode 100644 index 72613588..00000000 --- a/build/preconfig_ubuntu.md +++ /dev/null @@ -1,32 +0,0 @@ -# 获取源码及安装依赖工具 -## 推荐操作系统Ubuntu18及以上 -## 安装repo工具 - -安装码云repo工具,由于权限可切换到root用户下安装,安装后再切换个人用户目录操作 - -``` -curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo -chmod a+x /usr/local/bin/repo -pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests -``` - -## 下载源码 -``` -repo init -u https://gitee.com/lordwithcc/manifest.git -b Ark_Standalone_Build -repo sync -c -repo forall -c 'git lfs pull' -``` - -## 编译环境准备 - -安装依赖工具 -``` -sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev genext2fs liblz4-tool libssl-dev libtinfo5 lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby default-jdk u-boot-tools mtools mtd-utils scons gcc-arm-none-eabi gcc-arm-linux-gnueabi -``` - -安装编译器及二进制工具 -``` -cd arkcompiler -./toolchain/build/compile_script/gen.sh ark -./toolchain/build/prebuilts_download/prebuilts_download.sh -``` diff --git a/build/templates/cxx/cxx.gni b/build/templates/cxx/cxx.gni index 5c232d0a..5b22340c 100755 --- a/build/templates/cxx/cxx.gni +++ b/build/templates/cxx/cxx.gni @@ -62,7 +62,8 @@ template("ohos_executable") { } if (defined(invoker.use_exceptions) && invoker.use_exceptions) { - configs += [ "//toolchain/build/config/compiler:exceptions" ] + configs += [ "//arkcompiler/toolchain/build/config/compiler:exceptions" ] + ldflags = [] } } } @@ -87,7 +88,8 @@ template("ohos_static_library") { } if (defined(invoker.use_exceptions) && invoker.use_exceptions) { - configs += [ "//toolchain/build/config/compiler:exceptions" ] + configs += [ "//arkcompiler/toolchain/build/config/compiler:exceptions" ] + ldflags = [] } } } diff --git a/build/third_party_gn/icu/icu4c/BUILD.gn b/build/third_party_gn/icu/icu4c/BUILD.gn index 2dcdd60f..18acc49c 100644 --- a/build/third_party_gn/icu/icu4c/BUILD.gn +++ b/build/third_party_gn/icu/icu4c/BUILD.gn @@ -1,9 +1,9 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2021 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -19,7 +19,10 @@ config("icu_config") { "//third_party/icu/icu4c/source/i18n", "//third_party/icu/icu4c/source", ] - cflags_cc = [ "-fPIC" ] +} + +config("static_icustubdata_all_deps_config") { + include_dirs = [ "//third_party/icu/icu4c/source/common" ] } ohos_static_library("static_icustubdata") { @@ -43,6 +46,13 @@ ohos_static_library("static_icustubdata") { output_name = "stubdata" } +# ohos_prebuilt_etc("ohos_icudat") { +# source = "//third_party/icu/ohos_icu4j/data/icudt69l.dat" +# module_install_dir = "usr/ohos_icu/" +# part_name = "icu" +# subsystem_name = "thirdparty" +# } + icu_common_source = [ "//third_party/icu/icu4c/source/common/ubiditransform.cpp", "//third_party/icu/icu4c/source/common/locutil.cpp", @@ -370,8 +380,15 @@ icu_i18n_source = [ "//third_party/icu/icu4c/source/i18n/reldtfmt.cpp", "//third_party/icu/icu4c/source/i18n/nultrans.cpp", "//third_party/icu/icu4c/source/i18n/number_grouping.cpp", + "//third_party/icu/icu4c/source/i18n/number_symbolswrapper.cpp", + "//third_party/icu/icu4c/source/i18n/number_usageprefs.cpp", + "//third_party/icu/icu4c/source/i18n/numrange_capi.cpp", + "//third_party/icu/icu4c/source/i18n/pluralranges.cpp", + "//third_party/icu/icu4c/source/i18n/units_complexconverter.cpp", + "//third_party/icu/icu4c/source/i18n/units_converter.cpp", + "//third_party/icu/icu4c/source/i18n/units_data.cpp", + "//third_party/icu/icu4c/source/i18n/units_router.cpp", "//third_party/icu/icu4c/source/i18n/rbt_pars.cpp", - "//third_party/icu/icu4c/source/i18n/nounit.cpp", "//third_party/icu/icu4c/source/i18n/winnmfmt.cpp", "//third_party/icu/icu4c/source/i18n/uregexc.cpp", "//third_party/icu/icu4c/source/i18n/fpositer.cpp", @@ -484,6 +501,7 @@ ohos_shared_library("shared_icuuc") { ":icu_config", "$build_root/config/compiler:rtti", ] + all_dependent_configs = [ ":static_icustubdata_all_deps_config" ] deps = [ ":static_icustubdata" ] defines = [ "U_ATTRIBUTE_DEPRECATED=", @@ -511,7 +529,18 @@ ohos_shared_library("shared_icuuc") { "-shared", "-lm", ] + if (is_standard_system) { + part_name = "icu" + subsystem_name = "thirdparty" + } else { + part_name = "i18n" + subsystem_name = "global" + } + install_images = [ system_base_dir ] + relative_install_dir = "platformsdk" output_name = "hmicuuc" + install_enable = true + cflags_cc += ["-fPIC"] } ohos_shared_library("shared_icui18n") { @@ -551,7 +580,17 @@ ohos_shared_library("shared_icui18n") { cflags_cc += [ "-fPIC" ] ldflags += [ "-ldl" ] } + if (is_standard_system) { + part_name = "icu" + subsystem_name = "thirdparty" + } else { + part_name = "i18n" + subsystem_name = "global" + } + install_images = [ system_base_dir ] + relative_install_dir = "platformsdk" output_name = "hmicui18n" + install_enable = true } ohos_static_library("static_icuuc") { diff --git a/build/third_party_gn/protobuf/BUILD.gn b/build/third_party_gn/protobuf/BUILD.gn index 6c263fbc..da2cb758 100644 --- a/build/third_party_gn/protobuf/BUILD.gn +++ b/build/third_party_gn/protobuf/BUILD.gn @@ -11,13 +11,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -if (defined(ark_standalone_build)) { - import("//profiler//build/config.gni") - import("$build_root/ark.gni") -} else { - import("//build/ohos.gni") - import("//developtools/profiler/build/config.gni") -} +import("//profiler//build/config.gni") +import("$build_root/ark.gni") protobuf_src_root = "//third_party/protobuf/src/" diff --git a/build/toolchain/wrapper_utils.py b/build/toolchain/wrapper_utils.py new file mode 100644 index 00000000..803f99aa --- /dev/null +++ b/build/toolchain/wrapper_utils.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2016 The Chromium Authors. All rights reserved. + +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Helper functions for gcc_toolchain.gni wrappers.""" + +import gzip +import os +import subprocess +import shutil +import threading + +_BAT_PREFIX = 'cmd /c call ' + + +def _gzip_then_delete(src_path, dest_path): + """ Results for ohos map file with GCC on a z620: + Uncompressed: 207MB + gzip -9: 16.4MB, takes 8.7 seconds. + gzip -1: 21.8MB, takes 2.0 seconds. + Piping directly from the linker via -print-map (or via -Map with a fifo) + adds a whopping 30-45 seconds! + """ + with open(src_path, 'rb') as f_in, gzip.GzipFile(dest_path, + 'wb', + 1) as f_out: + shutil.copyfileobj(f_in, f_out) + os.unlink(src_path) + + +def command_to_run(command): + """Generates commands compatible with Windows. + + When running on a Windows host and using a toolchain whose tools are + actually wrapper scripts (i.e. .bat files on Windows) rather than binary + executables, the |command| to run has to be prefixed with this magic. + The GN toolchain definitions take care of that for when GN/Ninja is + running the tool directly. When that command is passed in to this + script, it appears as a unitary string but needs to be split up so that + just 'cmd' is the actual command given to Python's subprocess module. + + Args: + command: List containing the UNIX style |command|. + + Returns: + A list containing the Windows version of the |command|. + """ + if command[0].startswith(_BAT_PREFIX): + command = command[0].split(None, 3) + command[1:] + return command + + +def run_link_with_optional_map_file(command, env=None, map_file=None): + """Runs the given command, adding in -Wl,-Map when |map_file| is given. + + Also takes care of gzipping when |map_file| ends with .gz. + + Args: + command: List of arguments comprising the command. + env: Environment variables. + map_file: Path to output map_file. + + Returns: + The exit code of running |command|. + """ + tmp_map_path = None + if map_file and map_file.endswith('.gz'): + tmp_map_path = map_file + '.tmp' + command.append('-Wl,-Map,' + tmp_map_path) + elif map_file: + command.append('-Wl,-Map,' + map_file) + + result = subprocess.call(command, env=env) + + if tmp_map_path and result == 0: + threading.Thread( + target=lambda: _gzip_then_delete(tmp_map_path, map_file)).start() + elif tmp_map_path and os.path.exists(tmp_map_path): + os.unlink(tmp_map_path) + + return result + + +def capture_command_stderr(command, env=None): + """Returns the stderr of a command. + + Args: + command: A list containing the command and arguments. + env: Environment variables for the new process. + """ + child = subprocess.Popen(command, stderr=subprocess.PIPE, env=env) + _, stderr = child.communicate() + return child.returncode, stderr diff --git a/figures/zh-cn_image_arkcompiler.png b/figures/zh-cn_image_arkcompiler.png deleted file mode 100644 index 4e34094c9c82cd80881078df9b5e5904dbe98a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34397 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 E052%TEdT%j -- Gitee