#!/usr/bin/env -S v module main import os import vab.vxt import vab.android.ndk fn main() { assert ndk.found() assert vxt.found() work_dir := os.join_path(os.vtmp_dir(), 'android_cross_compile_test') os.rm(work_dir) or {} os.mkdir_all(work_dir) or { panic(err) } vexe := vxt.vexe() examples_dir := os.join_path(vxt.home(), 'examples') v_example := os.join_path(examples_dir, 'toml.v') ndk_version := ndk.default_version() sysroot_path := ndk.sysroot_path(ndk_version) or { panic(err) } include_path := os.join_path(sysroot_path, 'usr', 'include') android_include_path := os.join_path(include_path, 'android') //'-I"$include_path"' cflags := ['-I"$android_include_path"', '-Wno-unused-value', '-Wno-implicit-function-declaration', '-Wno-int-conversion'] for arch in ndk.supported_archs { for level in ['min', 'max'] { compiler_api := match level { 'min' { ndk.compiler_min_api(.c, ndk_version, arch) or { panic(err) } } 'max' { ndk.compiler_max_api(.c, ndk_version, arch) or { panic(err) } } else { panic('invalid min/max level') } } os.setenv('VCROSS_COMPILER_NAME', compiler_api, true) c_file := os.join_path(work_dir, arch + '-' + level + '.c') o_file := os.join_path(work_dir, arch + '-' + level + '.o') // x.v -> x.c v_compile_cmd := '$vexe -o $c_file -os android -gc none $v_example' vres := os.execute(v_compile_cmd) if vres.exit_code != 0 { panic('"$v_compile_cmd" failed: $vres.output') } assert os.exists(c_file) // x.c -> x.o compile_cmd := '$compiler_api ${cflags.join(' ')} -c $c_file -o $o_file' cres := os.execute(compile_cmd) if cres.exit_code != 0 { panic('"$compile_cmd" failed: $cres.output') } assert os.exists(o_file) compiler_exe_name := os.file_name(compiler_api) println('Compiled examples/toml.v successfully for ($level) $arch $compiler_exe_name') } } }