diff --git a/net/nginx/Makefile b/net/nginx/Makefile index 59af03126b..8960dd014e 100644 --- a/net/nginx/Makefile +++ b/net/nginx/Makefile @@ -37,7 +37,8 @@ PKG_MOD_EXTRA := \ brotli \ headers-more \ ts \ - ubus + ubus \ + njs # official and 3rd-party modules PKG_MOD_ALL := \ $(PKG_MOD_EXTRA) \ @@ -254,7 +255,6 @@ define Download/nginx-mod-headers-more PROTO:=git endef - define Download/nginx-mod-brotli SOURCE_DATE:=2020-04-23 VERSION:=25f86f0bac1101b6512135eac5f93c49c63609e3 @@ -327,6 +327,14 @@ define Download/nginx-mod-ubus PROTO:=git endef +define Download/nginx-mod-njs + SOURCE_DATE:=2024-10-03 + VERSION:=c5a29a7af8894ee1ec44ebda71ef0ea1f2a31af6 + URL:=https://github.com/nginx/njs.git + MIRROR_HASH:=69bc424d4bfd8b7a0a70feeb4787ff8b503ac893fb730f07f3244e35fde876e4 + PROTO:=git +endef + define Module/Download define Download/nginx-mod-$(1) += @@ -473,7 +481,8 @@ CONFIGURE_ARGS += \ $(if $(CONFIG_PACKAGE_nginx-mod-stream),--with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module) \ $(if $(call IsEnabled,NGINX_STREAM_REAL_IP),--with-stream_realip_module) \ $(if $(CONFIG_PACKAGE_nginx-mod-naxsi),--add-dynamic-module=$(PKG_BUILD_DIR)/nginx-mod-naxsi/naxsi_src) \ - $(foreach m,$(filter-out lua-resty-core lua-resty-lrucache naxsi,$(PKG_MOD_EXTRA)), \ + $(if $(CONFIG_PACKAGE_nginx-mod-njs),--add-dynamic-module=$(PKG_BUILD_DIR)/nginx-mod-njs/nginx) \ + $(foreach m,$(filter-out lua-resty-core lua-resty-lrucache naxsi njs,$(PKG_MOD_EXTRA)), \ $(if $(CONFIG_PACKAGE_nginx-mod-$(m)),--add-dynamic-module=$(PKG_BUILD_DIR)/nginx-mod-$(m))) $(eval $(call BuildPackage,nginx-ssl)) @@ -501,6 +510,8 @@ $(eval $(call BuildModule,naxsi,,ngx_http_naxsi, \ Enable NAXSI module.)) $(eval $(call BuildModule,geoip2,+@NGINX_STREAM_CORE_MODULE +nginx-mod-stream +libmaxminddb,ngx_http_geoip2 ngx_stream_geoip2, \ Enable MaxMind GeoIP2 module.)) +$(eval $(call BuildModule,njs,+zlib +libxml2 +libxslt +libpcre2,ngx_http_js, \ + Enable NJS module.)) # TODO: remove after a transition period (together with pkg nginx-util): # It is for smoothly substituting nginx and nginx-mod-luci-ssl (by nginx-ssl diff --git a/net/nginx/patches/nginx-mod-njs/101-feature_test_fix.patch b/net/nginx/patches/nginx-mod-njs/101-feature_test_fix.patch new file mode 100644 index 0000000000..d7c220d787 --- /dev/null +++ b/net/nginx/patches/nginx-mod-njs/101-feature_test_fix.patch @@ -0,0 +1,61 @@ +--- a/nginx-mod-njs/auto/explicit_bzero ++++ b/nginx-mod-njs/auto/explicit_bzero +@@ -7,7 +7,7 @@ + + njs_feature="explicit_bzero()" + njs_feature_name=NJS_HAVE_EXPLICIT_BZERO +-njs_feature_run=yes ++njs_feature_run=no + njs_feature_incs= + njs_feature_libs= + njs_feature_test="#include +--- a/nginx-mod-njs/auto/getrandom ++++ b/nginx-mod-njs/auto/getrandom +@@ -7,7 +7,7 @@ + + njs_feature="getrandom()" + njs_feature_name=NJS_HAVE_GETRANDOM +-njs_feature_run=yes ++njs_feature_run=no + njs_feature_incs= + njs_feature_libs= + njs_feature_test="#include +@@ -76,6 +76,7 @@ if [ $njs_found = no ]; then + + njs_feature="getentropy()" + njs_feature_name=NJS_HAVE_GETENTROPY ++ njs_feature_run=no + njs_feature_test="#include + + int main(void) { +--- a/nginx-mod-njs/auto/memalign ++++ b/nginx-mod-njs/auto/memalign +@@ -8,7 +8,7 @@ + + njs_feature="posix_memalign()" + njs_feature_name=NJS_HAVE_POSIX_MEMALIGN +-njs_feature_run=yes ++njs_feature_run=no + njs_feature_incs= + njs_feature_libs= + njs_feature_test="#include +@@ -31,7 +31,7 @@ if [ $njs_found = no ]; then + + njs_feature="memalign()" + njs_feature_name=NJS_HAVE_MEMALIGN +- njs_feature_run=yes ++ njs_feature_run=no + njs_feature_incs= + njs_feature_libs= + njs_feature_test="#include +--- a/nginx-mod-njs/auto/time ++++ b/nginx-mod-njs/auto/time +@@ -5,7 +5,7 @@ + + njs_feature="clock_gettime(CLOCK_MONOTONIC)" + njs_feature_name=NJS_HAVE_CLOCK_MONOTONIC +-njs_feature_run=yes ++njs_feature_run=no + njs_feature_incs= + njs_feature_libs= + njs_feature_test="#include diff --git a/net/nginx/patches/nginx-mod-njs/102-sizeof_test_fix.patch b/net/nginx/patches/nginx-mod-njs/102-sizeof_test_fix.patch new file mode 100644 index 0000000000..e1e61921fc --- /dev/null +++ b/net/nginx/patches/nginx-mod-njs/102-sizeof_test_fix.patch @@ -0,0 +1,236 @@ +--- a/nginx-mod-njs/auto/types ++++ b/nginx-mod-njs/auto/types +@@ -11,113 +11,37 @@ + # printf("%d", (int) sizeof(TYPE)); + + +-njs_feature="sizeof(int)" +-njs_feature_name=NJS_INT_SIZE +-njs_feature_run=value +-njs_feature_incs= +-njs_feature_libs= +-njs_feature_test="#include +- +- int main() { +- printf(\"%d\", (int) sizeof(int)); +- return 0; +- }" +-. auto/feature +- +- +-njs_feature="sizeof(u_int)" +-njs_feature_name=NJS_UINT_SIZE +-njs_feature_run=value +-njs_feature_incs= +-njs_feature_libs= +-njs_feature_test="#include +- #include +- +- int main() { +- printf(\"%d\", (int) sizeof(u_int)); +- return 0; +- }" +-. auto/feature +- +- +-njs_feature="sizeof(void *)" +-njs_feature_name=NJS_PTR_SIZE +-njs_feature_run=value +-njs_feature_incs= +-njs_feature_libs= +-njs_feature_test="#include +- +- int main() { +- printf(\"%d\", (int) sizeof(void *)); +- return 0; +- }" +-. auto/feature +- +- +-njs_feature="sizeof(uintptr_t)" +-njs_feature_name=NJS_UINTPTR_T_SIZE +-njs_feature_run=value +-njs_feature_incs= +-njs_feature_libs= +-njs_feature_test="#include +- #include +- +- int main() { +- printf(\"%d\", (int) sizeof(uintptr_t)); +- return 0; +- }" +-. auto/feature ++njs_type="int"; . auto/types_util/sizeof ++njs_param=NJS_INT_SIZE; njs_value=$njs_size; . auto/types_util/value + + +-case "$njs_feature_value" in ++njs_type="u_int"; . auto/types_util/sizeof ++njs_param=NJS_UINT_SIZE; njs_value=$njs_size; . auto/types_util/value ++ ++ ++njs_type="void *"; . auto/types_util/sizeof ++njs_param=NJS_PTR_SIZE; njs_value=$njs_size; . auto/types_util/value ++ ++ ++njs_type="uintptr_t"; . auto/types_util/sizeof ++njs_param=NJS_UINTPTR_T_SIZE; njs_value=$njs_size; . auto/types_util/value ++ ++case "$njs_value" in + 8) NJS_64BIT=1 ;; + *) NJS_64BIT=0 ;; + esac + + +-njs_feature="sizeof(size_t)" +-njs_feature_name=NJS_SIZE_T_SIZE +-njs_feature_run=value +-njs_feature_incs= +-njs_feature_libs= +-njs_feature_test="#include +- +- int main() { +- printf(\"%d\", (int) sizeof(size_t)); +- return 0; +- }" +-. auto/feature +- +- +-njs_feature="sizeof(off_t)" +-njs_feature_name=NJS_OFF_T_SIZE +-njs_feature_run=value +-njs_feature_incs= +-njs_feature_libs= +-njs_feature_test="#define _FILE_OFFSET_BITS 64 +- #include +- #include +- +- int main() { +- printf(\"%d\", (int) sizeof(off_t)); +- return 0; +- }" +-. auto/feature +- +- +-njs_feature="sizeof(time_t)" +-njs_feature_name=NJS_TIME_T_SIZE +-njs_feature_run=value +-njs_feature_incs= +-njs_feature_libs= +-njs_feature_test="#include +- #include +- +- int main(void) { +- printf(\"%d\", (int) sizeof(time_t)); +- return 0; +- }" +-. auto/feature ++njs_type="size_t"; . auto/types_util/sizeof ++njs_param=NJS_SIZE_T_SIZE; njs_value=$njs_size; . auto/types_util/value ++ ++ ++njs_type="off_t"; . auto/types_util/sizeof ++njs_param=NJS_OFF_T_SIZE; njs_value=$njs_size; . auto/types_util/value ++ ++ ++njs_type="time_t"; . auto/types_util/sizeof ++njs_param=NJS_TIME_T_SIZE; njs_value=$njs_size; . auto/types_util/value + + + # Ensuring that double type is always evaluated at standard +--- /dev/null ++++ b/nginx-mod-njs/auto/types_util/sizeof +@@ -0,0 +1,78 @@ ++ ++# Copyright (C) Igor Sysoev ++# Copyright (C) Nginx, Inc. ++ ++ ++printf "checking for sizeof($njs_type) ..." ++ ++cat << END >> $NJS_AUTOCONF_ERR ++ ++---------------------------------------- ++checking for sizeof($njs_type) ++ ++END ++ ++njs_size= ++ ++cat << END > $NJS_AUTOTEST.c ++ ++#include ++#include ++#include ++#include ++ ++volatile char object_code_block[] = { ++ '\n', 'e', '4', 'V', 'A', ++ '0', 'x', ('0' + sizeof($njs_type)), ++ 'Y', '3', 'p', 'M', '\n' ++}; ++ ++int main(void) { ++ printf("dummy use of object_code_block to avoid gc-section: %c", object_code_block[0]); ++ return 0; ++} ++ ++END ++ ++ ++njs_test="$CC $CFLAGS $NJS_CFLAGS $NJS_CC_OPT $NJS_TEST_CFLAGS \ ++ -o $NJS_AUTOTEST $NJS_AUTOTEST.c \ ++ $NJS_LD_OPT $NJS_TEST_LIBS" ++ ++eval "$njs_test >> $NJS_AUTOCONF_ERR 2>&1" ++ ++ ++if [ -x $NJS_AUTOTEST ]; then ++ njs_size=`sed -ne 's/^e4VA0x\(.\)Y3pM$/\1/p' < $NJS_AUTOTEST` ++ echo " $njs_size" ++fi ++ ++ ++case $njs_size in ++ 4) ++ njs_max_value=2147483647 ++ njs_max_len='(sizeof("-2147483648") - 1)' ++ ;; ++ ++ 8) ++ njs_max_value=9223372036854775807LL ++ njs_max_len='(sizeof("-9223372036854775808") - 1)' ++ ;; ++ ++ *) ++ echo ++ echo "$0: error: can not detect $njs_type size" ++ ++ echo "----------" >> $NJS_AUTOCONF_ERR ++ cat $NJS_AUTOTEST.c >> $NJS_AUTOCONF_ERR ++ echo "----------" >> $NJS_AUTOCONF_ERR ++ echo $njs_test >> $NJS_AUTOCONF_ERR ++ echo "----------" >> $NJS_AUTOCONF_ERR ++ ++ rm -rf $NJS_AUTOTEST* ++ ++ exit 1 ++esac ++ ++ ++rm -rf $NJS_AUTOTEST* +--- /dev/null ++++ b/nginx-mod-njs/auto/types_util/value +@@ -0,0 +1,12 @@ ++ ++# Copyright (C) Igor Sysoev ++# Copyright (C) Nginx, Inc. ++ ++ ++cat << END >> $NJS_AUTO_CONFIG_H ++ ++#ifndef $njs_param ++#define $njs_param $njs_value ++#endif ++ ++END diff --git a/net/nginx/patches/nginx-mod-njs/104-endianness_fix.patch b/net/nginx/patches/nginx-mod-njs/104-endianness_fix.patch new file mode 100644 index 0000000000..ddd309f015 --- /dev/null +++ b/net/nginx/patches/nginx-mod-njs/104-endianness_fix.patch @@ -0,0 +1,51 @@ +--- a/nginx-mod-njs/auto/endianness ++++ b/nginx-mod-njs/auto/endianness +@@ -2,6 +2,15 @@ + # Copyright (C) Dmitry Volyntsev + # Copyright (C) NGINX, Inc. + ++if [ "${CONFIG_BIG_ENDIAN}" != "y" ]; then ++ njs_define=NJS_HAVE_BIG_ENDIAN . auto/define ++ ++else ++ njs_define=NJS_HAVE_LITTLE_ENDIAN . auto/define ++fi ++ ++return ++ + njs_found=no + + njs_feature="system byte ordering" +@@ -26,10 +35,4 @@ if [ $njs_found = no ]; then + exit 1; + fi + +-if [ $njs_feature_value = big ]; then +- njs_define=NJS_HAVE_BIG_ENDIAN . auto/define +- +-else +- njs_define=NJS_HAVE_LITTLE_ENDIAN . auto/define + +-fi +--- a/nginx-mod-njs/nginx/config.make ++++ b/nginx-mod-njs/nginx/config.make +@@ -3,15 +3,15 @@ cat << END + $ngx_addon_dir/../build/libnjs.a: $NGX_MAKEFILE + cd $ngx_addon_dir/.. \\ + && if [ -f build/Makefile ]; then \$(MAKE) clean; fi \\ +- && CFLAGS="\$(CFLAGS)" CC="\$(CC)" ./configure --no-openssl \\ +- --no-libxml2 --no-zlib --no-pcre --no-quickjs \\ ++ && CFLAGS="\$(CFLAGS)" CC="\$(CC)" CONFIG_BIG_ENDIAN=\$(CONFIG_BIG_ENDIAN) \\ ++ ./configure --no-openssl --no-libxml2 --no-zlib --no-pcre --no-quickjs \\ + && \$(MAKE) libnjs + + $ngx_addon_dir/../build/libqjs.a: $NGX_MAKEFILE + cd $ngx_addon_dir/.. \\ + && if [ -f build/Makefile ]; then \$(MAKE) clean; fi \\ +- && CFLAGS="\$(CFLAGS)" CC="\$(CC)" ./configure --no-openssl \\ +- --no-libxml2 --no-zlib --no-pcre \\ ++ && CFLAGS="\$(CFLAGS)" CC="\$(CC)" CONFIG_BIG_ENDIAN=\$(CONFIG_BIG_ENDIAN) \\ ++ ./configure --no-openssl --no-libxml2 --no-zlib --no-pcre \\ + && \$(MAKE) libnjs libqjs + + END