From b2c7343ea5972d4667e649ffa31f3f41baf0ce74 Mon Sep 17 00:00:00 2001 From: Waldemar Kornewald Date: Tue, 28 Oct 2025 19:07:26 +0100 Subject: [PATCH 1/3] Support for iOS, tvOS and watchOS --- CMakeLists.txt | 61 ++++++++++++++++++++++++++++++-------------------- quickjs-libc.c | 4 ++-- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f49a052e3..9fe6bc4bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,10 @@ else() set(MINGW FALSE) endif() +set(TVOS (CMAKE_SYSTEM_NAME STREQUAL "tvOS")) +set(WATCHOS (CMAKE_SYSTEM_NAME STREQUAL "watchOS")) +set(APPLE_MOBILE (IOS OR TVOS OR WATCHOS)) + if(NOT CMAKE_BUILD_TYPE) message(STATUS "No build type selected, default to Release") set(CMAKE_BUILD_TYPE "Release") @@ -38,7 +42,7 @@ macro(xcheck_add_c_compiler_flag FLAG) endmacro() xcheck_add_c_compiler_flag(-Wall) -if(NOT MSVC AND NOT IOS) +if(NOT MSVC AND NOT APPLE_MOBILE) xcheck_add_c_compiler_flag(-Werror) xcheck_add_c_compiler_flag(-Wextra) endif() @@ -241,6 +245,15 @@ if(WIN32) # NB: Windows 7 is EOL and we are only supporting in so far as it doesn't interfere with progress. list(APPEND qjs_defines WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0601) endif() +if(TVOS) + list(APPEND qjs_defines _TVOS) +endif() +if(WATCHOS) + list(APPEND qjs_defines _WATCHOS) +endif() +if(APPLE_MOBILE) + list(APPEND qjs_defines _APPLE_MOBILE) +endif() list(APPEND qjs_libs ${CMAKE_DL_LIBS}) find_package(Threads) if(NOT CMAKE_SYSTEM_NAME STREQUAL "WASI") @@ -416,29 +429,29 @@ endif() # Install target # -if(NOT IOS) - file(STRINGS quickjs.h quickjs_h REGEX QJS_VERSION) - string(REGEX MATCH "QJS_VERSION_MAJOR ([0-9]*)" _ "${quickjs_h}") - set(QJS_VERSION_MAJOR ${CMAKE_MATCH_1}) - string(REGEX MATCH "QJS_VERSION_MINOR ([0-9]*)" _ "${quickjs_h}") - set(QJS_VERSION_MINOR ${CMAKE_MATCH_1}) - string(REGEX MATCH "QJS_VERSION_PATCH ([0-9]*)" _ "${quickjs_h}") - set(QJS_VERSION_PATCH ${CMAKE_MATCH_1}) - set_target_properties(qjs PROPERTIES - VERSION ${QJS_VERSION_MAJOR}.${QJS_VERSION_MINOR}.${QJS_VERSION_PATCH} - SOVERSION ${QJS_VERSION_MAJOR} - ) - install(FILES quickjs.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) - if(QJS_BUILD_LIBC) - install(FILES quickjs-libc.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) - endif() +file(STRINGS quickjs.h quickjs_h REGEX QJS_VERSION) +string(REGEX MATCH "QJS_VERSION_MAJOR ([0-9]*)" _ "${quickjs_h}") +set(QJS_VERSION_MAJOR ${CMAKE_MATCH_1}) +string(REGEX MATCH "QJS_VERSION_MINOR ([0-9]*)" _ "${quickjs_h}") +set(QJS_VERSION_MINOR ${CMAKE_MATCH_1}) +string(REGEX MATCH "QJS_VERSION_PATCH ([0-9]*)" _ "${quickjs_h}") +set(QJS_VERSION_PATCH ${CMAKE_MATCH_1}) +set_target_properties(qjs PROPERTIES + VERSION ${QJS_VERSION_MAJOR}.${QJS_VERSION_MINOR}.${QJS_VERSION_PATCH} + SOVERSION ${QJS_VERSION_MAJOR} +) +install(FILES quickjs.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +if(QJS_BUILD_LIBC) + install(FILES quickjs-libc.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +endif() +if(NOT APPLE_MOBILE) install(TARGETS qjs_exe RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(TARGETS qjsc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - install(TARGETS qjs EXPORT qjsConfig - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - install(EXPORT qjsConfig DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/quickjs) - install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR}) - install(DIRECTORY examples DESTINATION ${CMAKE_INSTALL_DOCDIR}) endif() +install(TARGETS qjs EXPORT qjsConfig + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) +install(EXPORT qjsConfig DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/quickjs) +install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR}) +install(DIRECTORY examples DESTINATION ${CMAKE_INSTALL_DOCDIR}) diff --git a/quickjs-libc.c b/quickjs-libc.c index 9e88e32cd..59b8f7106 100644 --- a/quickjs-libc.c +++ b/quickjs-libc.c @@ -3114,7 +3114,7 @@ static JSValue js_os_realpath(JSContext *ctx, JSValueConst this_val, } #endif -#if !defined(_WIN32) && !defined(__wasi__) +#if !defined(_WIN32) && !defined(__wasi__) && !defined(_TVOS) && !defined(_WATCHOS) static JSValue js_os_symlink(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { @@ -4173,7 +4173,7 @@ static const JSCFunctionListEntry js_os_funcs[] = { #if !defined(__wasi__) JS_CFUNC_DEF("realpath", 1, js_os_realpath ), #endif -#if !defined(_WIN32) && !defined(__wasi__) +#if !defined(_WIN32) && !defined(__wasi__) && !defined(_TVOS) && !defined(_WATCHOS) JS_CFUNC_MAGIC_DEF("lstat", 1, js_os_stat, 1 ), JS_CFUNC_DEF("symlink", 2, js_os_symlink ), JS_CFUNC_DEF("readlink", 1, js_os_readlink ), From 8c0c2282cd69eb2a98ae3321320ded048659b447 Mon Sep 17 00:00:00 2001 From: Waldemar Kornewald Date: Tue, 28 Oct 2025 22:46:58 +0100 Subject: [PATCH 2/3] PR review --- CMakeLists.txt | 8 ++------ quickjs-libc.c | 5 +++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fe6bc4bf..c1b6286e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,6 @@ endif() set(TVOS (CMAKE_SYSTEM_NAME STREQUAL "tvOS")) set(WATCHOS (CMAKE_SYSTEM_NAME STREQUAL "watchOS")) -set(APPLE_MOBILE (IOS OR TVOS OR WATCHOS)) if(NOT CMAKE_BUILD_TYPE) message(STATUS "No build type selected, default to Release") @@ -42,7 +41,7 @@ macro(xcheck_add_c_compiler_flag FLAG) endmacro() xcheck_add_c_compiler_flag(-Wall) -if(NOT MSVC AND NOT APPLE_MOBILE) +if(NOT MSVC AND NOT IOS AND NOT TVOS AND NOT WATCHOS) xcheck_add_c_compiler_flag(-Werror) xcheck_add_c_compiler_flag(-Wextra) endif() @@ -251,9 +250,6 @@ endif() if(WATCHOS) list(APPEND qjs_defines _WATCHOS) endif() -if(APPLE_MOBILE) - list(APPEND qjs_defines _APPLE_MOBILE) -endif() list(APPEND qjs_libs ${CMAKE_DL_LIBS}) find_package(Threads) if(NOT CMAKE_SYSTEM_NAME STREQUAL "WASI") @@ -444,7 +440,7 @@ install(FILES quickjs.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) if(QJS_BUILD_LIBC) install(FILES quickjs-libc.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif() -if(NOT APPLE_MOBILE) +if(NOT IOS AND NOT TVOS AND NOT WATCHOS) install(TARGETS qjs_exe RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(TARGETS qjsc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() diff --git a/quickjs-libc.c b/quickjs-libc.c index 59b8f7106..2c7ac7704 100644 --- a/quickjs-libc.c +++ b/quickjs-libc.c @@ -69,6 +69,7 @@ #if defined(__APPLE__) typedef sig_t sighandler_t; #include +#include #define environ (*_NSGetEnviron()) #endif @@ -3114,7 +3115,7 @@ static JSValue js_os_realpath(JSContext *ctx, JSValueConst this_val, } #endif -#if !defined(_WIN32) && !defined(__wasi__) && !defined(_TVOS) && !defined(_WATCHOS) +#if !defined(_WIN32) && !defined(__wasi__) && !(defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)) static JSValue js_os_symlink(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { @@ -4173,7 +4174,7 @@ static const JSCFunctionListEntry js_os_funcs[] = { #if !defined(__wasi__) JS_CFUNC_DEF("realpath", 1, js_os_realpath ), #endif -#if !defined(_WIN32) && !defined(__wasi__) && !defined(_TVOS) && !defined(_WATCHOS) +#if !defined(_WIN32) && !defined(__wasi__) && !(defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)) JS_CFUNC_MAGIC_DEF("lstat", 1, js_os_stat, 1 ), JS_CFUNC_DEF("symlink", 2, js_os_symlink ), JS_CFUNC_DEF("readlink", 1, js_os_readlink ), From 8f3251fe55af547157d59a70356afc488031d04d Mon Sep 17 00:00:00 2001 From: Waldemar Kornewald Date: Wed, 29 Oct 2025 19:27:53 +0100 Subject: [PATCH 3/3] More explicit setting of TVOS and WATCHOS --- CMakeLists.txt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1b6286e5..f2ada27e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,8 +21,16 @@ else() set(MINGW FALSE) endif() -set(TVOS (CMAKE_SYSTEM_NAME STREQUAL "tvOS")) -set(WATCHOS (CMAKE_SYSTEM_NAME STREQUAL "watchOS")) +if(CMAKE_SYSTEM_NAME STREQUAL "tvOS") + set(TVOS TRUE) +else() + set(TVOS FALSE) +endif() +if(CMAKE_SYSTEM_NAME STREQUAL "watchOS") + set(WATCHOS TRUE) +else() + set(WATCHOS FALSE) +endif() if(NOT CMAKE_BUILD_TYPE) message(STATUS "No build type selected, default to Release")