changeset 2604:1f9b9265d79a

Fixed building QuickJS support with clang 19. checking for QuickJS library -lquickjs In file included from build/autotest.c:6: /home/xeioex/workspace/nginx/nginScript/quickjs/quickjs.h:1052:34: error: cast from 'JSCFunctionMagic *' (aka 'struct JSValue (*)(struct JSContext *, struct JSValue, int, struct JSValue *, int)') to 'JSCFunction *' (aka 'struct JSValue (*)(struct JSContext *, struct JSValue, int, struct JSValue *)') converts to incompatible function type [-Werror,-Wcast-function-type-mismatch] 1052 | return JS_NewCFunction2(ctx, (JSCFunction *)func, name, length, cproto, magic); -Wcast-function-type-mismatch become enabled by -Werror since clang 19.
author Dmitry Volyntsev <xeioex@nginx.com>
date Mon, 25 Aug 2025 16:47:43 -0700
parents 2db79dbf07f6
children a9ec849a6c8c
files auto/quickjs nginx/config src/qjs.h
diffstat 3 files changed, 28 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/auto/quickjs	Fri Aug 15 17:28:47 2025 -0700
+++ b/auto/quickjs	Mon Aug 25 16:47:43 2025 -0700
@@ -5,6 +5,7 @@
 
 NJS_QUICKJS_LIB=
 NJS_HAVE_QUICKJS=NO
+NJS_QUICKJS_DEFAULT_INCS="src $NJS_BUILD_DIR"
 
 if [ $NJS_TRY_QUICKJS = YES ]; then
     njs_found=no
@@ -12,14 +13,9 @@
     njs_feature="QuickJS library -lquickjs.lto"
     njs_feature_name=NJS_HAVE_QUICKJS
     njs_feature_run=yes
-    njs_feature_incs=
+    njs_feature_incs="$NJS_QUICKJS_DEFAULT_INCS"
     njs_feature_libs="-lquickjs.lto -lm -ldl -lpthread"
-    njs_feature_test="#if defined(__GNUC__) && (__GNUC__ >= 8)
-                      #pragma GCC diagnostic push
-                      #pragma GCC diagnostic ignored \"-Wcast-function-type\"
-                      #endif
-
-                      #include <quickjs.h>
+    njs_feature_test="#include <qjs.h>
 
                       int main() {
                           JSRuntime *rt;
@@ -39,7 +35,7 @@
 
     if [ $njs_found = no ]; then
         njs_feature="QuickJS library -I/usr/include/quickjs/ -L/usr/lib/quickjs/ -lquickjs.lto"
-        njs_feature_incs="/usr/include/quickjs/"
+        njs_feature_incs="$NJS_QUICKJS_DEFAULT_INCS /usr/include/quickjs/"
         njs_feature_libs="-L/usr/lib/quickjs/ -lquickjs.lto -lm -ldl -lpthread"
 
         . auto/feature
@@ -47,7 +43,7 @@
 
     if [ $njs_found = no ]; then
         njs_feature="QuickJS library -I/usr/include/quickjs/ -L/usr/lib/quickjs/ -lquickjs"
-        njs_feature_incs="/usr/include/quickjs/"
+        njs_feature_incs="$NJS_QUICKJS_DEFAULT_INCS /usr/include/quickjs/"
         njs_feature_libs="-L/usr/lib/quickjs/ -lquickjs -lm -ldl -lpthread"
 
         . auto/feature
@@ -55,7 +51,7 @@
 
     if [ $njs_found = no ]; then
         njs_feature="QuickJS-NG library -lqjs"
-        njs_feature_incs=""
+        njs_feature_incs="$NJS_QUICKJS_DEFAULT_INCS"
         njs_feature_libs="-lqjs -lm -ldl -lpthread"
 
         . auto/feature
@@ -66,12 +62,7 @@
 
         njs_feature="QuickJS JS_GetClassID()"
         njs_feature_name=NJS_HAVE_QUICKJS_GET_CLASS_ID
-        njs_feature_test="#if defined(__GNUC__) && (__GNUC__ >= 8)
-                          #pragma GCC diagnostic push
-                          #pragma GCC diagnostic ignored \"-Wcast-function-type\"
-                          #endif
-
-                          #include <quickjs.h>
+        njs_feature_test="#include <qjs.h>
 
                           int main() {
                               (void) JS_GetClassID(JS_UNDEFINED);
@@ -89,12 +80,7 @@
 
         njs_feature="QuickJS JS_NewTypedArray()"
         njs_feature_name=NJS_HAVE_QUICKJS_NEW_TYPED_ARRAY
-        njs_feature_test="#if defined(__GNUC__) && (__GNUC__ >= 8)
-                          #pragma GCC diagnostic push
-                          #pragma GCC diagnostic ignored \"-Wcast-function-type\"
-                          #endif
-
-                          #include <quickjs.h>
+        njs_feature_test="#include <qjs.h>
 
                           int main() {
                               JSValue   ta, argv;
@@ -116,12 +102,7 @@
 
         njs_feature="QuickJS JS_IsSameValue()"
         njs_feature_name=NJS_HAVE_QUICKJS_IS_SAME_VALUE
-        njs_feature_test="#if defined(__GNUC__) && (__GNUC__ >= 8)
-                          #pragma GCC diagnostic push
-                          #pragma GCC diagnostic ignored \"-Wcast-function-type\"
-                          #endif
-
-                          #include <quickjs.h>
+        njs_feature_test="#include <qjs.h>
 
                           int main() {
                               JSRuntime *rt;
@@ -139,12 +120,7 @@
 
         njs_feature="QuickJS JS_IsArray()"
         njs_feature_name=NJS_HAVE_QUICKJS_IS_ARRAY_SINGLE_ARG
-        njs_feature_test="#if defined(__GNUC__) && (__GNUC__ >= 8)
-                          #pragma GCC diagnostic push
-                          #pragma GCC diagnostic ignored \"-Wcast-function-type\"
-                          #endif
-
-                          #include <quickjs.h>
+        njs_feature_test="#include <qjs.h>
 
                           int main() {
                               JSRuntime *rt;
@@ -162,12 +138,7 @@
 
         njs_feature="QuickJS JS_AddIntrinsicBigInt()"
         njs_feature_name=NJS_HAVE_QUICKJS_ADD_INTRINSIC_BIG_INT
-        njs_feature_test="#if defined(__GNUC__) && (__GNUC__ >= 8)
-                          #pragma GCC diagnostic push
-                          #pragma GCC diagnostic ignored \"-Wcast-function-type\"
-                          #endif
-
-                          #include <quickjs.h>
+        njs_feature_test="#include <qjs.h>
 
                           int main() {
                               JSRuntime *rt;
@@ -186,12 +157,7 @@
         njs_feature="QuickJS version"
         njs_feature_name=NJS_QUICKJS_VERSION
         njs_feature_run=value
-        njs_feature_test="#if defined(__GNUC__) && (__GNUC__ >= 8)
-                          #pragma GCC diagnostic push
-                          #pragma GCC diagnostic ignored \"-Wcast-function-type\"
-                          #endif
-
-                          #include <quickjs.h>
+        njs_feature_test="#include <qjs.h>
 
                           int main() {
 #if defined(QJS_VERSION_MAJOR)
@@ -206,7 +172,8 @@
 
         NJS_HAVE_QUICKJS=YES
         NJS_QUICKJS_LIB="$njs_feature_libs"
-        NJS_LIB_INCS="$NJS_LIB_INCS $njs_feature_incs"
+        NJS_QUICKJS_INCS=`echo "$njs_feature_incs" | sed -e "s|^$NJS_QUICKJS_DEFAULT_INCS||"`
+        NJS_LIB_INCS="$NJS_LIB_INCS $NJS_QUICKJS_INCS"
         NJS_LIB_AUX_LIBS="$NJS_LIB_AUX_LIBS $njs_feature_libs"
     fi
 
--- a/nginx/config	Fri Aug 15 17:28:47 2025 -0700
+++ b/nginx/config	Mon Aug 25 16:47:43 2025 -0700
@@ -23,6 +23,7 @@
 NJS_ZLIB_LIB=
 NJS_QUICKJS_LIB=
 NJS_QUICKJS_INC=
+NJS_QUICKJS_DEFAULT_INCS="$ngx_addon_dir/../src $ngx_addon_dir/../build"
 NJS_HAVE_QUICKJS=
 
 if [ $NJS_QUICKJS != NO ]; then
@@ -30,13 +31,8 @@
     ngx_feature="QuickJS library -lquickjs.lto"
     ngx_feature_name=NJS_HAVE_QUICKJS
     ngx_feature_run=yes
-    ngx_feature_incs="#if defined(__GNUC__) && (__GNUC__ >= 8)
-                      #pragma GCC diagnostic push
-                      #pragma GCC diagnostic ignored \"-Wcast-function-type\"
-                      #endif
-
-                      #include <quickjs.h>"
-    ngx_feature_path=""
+    ngx_feature_incs="#include <qjs.h>"
+    ngx_feature_path="$NJS_QUICKJS_DEFAULT_INCS"
     ngx_feature_libs="-lquickjs.lto -lm -ldl -lpthread"
     ngx_feature_test="JSRuntime *rt;
 
@@ -54,7 +50,7 @@
 
     if [ $ngx_found = no ]; then
         ngx_feature="QuickJS library -I/usr/include/quickjs/ -L/usr/lib/quickjs/ -lquickjs.lto"
-        ngx_feature_path="/usr/include/quickjs/"
+        ngx_feature_path="$NJS_QUICKJS_DEFAULT_INCS /usr/include/quickjs/"
         ngx_feature_libs="-L/usr/lib/quickjs/ -lquickjs.lto -lm -ldl -lpthread"
 
         . auto/feature
@@ -69,7 +65,7 @@
 
     if [ $ngx_found = no ]; then
         ngx_feature="QuickJS-NG library -lqjs"
-        ngx_feature_path=""
+        ngx_feature_path="$NJS_QUICKJS_DEFAULT_INCS"
         ngx_feature_libs="-lqjs -lm -ldl -lpthread"
 
         . auto/feature
@@ -108,7 +104,7 @@
 
         NJS_HAVE_QUICKJS=YES
         NJS_QUICKJS_LIB="$ngx_feature_libs"
-        NJS_QUICKJS_INC="$ngx_feature_path"
+        NJS_QUICKJS_INC=`echo "$ngx_feature_path" | sed -e "s|^$NJS_QUICKJS_DEFAULT_INCS||"`
 
         echo " enabled QuickJS engine"
     fi
--- a/src/qjs.h	Fri Aug 15 17:28:47 2025 -0700
+++ b/src/qjs.h	Mon Aug 25 16:47:43 2025 -0700
@@ -20,7 +20,12 @@
 #include <njs_utils.h>
 #include <njs_assert.h>
 
-#if defined(__GNUC__) && (__GNUC__ >= 8)
+#ifndef __has_warning
+#  define __has_warning(x) 0
+#endif
+
+#if (defined(__GNUC__) && (__GNUC__ >= 8))                                    \
+    || (defined(__clang__) && __has_warning("-Wcast-function-type"))
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wcast-function-type"
 #endif
@@ -31,7 +36,8 @@
 #define JS_BOOL bool
 #endif
 
-#if defined(__GNUC__) && (__GNUC__ >= 8)
+#if (defined(__GNUC__) && (__GNUC__ >= 8))                                    \
+    || (defined(__clang__) && __has_warning("-Wcast-function-type"))
 #pragma GCC diagnostic pop
 #endif
 #include <pthread.h>