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:
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',
)