diff --git a/arkoala-arkts/package.json b/arkoala-arkts/package.json index 1079a09485ec7c8700b61a5eaaa85ce8075fb828..17d41b17a2f3032f0e6846b2394b6945e88eaf8a 100644 --- a/arkoala-arkts/package.json +++ b/arkoala-arkts/package.json @@ -63,8 +63,14 @@ "build:arkoala": "npm run build:arkoala:components && npm run link:arkoala", "build:arkoala:inc": "npm run build:arkoala:components:inc && npm run link:arkoala", "link:arkoala": "mkdir -p build && ../incremental/tools/panda/arkts/arklink --output build/arkoala.abc -- ./arkui/build/arkui-no-common.abc ../arkoala/arkui-common/build/arkui-common.abc ../incremental/runtime/build/incremental.abc ../interop/build/interop.abc", + "aot:host:arkoala": "npm run link:arkoala && npm run -C ../incremental/tools/fast-arktsc compile && node ../incremental/tools/fast-arktsc --only-aot build/arkoala.abc", + "aot:arm32:arkoala": "npm run link:arkoala && npm run -C ../incremental/tools/fast-arktsc compile && node ../incremental/tools/fast-arktsc --only-aot build/arkoala.abc --aot-target arm", + "aot:arm64:arkoala": "npm run link:arkoala && npm run -C ../incremental/tools/fast-arktsc compile && node ../incremental/tools/fast-arktsc --only-aot build/arkoala.abc --aot-target arm64", "build:user": "npm run build:user --prefix user && mkdir -p ./build && cp -r user/build/user.abc ./build/", "build:shopping": "npm run build:shopping --prefix shopping && mkdir -p ./build && cp -r shopping/build/shopping.abc ./build/", + "aot:host:shopping": "npm run build:shopping && npm run -C ../incremental/tools/fast-arktsc compile && npm run aot:host:arkoala && node ../incremental/tools/fast-arktsc --only-aot build/shopping.abc --aot-libs ./build/arkoala.abc", + "aot:arm32:shopping": "npm run build:shopping && npm run -C ../incremental/tools/fast-arktsc compile && npm run aot:host:arkoala && node ../incremental/tools/fast-arktsc --only-aot build/shopping.abc --aot-libs ./build/arkoala.abc --aot-target arm", + "aot:arm64:shopping": "npm run build:shopping && npm run -C ../incremental/tools/fast-arktsc compile && npm run aot:host:arkoala && node ../incremental/tools/fast-arktsc --only-aot build/shopping.abc --aot-libs ./build/arkoala.abc --aot-target arm64", "run:node:user": "ACE_LIBRARY_PATH=build PANDA_HOME=../incremental/tools/panda/node_modules/@panda/sdk node build/index.js panda:TrivialApp", "run:node:user:navigation": "ACE_LIBRARY_PATH=build PANDA_HOME=../incremental/tools/panda/node_modules/@panda/sdk node build/index.js panda:NavigationApp", "run:node:shopping": "ACE_LIBRARY_PATH=build PANDA_HOME=../incremental/tools/panda/node_modules/@panda/sdk node build/index.js panda:ShoppingApp", diff --git a/incremental/tools/fast-arktsc/src/main.ts b/incremental/tools/fast-arktsc/src/main.ts index 33803a4c9e71638b83e5792c1c8dd7fef16c6e8f..2e8bc7cf3dba45c484a27f87b160e5528a9511d7 100644 --- a/incremental/tools/fast-arktsc/src/main.ts +++ b/incremental/tools/fast-arktsc/src/main.ts @@ -18,6 +18,7 @@ import { program } from "commander" import * as fs from "fs" import * as path from "path" +import * as child_process from "child_process" import { minimatch } from 'minimatch' const readdirSyncRecursive: (dir: string) => string[] = (dir: string) => @@ -33,10 +34,17 @@ const options = program .option('--link-name ', 'Name of combined link-name.abc', "all") .option('--target ', 'Target build system', "ninja") .option('--file-option', 'When provided pass the source as --file rather than a free option') + .option('--aot-libs ', 'Comma-separated AOT libraries to include') + .option('--only-aot ', 'AOT an .abc taking --aot-libs into account') + .option('--aot-target ', 'Compilation target for AOT') + .parse() .opts() -main(options.inputFiles, options.outputDir, options.linkName, options.target, options.fileOptions) +if (options.onlyAot) + mainAot(path.resolve(options.onlyAot)) +else + main(options.inputFiles, path.resolve(options.outputDir), options.linkName, options.target) function findMatching(base: string, include: string[], exclude: string[]): string[] { return readdirSyncRecursive(base) @@ -61,6 +69,34 @@ function producePairs(files: string[], }) } +function archDir(): string { + const arch = process.arch + let sdkArch = ""; + switch (arch) { + case "x64": + sdkArch = "" + break + case "arm64": + sdkArch = "arm64" + break + default: throw new Error(`Unexpected arch: ${arch}`) + + } + const platform = process.platform + let sdkPlatform = "" + switch (platform) { + case "linux": sdkPlatform = "linux" + break + case "win32": sdkPlatform = "windows" + break + case "darwin": sdkPlatform = "macos" + break + default: throw new Error(`Unsupported platform ${platform}`) + } + const suffix = "host_tools" + return [sdkPlatform, sdkArch, suffix].filter(it => it != "").join("_") +} + function produceMakefile(compiler: string, files: {input: string, output: string}[], outputDir: string, @@ -88,7 +124,10 @@ function produceNinjafile(compiler: string, files: {input: string, output: string}[], outputDir: string, config: string, - linkName: string): string { + linkName: string + ): string { + // We have no Panda SDK for macOS. + const tools_prefix = process.platform == "darwin" ? "echo " : "" let result: string[] = [] let all: string[] = [] let basename = path.basename(compiler) @@ -96,12 +135,11 @@ function produceNinjafile(compiler: string, let prefix = ` rule arkts_compiler - command = ${compiler} --ets-module --arktsconfig ${path.resolve(config)} ${options.fileOption ? "--file" : ""} $in --output $out - description = "Compiling ARKTS $out + command = ${tools_prefix}${compiler} --ets-module --arktsconfig ${path.resolve(config)} ${options.fileOption ? "--file" : ""} $in --output $out + description = "Compiling ARKTS $out" rule arkts_linker - command = ${linker} --output $out -- $in - description = "Linking ARKTS $out -` + command = ${tools_prefix}${linker} --output $out -- $in + description = "Linking ARKTS $out"` files.forEach(it => { all.push(it.output) result.push(`build ${it.output}: arkts_compiler ${it.input}\n`) @@ -111,10 +149,10 @@ rule arkts_linker result.push(`build link: phony ${outputDir}/${linkName}.abc`) result.push(`build all: phony link`) result.push("default all\n") - return prefix + result.join('\n') + return prefix + '\n' + result.join('\n') } -function main(inputFile: string, outputDir: string, linkName: string, target: string, fileOptions: boolean) { +function main(inputFile: string, outputDir: string, linkName: string, target: string) { let config = JSON.parse(fs.readFileSync(inputFile, 'utf8')) let baseDir = path.resolve(path.dirname(inputFile)) let include = (config.include as string[]).map(it => it.replace('\\.', '.')) @@ -135,3 +173,45 @@ function main(inputFile: string, outputDir: string, linkName: string, target: st } } +function mainAot(abc: string) { + let sdk = options.sdk ?? path.resolve(path.join(__dirname, '..', '..', 'panda', 'node_modules', '@panda', 'sdk')) + let aot = path.join(sdk, archDir(), 'bin', 'ark_aot') + let stdlib = path.resolve(path.join(sdk, "ets", "etsstdlib.abc")) + const aotLibs = [stdlib] + if (options.aotLibs) aotLibs.push(... options.aotLibs.split(",")) + let args: string[] = [] + if (process.platform == "darwin") { + // No tools on macOS, just echo + args.push(aot) + aot = "echo" + } + let result = abc.replace('.abc', '.an') + args.push(... options.aotTarget ? [`--compiler-cross-arch=${options.aotTarget}`] : []) + args.push(... [ + `--load-runtimes=ets`, + `--boot-panda-files=${aotLibs.join(':')}:${abc}`, + `--paoc-panda-files=${abc}`, + `--paoc-output=${result}` + ]) + console.log(`AOT compile ${abc}...`) + const child = child_process.spawn(aot, args) + child.stdout.on('data', (data) => { + process.stdout.write(data); + }) + child.stderr.on('data', (data) => { + process.stderr.write(data); + }) + child.on('close', (code) => { + if (code != 0) + console.log(`Command ${aot} ${args.join(" ")} failed with return code ${code}`) + else + console.log(`Produced AOT file ${result}: ${Math.round(fs.statSync(result).size / 1024 / 1024)}M`) + process.exit(code) + }) + child.on('exit', (code, signal) => { + if (signal) { + console.log(`Received signal: ${signal} from '${aot} ${args.join(' ')}'`) + process.exit(1) + } + }) +} diff --git a/incremental/tools/panda/arkts/common.js b/incremental/tools/panda/arkts/common.js index 1b890ddbaed57a9394028e06c3c885e36a848d04..6a7c77463c1d1bc012a7a84db37557c731fb471a 100644 --- a/incremental/tools/panda/arkts/common.js +++ b/incremental/tools/panda/arkts/common.js @@ -36,6 +36,8 @@ const ARCH_TOOLS = (() => { break; case "win32": sdkPlatform = "windows" break; + case "darwin": sdkPlatform = "macos" + break; default: throw new Error(`Unsupported platform ${p}`) } const suffix = "host_tools" diff --git a/interop/src/cpp/vmloader.cc b/interop/src/cpp/vmloader.cc index 4bec3c85f36d15d95abf3717a9cf809d5474b65a..f35f1fe7d2d3e71dd2191dffe9337311b61df31f 100644 --- a/interop/src/cpp/vmloader.cc +++ b/interop/src/cpp/vmloader.cc @@ -257,6 +257,8 @@ extern "C" DLL_EXPORT KInt LoadVirtualMachine(KInt vmKind, const char* appClassP etsVMOptions.push_back({EtsOptionType::ETS_VERIFICATION_MODE, "on-the-fly"}); etsVMOptions.push_back({EtsOptionType::ETS_NO_JIT, nullptr}); etsVMOptions.push_back({EtsOptionType::ETS_MOBILE_LOG, (void*)ArkMobileLog}); + etsVMOptions.push_back({EtsOptionType::ETS_AOT, nullptr}); + // etsVMOptions.push_back({EtsOptionType::ETS_LOG_LEVEL, "info"}); pandaVMArgs.nOptions = etsVMOptions.size(); pandaVMArgs.options = etsVMOptions.data(); g_vmEntry.vmKind = PANDA_VM_KIND;