quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

commit 22cd2a4f66129949a2e4f7f98c1a9f2b9e9b2d8b
parent fc5b34e70593f1c6de37f948dfe052be2e45cd12
Author: Florian Dold <florian@dold.me>
Date:   Fri,  6 Jan 2023 17:47:27 +0100

towards cross-compilation on Android

Diffstat:
Across/android-armeabi-v7a.txt | 18++++++++++++++++++
Across/build-android-armeabi-v7a.sh | 36++++++++++++++++++++++++++++++++++++
Mmeson.build | 57+++++++++++++++++++++++++++++++++++++++++----------------
Mquickjs/quickjs-libc.c | 10++++++++++
Msubprojects/curl/meson.build | 6+++++-
Msubprojects/libsodium/meson.build | 4+++-
6 files changed, 113 insertions(+), 18 deletions(-)

diff --git a/cross/android-armeabi-v7a.txt b/cross/android-armeabi-v7a.txt @@ -0,0 +1,18 @@ +[binaries] +c = 'armv7a-linux-androideabi24-clang' +cmake = 'false' +ar = 'arm-linux-androideabi-ar' +as = 'arm-linux-androideabi-as' +ranlib = 'arm-linux-androideabi-ranlib' +ld = 'arm-linux-androideabi-ld' +strip = 'arm-linux-androideabi-strip' +pkgconfig = 'false' + +[properties] +needs_exe_wrapper = false + +[host_machine] +system = 'linux' +cpu_family = 'arm' +cpu = 'armv7' +endian = 'little' diff --git a/cross/build-android-armeabi-v7a.sh b/cross/build-android-armeabi-v7a.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -eu + +ARCH="arm" +ABI="armeabi-v7a" +API_LEVEL="24" +BUILD_DIR="build-android-armeabi-v7a" + +ANDROID_NDK_HOME="${ANDROID_SDK_ROOT}/ndk-bundle" + +HOST_ROOT="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64" +SYS_ROOT="${HOST_ROOT}/sysroot" +LIB_PATH="/${SYS_ROOT}/usr/lib/${ARCH}-linux-androideabi:${SYS_ROOT}/usr/lib/${ARCH}-linux-androideabi/${API_LEVEL}:${ANDROID_NDK_HOME}/platforms/android-${API_LEVEL}/arch-${ARCH}/usr/lib" +INC_PATH="${SYS_ROOT}/usr/include" + +export PATH="${HOST_ROOT}/bin:${PATH}" + +export CFLAGS="\ + -DANDROID_STL=none \ + -DANDROID_TOOLCHAIN=clang \ + -DANDROID_PLATFORM=android-${API_LEVEL} \ + -DANDROID_ABI=${ABI}" + +echo "building..." + +rm -rf ${BUILD_DIR} + +meson setup --errorlogs \ + --prefix=${ANDROID_NDK_HOME} \ + --includedir=${INC_PATH} \ + --libdir=${LIB_PATH} \ + --build.cmake-prefix-path=${SYS_ROOT} \ + --cross-file cross/armv7a-linux-androideabi.txt \ + ${BUILD_DIR} . + +ninja -v -C ${BUILD_DIR} diff --git a/meson.build b/meson.build @@ -7,10 +7,18 @@ project('quickjs-tart', 'c', ], ) -add_project_arguments('-D_GNU_SOURCE', language : 'c') -add_project_arguments('-DCONFIG_VERSION="0.0.1"', language : 'c') -add_project_arguments('-DCONFIG_BIGNUM', language : 'c') -add_project_arguments('-fno-omit-frame-pointer', language : 'c') +flags = [ + '-D_GNU_SOURCE', + '-D_LARGEFILE_SOURCE', + '-D_FILE_OFFSET_BITS=64', + '-DCONFIG_VERSION="0.0.1"', + '-DCONFIG_BIGNUM', + '-fno-omit-frame-pointer', +] + +add_project_arguments(flags, language : 'c') +add_project_arguments(flags, language : 'c', native : true) + cc = meson.get_compiler('c') @@ -34,27 +42,44 @@ libbf = static_library('bf', 'quickjs/libbf.c') libregexp = static_library('regexp', 'quickjs/libregexp.c') libunicode = static_library('unicode', 'quickjs/libunicode.c') cutils = static_library('cutils', 'quickjs/cutils.c') -quickjs_libc = static_library('quickjs-libc', 'quickjs/quickjs-libc.c') +quickjs_libc = static_library('quickjs-libc', 'quickjs/quickjs-libc.c', dependencies : curl_dep ) quickjs = static_library('quickjs', 'quickjs/quickjs.c') +# avoid warning but compile more slowly on non-cross builds +avoid_cross_warning = true + +if avoid_cross_warning or meson.is_cross_build() + libbf_native = static_library('bf_native', 'quickjs/libbf.c', native : true) + libregexp_native = static_library('regexp_native', 'quickjs/libregexp.c', native : true) + libunicode_native = static_library('unicode_native', 'quickjs/libunicode.c', native : true) + cutils_native = static_library('cutils_native', 'quickjs/cutils.c', native : true) + quickjs_native = static_library('quickjs_native', 'quickjs/quickjs.c', native : true) +else + libbf_native = libbf + libregexp_native = libregexp + libunicode_native = libunicode + cutils_native = cutils + quickjs_libc_native = quickjs_libc + quickjs_native = quickjs +endif + qjsc_exe = executable('qjsc', [ 'quickjs/qjsc.c', + 'quickjs/quickjs-libc.c', ], + # Just the compiler, no HTTP support required + c_args : ['-DNO_HTTP'], link_with: [ - libbf, - libregexp, - libunicode , - cutils, - quickjs_libc, - quickjs, + libbf_native, + libregexp_native, + libunicode_native, + cutils_native, + quickjs_native, ], dependencies: [ m_dep, - mbedcrypto_dep, - mbedtls_dep, - mbedx509_dep, - curl_dep, - sodium_dep]) + ], + native : true) repl_c = custom_target('repl_c', input : ['quickjs/repl.js'], diff --git a/quickjs/quickjs-libc.c b/quickjs/quickjs-libc.c @@ -78,8 +78,10 @@ typedef sig_t sighandler_t; - add socket calls */ +#ifndef NO_HTTP #include <curl/curl.h> #include <arpa/inet.h> +#endif typedef struct { struct list_head link; @@ -2095,6 +2097,8 @@ static void js_os_timer_mark(JSRuntime *rt, JSValueConst val, } } +#ifndef NO_HTTP + typedef struct { DynBuf response_data; JSValue headers_list; @@ -2343,6 +2347,8 @@ exception: goto done; } +#endif + static JSValue js_os_setTimeout(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { @@ -4173,7 +4179,9 @@ static const JSCFunctionListEntry js_os_funcs[] = { OS_FLAG(SIGTTOU), #endif JS_CFUNC_DEF("setTimeout", 2, js_os_setTimeout ), +#ifndef NO_HTTP JS_CFUNC_DEF("fetchHttp", 2, js_os_fetchHttp ), +#endif JS_CFUNC_DEF("clearTimeout", 1, js_os_clearTimeout ), JS_PROP_STRING_DEF("platform", OS_PLATFORM, 0 ), JS_CFUNC_DEF("getcwd", 0, js_os_getcwd ), @@ -4222,10 +4230,12 @@ static int js_os_init(JSContext *ctx, JSModuleDef *m) JS_NewClassID(&js_os_timer_class_id); JS_NewClass(JS_GetRuntime(ctx), js_os_timer_class_id, &js_os_timer_class); +#ifndef NO_HTTP if (CURLE_OK != curl_global_init (CURL_GLOBAL_DEFAULT)) { JS_ThrowInternalError(ctx, "unable to init libcurl (global)"); return -1; } +#endif #ifdef USE_WORKER { diff --git a/subprojects/curl/meson.build b/subprojects/curl/meson.build @@ -59,7 +59,11 @@ foreach bh : basic_headers endif endforeach -sizeof_curl_off_t = c_compiler.sizeof('curl_off_t', prefix : '#include <curl/system.h>') +curl_inc = include_directories(['include/']) + +sizeof_curl_off_t = c_compiler.sizeof('curl_off_t', + prefix : '#include <curl/system.h>', + include_directories : curl_inc) add_project_arguments(f'-DSIZEOF_CURL_OFF_T=@sizeof_curl_off_t@', language : 'c') sizeof_long = c_compiler.sizeof('long') add_project_arguments(f'-DSIZEOF_LONG=@sizeof_long@', language : 'c') diff --git a/subprojects/libsodium/meson.build b/subprojects/libsodium/meson.build @@ -108,9 +108,11 @@ if have_xgetbv add_project_arguments('-DHAVE__XGETBV', language: 'c') endif - compile_args += c_compiler.get_supported_arguments( '-fno-strict-aliasing', +) + +compile_args += c_compiler.first_supported_argument( '-fno-strict-overflow', '-fwrapv', )