# 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 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import("//arkcompiler/ets_frontend/ets_frontend_config.gni") if (!ark_standalone_build) { import("//build/ohos.gni") import("//build/test.gni") build_root = "//build" ts2abc_root = "//arkcompiler/ets_frontend/ts2panda" } else { import("$build_root/ark.gni") ts2abc_root = "//arkcompiler/ets_frontend/ts2panda" } declare_args() { nodejs_dir = "" node_path = "" node_modules = "" ts2abc_build_deps = "" ts2abc_build_path = "" } node_modules = "//prebuilts/build-tools/common/ts2abc/node_modules" if (build_public_version) { nodejs_dir = "//prebuilts/build-tools/common/nodejs" } else { nodejs_dir = "//prebuilts/ace-toolkit/nodejs" } if (host_toolchain == toolchain_mac) { ts2abc_build_deps = [ "$ts2abc_root:ts2abc_build_mac($toolchain_mac)" ] ts2abc_build_path = get_label_info("$ts2abc_root:ts2abc_build_mac($toolchain_mac)", "root_out_dir") + "/obj/arkcompiler/ets_frontend/ts2panda/build-mac" node_path = "${nodejs_dir}/node-v12.18.4-darwin-x64/bin/" } else if (host_toolchain == toolchain_win) { ts2abc_build_deps = [ "$ts2abc_root:ts2abc_build_win($toolchain_win)" ] ts2abc_build_path = get_label_info("$ts2abc_root:ts2abc_build_win($toolchain_win)", "root_out_dir") + "/obj/arkcompiler/ets_frontend/ts2panda/build_win" } else { ts2abc_build_deps = [ "$ts2abc_root:ts2abc_build($toolchain_linux)" ] ts2abc_build_path = get_label_info("$ts2abc_root:ts2abc_build($toolchain_linux)", "root_out_dir") + "/obj/arkcompiler/ets_frontend/ts2panda/build" node_path = "${nodejs_dir}/node-v12.18.4-linux-x64/bin/" } # Generate js plugin. # # Mandatory arguments: # plugin_path -- plugin js file path # plugin_name -- name of js file, ex: BatteryPlugin.js # generat_file -- name of generated file # package_name -- name of generated file's package # extra_dependencies -- a list of files that should be considered as dependencies, must be label # out_puts template("ts2abc_gen_file") { assert(defined(invoker.plugin_path), "plugin_path is required!") assert(defined(invoker.plugin_name), "plugin_name is required!") assert(defined(invoker.generat_file), "generat_file is required!") assert(defined(invoker.package_name), "package_name is required!") assert(defined(invoker.out_puts), "out_puts is required!") extra_dependencies = [] if (defined(invoker.extra_dependencies)) { extra_dependencies += invoker.extra_dependencies } action("$target_name") { script = "${ts2abc_root}/scripts/generate_plugin.py" deps = extra_dependencies deps += ts2abc_build_deps args = [ "--node", rebase_path("${node_path}"), "--frontend-tool-path", rebase_path("${ts2abc_build_path}"), "--node-modules", rebase_path("${node_modules}"), "--plugin-path", invoker.plugin_path, "--plugin-name", invoker.plugin_name, "--generated-file", invoker.generat_file, "--package-name", invoker.package_name, ] outputs = invoker.out_puts } } # Generate abc # # Mandatory arguments: # src_js -- name of js file, ex: BatteryPlugin.js # dst_file -- ex: BatteryPlugin.abc # out_puts template("ts2abc_gen_abc") { assert(defined(invoker.src_js), "src_js is required!") assert(defined(invoker.dst_file), "dst_file is required!") assert(defined(invoker.out_puts), "out_puts is required!") extra_dependencies = [] if (defined(invoker.extra_dependencies)) { extra_dependencies += invoker.extra_dependencies } action("$target_name") { if (defined(invoker.extra_visibility)) { visibility = invoker.extra_visibility } script = "${ts2abc_root}/scripts/generate_js_bytecode.py" deps = extra_dependencies deps += ts2abc_build_deps args = [ "--src-js", invoker.src_js, "--dst-file", invoker.dst_file, "--node", rebase_path("${node_path}"), "--frontend-tool-path", rebase_path("${ts2abc_build_path}"), "--node-modules", rebase_path("${node_modules}"), ] if (defined(invoker.extra_args)) { args += invoker.extra_args } if (defined(invoker.in_puts)) { inputs = invoker.in_puts } outputs = invoker.out_puts } } template("ts2abc_unittest_action") { _target_name_ = "${target_name}" invoker.module_out_path = "ark/ts2abc" # unittest for phone running ohos_unittest(_target_name_) { configs = [ "${ts2abc_root}/ts2abc:ts2abc_config" ] deps = [ "${ts2abc_root}/ts2abc:ts2abc_static" ] forward_variables_from(invoker, "*") } _module_out_path_ = invoker.module_out_path # unittest for host running action("${_target_name_}Action") { testonly = true _host_test_target_ = ":${_target_name_}(${host_toolchain})" _root_out_dir_ = get_label_info(_host_test_target_, "root_out_dir") deps = [ _host_test_target_ ] script = "${ts2abc_root}/scripts/run_tests_executable.sh" args = [ rebase_path(_root_out_dir_) + "/tests/unittest/${_module_out_path_}/${_target_name_}" ] inputs = [ "$_root_out_dir_/tests/unittest/${_module_out_path_}/${_target_name_}", ] outputs = [ "$target_out_dir/${_target_name_}/" ] } } # ts2abc performs the ut test # # Mandatory arguments: # js_file: The name of the test use case file to execute , ex expression/TemplateExpression.test.js template("ts2abc_unittest") { assert(defined(invoker.js_file), "js_file is required!") action("$target_name") { script = "${ts2abc_root}/scripts/run_tests.py" deps = [ "${ts2abc_root}:ts2abc_tests" ] args = [ "--src-dir", rebase_path("${ts2abc_root}"), "--dist-dir", rebase_path(target_out_dir + "/.."), "--node-modules", rebase_path("${node_modules}"), "--js-file", invoker.js_file, "--gn-build", ] if (host_toolchain == toolchain_linux) { args += [ "--platform", "linux", ] } else if (host_toolchain == toolchain_mac) { args += [ "--platform", "mac", ] } else { args += [ "--platform", "win", ] } outputs = [ "$target_out_dir/${target_name}/" ] } }