[njs] Fixed building QuickJS support with clang 19.
noreply at nginx.com
noreply at nginx.com
Wed Aug 27 01:59:41 UTC 2025
details: https://github.com/nginx/njs/commit/8259f9a2ee8d5c0f7ef45ccf563984a9ad95a9db
branches: master
commit: 8259f9a2ee8d5c0f7ef45ccf563984a9ad95a9db
user: Dmitry Volyntsev <xeioex at nginx.com>
date: Mon, 25 Aug 2025 16:47:43 -0700
description:
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.
---
auto/quickjs | 61 ++++++++++++++----------------------------------------------
nginx/config | 16 ++++++----------
src/qjs.h | 10 ++++++++--
3 files changed, 28 insertions(+), 59 deletions(-)
diff --git a/auto/quickjs b/auto/quickjs
index 60c0888e..cbf860a2 100644
--- a/auto/quickjs
+++ b/auto/quickjs
@@ -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 @@ if [ $NJS_TRY_QUICKJS = YES ]; then
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_TRY_QUICKJS = YES ]; then
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_TRY_QUICKJS = YES ]; then
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_TRY_QUICKJS = YES ]; then
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 @@ if [ $NJS_TRY_QUICKJS = YES ]; then
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 @@ if [ $NJS_TRY_QUICKJS = YES ]; then
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 @@ if [ $NJS_TRY_QUICKJS = YES ]; then
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 @@ if [ $NJS_TRY_QUICKJS = YES ]; then
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 @@ if [ $NJS_TRY_QUICKJS = YES ]; then
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 @@ if [ $NJS_TRY_QUICKJS = YES ]; then
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 @@ if [ $NJS_TRY_QUICKJS = YES ]; then
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
diff --git a/nginx/config b/nginx/config
index 1c303d9c..474be8f3 100644
--- a/nginx/config
+++ b/nginx/config
@@ -23,6 +23,7 @@ NJS_XSLT_LIB=
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 @@ if [ $NJS_QUICKJS != NO ]; then
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 [ $NJS_QUICKJS != NO ]; then
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 [ $NJS_QUICKJS != NO ]; then
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 @@ if [ $NJS_QUICKJS != NO ]; then
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
diff --git a/src/qjs.h b/src/qjs.h
index e920453e..954cc23c 100644
--- a/src/qjs.h
+++ b/src/qjs.h
@@ -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>
More information about the nginx-devel
mailing list