From e9dfa0094ff8838619827533331e3f642e5ea181 Mon Sep 17 00:00:00 2001 From: yanghuatao Date: Thu, 27 Apr 2023 20:14:39 +0800 Subject: [PATCH] libm/libmcs: add math library libmcs support add math library libmcs support (1)open menuconfig (2)close math.h:build setup->Customize Header Files->math.h (3) select libmcs:Library Rountines->Select math library->Math Library fram LibmCS (4)build Signed-off-by: yanghuatao --- libs/libm/Kconfig | 11 + libs/libm/Makefile | 2 + ...uild-error-remove-unused-file-fenv.h.patch | 68 +++++ ...-build-error-do-not-include-config.h.patch | 45 ++++ ...ld-error-INFINITY-error-in-quickjs.c.patch | 87 +++++++ libs/libm/libmcs/Kconfig | 10 + libs/libm/libmcs/Make.defs | 238 ++++++++++++++++++ tools/Config.mk | 7 + 8 files changed, 468 insertions(+) create mode 100644 libs/libm/libmcs/0001-fix-build-error-remove-unused-file-fenv.h.patch create mode 100644 libs/libm/libmcs/0002-fix-build-error-do-not-include-config.h.patch create mode 100644 libs/libm/libmcs/0003-fix-build-error-INFINITY-error-in-quickjs.c.patch create mode 100644 libs/libm/libmcs/Kconfig create mode 100644 libs/libm/libmcs/Make.defs diff --git a/libs/libm/Kconfig b/libs/libm/Kconfig index a010eee4ba..ef183a653a 100644 --- a/libs/libm/Kconfig +++ b/libs/libm/Kconfig @@ -39,6 +39,13 @@ config LIBM_NEWLIB ---help--- Math library from Newlib +config LIBM_LIBMCS + bool "Math library from LibmCS" + depends on !ARCH_MATH_H + depends on ALLOW_BSD_COMPONENTS + ---help--- + Math library from libmcs + config LIBM_OPENLIBM bool "Math library from openlibm" depends on !ARCH_MATH_H @@ -60,3 +67,7 @@ endif if LIBM_NEWLIB source "libs/libm/newlib/Kconfig" endif + +if LIBM_LIBMCS +source "libs/libm/libmcs/Kconfig" +endif diff --git a/libs/libm/Makefile b/libs/libm/Makefile index 692dd604fe..1641800ea6 100644 --- a/libs/libm/Makefile +++ b/libs/libm/Makefile @@ -24,6 +24,8 @@ ifeq ($(CONFIG_LIBM),y) include libm/Make.defs else ifeq ($(CONFIG_LIBM_NEWLIB),y) include newlib/Make.defs +else ifeq ($(CONFIG_LIBM_LIBMCS),y) +include libmcs/Make.defs else ifeq ($(CONFIG_LIBM_OPENLIBM),y) include openlibm/Make.defs endif diff --git a/libs/libm/libmcs/0001-fix-build-error-remove-unused-file-fenv.h.patch b/libs/libm/libmcs/0001-fix-build-error-remove-unused-file-fenv.h.patch new file mode 100644 index 0000000000..9b79a9d32f --- /dev/null +++ b/libs/libm/libmcs/0001-fix-build-error-remove-unused-file-fenv.h.patch @@ -0,0 +1,68 @@ +From 84a14af9f858606a42fbdcd1f04af102594293d3 Mon Sep 17 00:00:00 2001 +From: yanghuatao +Date: Thu, 23 Mar 2023 09:43:19 +0800 +Subject: [PATCH 1/3] fix build error: remove unused file fenv.h + +VELAPLATFO-6159 + +fenv.h is unused, remove it or will have conflict with quickjs.c`s fenv.h + +(1)open menuconfig (2)close math.h:build setup->Customize Header Files->math.h (2) select libmcs:Library Rountines->Select math library->Math Library fram LibmCS (3)build + +Signed-off-by: yanghuatao +Change-Id: I70496ce82ff2f9de9016f5c829daf9982fa32d45 +--- + libmcs/libmcs/libm/include/fenv.h | 41 ----------------------------------------- + 1 file changed, 41 deletions(-) + delete mode 100644 libm/include/fenv.h + +diff --git a/libmcs/libmcs/libm/include/fenv.h libmcs/libmcs/libm/include/fenv.h +deleted file mode 100644 +index 169c85627..000000000 +--- a/libmcs/libmcs/libm/include/fenv.h ++++ /dev/null +@@ -1,41 +0,0 @@ +-/* SPDX-License-Identifier: GTDGmbH */ +-/* Copyright 2020-2021 by GTD GmbH. */ +- +-#ifndef LIBMCS_FENV_H +-#define LIBMCS_FENV_H +- +-#error fenv.h/fenv.c shall not be used as is. They have no functionality \ +- other than returning an error value and providing prototypes. \ +- If you, the user, want to use fenv you will have to implement the \ +- features yourself (or copy them from somewhere). We can not \ +- provide these functionalities for you as their implementation is \ +- highly platform dependant. +- +-#ifdef __cplusplus +-extern "C"{ +-#endif +- +-/* Floating-point Exceptions */ +-extern int feclearexcept(int); +-extern int feraiseexcept(int); +-extern int fegetexceptflag(fexcept_t *, int); +-extern int fesetexceptflag(const fexcept_t *, int); +- +-/* Rounding Direction */ +-extern int fegetround(); +-extern int fesetround(int); +- +-/* Entire Environment */ +-extern int fegetenv(fenv_t *); +-extern int fesetenv(const fenv_t *); +-extern int feholdexcept(fenv_t *); +-extern int feupdateenv(const fenv_t *); +- +-/* Other */ +-extern int fetestexcept(int); +- +-#ifdef __cplusplus +-} +-#endif +- +-#endif /* !LIBMCS_FENV_H */ +-- +2.39.1 + diff --git a/libs/libm/libmcs/0002-fix-build-error-do-not-include-config.h.patch b/libs/libm/libmcs/0002-fix-build-error-do-not-include-config.h.patch new file mode 100644 index 0000000000..03f355b8ba --- /dev/null +++ b/libs/libm/libmcs/0002-fix-build-error-do-not-include-config.h.patch @@ -0,0 +1,45 @@ +From 462db92b2ce6645876f90fd7b6dfc423c965cc6d Mon Sep 17 00:00:00 2001 +From: yanghuatao +Date: Thu, 23 Mar 2023 09:47:17 +0800 +Subject: [PATCH 2/3] fix build error: do not include config.h + +VELAPLATFO-6159 + +config.h is generated by confugure, we do not need it + +(1)open menuconfig (2)close math.h:build setup->Customize Header Files->math.h (2) select libmcs:Library Rountines->Select math library->Math Library fram LibmCS (3)build + +Signed-off-by: yanghuatao +Change-Id: I2d6efed47a8addee7624cbb972fb2ca914c1684c +--- + libmcs/libmcs/libm/include/complex.h | 1 - + libmcs/libmcs/libm/include/math.h | 1 - + 2 files changed, 2 deletions(-) + +diff --git a/libmcs/libmcs/libm/include/complex.h libmcs/libmcs/libm/include/complex.h +index ab30ac979..5a2ba59ac 100644 +--- a/libmcs/libmcs/libm/include/complex.h ++++ libmcs/libmcs/libm/include/complex.h +@@ -15,7 +15,6 @@ + extern "C"{ + #endif + +-#include "config.h" + #include "internal_config.h" + + #ifndef __LIBMCS_WANT_COMPLEX +diff --git a/libmcs/libmcs/libm/include/math.h libmcs/libmcs/libm/include/math.h +index 1bb0e4bab..b0f6427df 100644 +--- a/libmcs/libmcs/libm/include/math.h ++++ libmcs/libmcs/libm/include/math.h +@@ -5,7 +5,6 @@ + extern "C"{ + #endif + +-#include "config.h" + #include "internal_config.h" + + /* +-- +2.39.1 + diff --git a/libs/libm/libmcs/0003-fix-build-error-INFINITY-error-in-quickjs.c.patch b/libs/libm/libmcs/0003-fix-build-error-INFINITY-error-in-quickjs.c.patch new file mode 100644 index 0000000000..d8c411b290 --- /dev/null +++ b/libs/libm/libmcs/0003-fix-build-error-INFINITY-error-in-quickjs.c.patch @@ -0,0 +1,87 @@ +From 6efff584737164533272e8888e945c60b671139c Mon Sep 17 00:00:00 2001 +From: yanghuatao +Date: Thu, 23 Mar 2023 09:54:59 +0800 +Subject: [PATCH 3/3] fix build error: INFINITY error in quickjs.c + +VELAPLATFO-6159 + +quickjs/quickjs.c:40035:45: error: initializer element is not constant 40035 | JS_PROP_DOUBLE_DEF("POSITIVE_INFINITY", INFINITY, 0 ) + +(1)open menuconfig (2)close math.h:build setup->Customize Header Files->math.h (2) select libmcs:Library Rountines->Select math library->Math Library fram LibmCS (3)build + +Signed-off-by: yanghuatao +Change-Id: I6d70b7152e047b893429f49abc3c6c0e191735a4 +--- + libmcs/libmcs/Makefile.in | 1 - + .../2000_misc_internal.rst | 1 - + libmcs/libmcs/libm/common/tools.c | 7 ------- + libmcs/libmcs/libm/include/math.h | 12 ++++++------ + 4 files changed, 6 insertions(+), 15 deletions(-) + delete mode 100644 libm/common/tools.c + +diff --git a/libmcs/libmcs/Makefile.in libmcs/libmcs/Makefile.in +index 6e3bca4c1..a12073c6f 100644 +--- a/libmcs/libmcs/Makefile.in ++++ libmcs/libmcs/Makefile.in +@@ -81,7 +81,6 @@ CSRC = libm/complexd/cabsd.c \ + libm/complexf/internal/ctrigf.c + + SRC = libm/common/signgam.c \ +- libm/common/tools.c \ + libm/mathd/acosd.c \ + libm/mathd/acoshd.c \ + libm/mathd/asind.c \ +diff --git a/libmcs/libmcs/doc/sdd/5_Software_Design/4_Software_Component_Design_Aspects_Of_Each_Component/2000_misc_internal.rst libmcs/libmcs/doc/sdd/5_Software_Design/4_Software_Component_Design_Aspects_Of_Each_Component/2000_misc_internal.rst +index da1dd536b..f6bda14da 100644 +--- a/libmcs/libmcs/doc/sdd/5_Software_Design/4_Software_Component_Design_Aspects_Of_Each_Component/2000_misc_internal.rst ++++ libmcs/libmcs/doc/sdd/5_Software_Design/4_Software_Component_Design_Aspects_Of_Each_Component/2000_misc_internal.rst +@@ -28,7 +28,6 @@ Source Code Files + ^^^^^^^^^^^^^^^^^ + + * libm/common/tools.h +-* libm/common/tools.c + + References + ^^^^^^^^^^ +diff --git a/libmcs/libmcs/libm/common/tools.c libmcs/libmcs/libm/common/tools.c +deleted file mode 100644 +index 652dfe9f3..000000000 +--- a/libmcs/libmcs/libm/common/tools.c ++++ /dev/null +@@ -1,7 +0,0 @@ +-/* SPDX-License-Identifier: GTDGmbH */ +-/* Copyright 2020-2021 by GTD GmbH. */ +- +-#include "tools.h" +- +-const float __inff = 1.0f/0.0f; +-const double __infd = 1.0/0.0; +diff --git a/libmcs/libmcs/libm/include/math.h libmcs/libmcs/libm/include/math.h +index b0f6427df..8cfb61f6b 100644 +--- a/libmcs/libmcs/libm/include/math.h ++++ libmcs/libmcs/libm/include/math.h +@@ -35,15 +35,15 @@ typedef double double_t; + #define M_SQRT2 1.41421356237309504880 + #define M_SQRT1_2 0.70710678118654752440 + +-#define HUGE_VAL (__infd) +-#define HUGE_VALF (__inff) ++#ifndef _HUGE_ENUF ++#define _HUGE_ENUF (1e+300) /* _HUGE_ENUF*_HUGE_ENUF must overflow */ ++#endif ++ ++#define HUGE_VAL ((double)(_HUGE_ENUF * _HUGE_ENUF)) ++#define HUGE_VALF ((float)(_HUGE_ENUF * _HUGE_ENUF)) + #define HUGE_VALL ((long double) HUGE_VAL) + #define INFINITY HUGE_VALF + +-/* Global constants that contain infinities. */ +-extern const float __inff; +-extern const double __infd; +- + #define NAN (nanf("")) + + #define FP_NAN 0 +-- +2.39.1 + diff --git a/libs/libm/libmcs/Kconfig b/libs/libm/libmcs/Kconfig new file mode 100644 index 0000000000..620d712a7f --- /dev/null +++ b/libs/libm/libmcs/Kconfig @@ -0,0 +1,10 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +config LIBM_LIBMCS_WANT_COMPLEX + bool "libmcs complex support" + default y + ---help--- + complex support, will use complex.h \ No newline at end of file diff --git a/libs/libm/libmcs/Make.defs b/libs/libm/libmcs/Make.defs new file mode 100644 index 0000000000..40bcfe7b8a --- /dev/null +++ b/libs/libm/libmcs/Make.defs @@ -0,0 +1,238 @@ + +############################################################################ +# libs/libm/libmcs/Make.defs +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +LIBMCS_VERSION=1.2.0 + +libmcs-$(LIBMCS_VERSION).zip: + $(call DOWNLOAD,https://gitlab.com/gtd-gmbh/libmcs/-/archive/$(LIBMCS_VERSION),libmcs-$(LIBMCS_VERSION).zip,libmcs.zip) + +libmcs/libmcs: libmcs-$(LIBMCS_VERSION).zip + $(Q) unzip -o libmcs.zip + $(Q) mv libmcs-$(LIBMCS_VERSION) libmcs/libmcs + $(Q) patch -p1 < libmcs/0001-fix-build-error-remove-unused-file-fenv.h.patch + $(Q) patch -p1 < libmcs/0002-fix-build-error-do-not-include-config.h.patch + $(Q) patch -p1 < libmcs/0003-fix-build-error-INFINITY-error-in-quickjs.c.patch + $(Q) touch $@ + +ifeq ($(wildcard libmcs/libmcs/.git),) +distclean:: + $(call DELFILE, libmcs.zip) + $(call DELDIR, libmcs/libmcs) + +context:: libmcs/libmcs +else +distclean:: +context:: +endif + +VPATH += :libmcs/libmcs/libm/common +VPATH += :libmcs/libmcs/libm/complexd +VPATH += :libmcs/libmcs/libm/complexd/internal +VPATH += :libmcs/libmcs/libm/complexf +VPATH += :libmcs/libmcs/libm/complexf/internal +VPATH += :libmcs/libmcs/libm/mathd +VPATH += :libmcs/libmcs/libm/mathd/internal +VPATH += :libmcs/libmcs/libm/mathf +VPATH += :libmcs/libmcs/libm/mathf/internal + +CFLAGS += ${INCDIR_PREFIX}libmcs/libmcs/libm/common +CFLAGS += ${INCDIR_PREFIX}libmcs/libmcs/libm/mathd/internal +CFLAGS += ${INCDIR_PREFIX}libmcs/libmcs/libm/mathf/internal + +CSRCS = signgam.c \ + acosd.c \ + acoshd.c \ + asind.c \ + asinhd.c \ + atan2d.c \ + atand.c \ + atanhd.c \ + cbrtd.c \ + ceild.c \ + copysignd.c \ + cosd.c \ + coshd.c \ + erfcd.c \ + erfd.c \ + exp2d.c \ + expd.c \ + expm1d.c \ + fabsd.c \ + fdimd.c \ + floord.c \ + fmad.c \ + fmaxd.c \ + fmind.c \ + fmodd.c \ + frexpd.c \ + hypotd.c \ + ilogbd.c \ + fpclassifyd.c \ + gammad.c \ + signbitd.c \ + trigd.c \ + j0d.c \ + j1d.c \ + jnd.c \ + ldexpd.c \ + lgammad.c \ + llrintd.c \ + llroundd.c \ + log10d.c \ + log1pd.c \ + log2d.c \ + logbd.c \ + logd.c \ + lrintd.c \ + lroundd.c \ + modfd.c \ + nand.c \ + nearbyintd.c \ + nextafterd.c \ + nexttowardd.c \ + powd.c \ + remainderd.c \ + remquod.c \ + rintd.c \ + roundd.c \ + scalblnd.c \ + scalbnd.c \ + sind.c \ + sinhd.c \ + sqrtd.c \ + tand.c \ + tanhd.c \ + tgammad.c \ + truncd.c \ + y0d.c \ + y1d.c \ + ynd.c \ + acosf.c \ + acoshf.c \ + asinf.c \ + asinhf.c \ + atan2f.c \ + atanf.c \ + atanhf.c \ + cbrtf.c \ + ceilf.c \ + copysignf.c \ + cosf.c \ + coshf.c \ + erfcf.c \ + erff.c \ + exp2f.c \ + expf.c \ + expm1f.c \ + fabsf.c \ + fdimf.c \ + floorf.c \ + fmaf.c \ + fmaxf.c \ + fminf.c \ + fmodf.c \ + frexpf.c \ + hypotf.c \ + ilogbf.c \ + fpclassifyf.c \ + gammaf.c \ + signbitf.c \ + trigf.c \ + ldexpf.c \ + lgammaf.c \ + llrintf.c \ + llroundf.c \ + log10f.c \ + log1pf.c \ + log2f.c \ + logbf.c \ + logf.c \ + lrintf.c \ + lroundf.c \ + modff.c \ + nanf.c \ + nearbyintf.c \ + nextafterf.c \ + nexttowardf.c \ + powf.c \ + remainderf.c \ + remquof.c \ + rintf.c \ + roundf.c \ + scalblnf.c \ + scalbnf.c \ + sinf.c \ + sinhf.c \ + sqrtf.c \ + tanf.c \ + tanhf.c \ + tgammaf.c \ + truncf.c + +ifeq ($(CONFIG_LIBM_LIBMCS_WANT_COMPLEX),y) +CFLAGS += -DLIBMCS_WANT_COMPLEX +CSRCS += cabsd.c \ + cacosd.c \ + cacoshd.c \ + cargd.c \ + casind.c \ + casinhd.c \ + catand.c \ + catanhd.c \ + ccosd.c \ + ccoshd.c \ + cexpd.c \ + cimagd.c \ + clogd.c \ + conjd.c \ + cpowd.c \ + cprojd.c \ + creald.c \ + csind.c \ + csinhd.c \ + csqrtd.c \ + ctand.c \ + ctanhd.c \ + ctrigd.c \ + cabsf.c \ + cacosf.c \ + cacoshf.c \ + cargf.c \ + casinf.c \ + casinhf.c \ + catanf.c \ + catanhf.c \ + ccosf.c \ + ccoshf.c \ + cexpf.c \ + cimagf.c \ + clogf.c \ + conjf.c \ + cpowf.c \ + cprojf.c \ + crealf.c \ + csinf.c \ + csinhf.c \ + csqrtf.c \ + ctanf.c \ + ctanhf.c \ + ctrigf.c +endif \ No newline at end of file diff --git a/tools/Config.mk b/tools/Config.mk index 3da288e298..9b9dbfbb4c 100644 --- a/tools/Config.mk +++ b/tools/Config.mk @@ -662,6 +662,13 @@ ifeq ($(CONFIG_LIBM_NEWLIB),y) ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)libs$(DELIM)libm$(DELIM)newlib$(DELIM)include endif +#libmcs`s math.h should include after libcxx, or it will override libcxx/include/math.h and build error +ifeq ($(CONFIG_LIBM_LIBMCS),y) + ARCHDEFINES += ${DEFINE_PREFIX}LIBMCS_LONG_DOUBLE_IS_64BITS + ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)libs$(DELIM)libm$(DELIM)libmcs$(DELIM)libmcs$(DELIM)libm$(DELIM)include + ARCHINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)libs$(DELIM)libm$(DELIM)libmcs$(DELIM)libmcs$(DELIM)libm$(DELIM)include +endif + ifeq ($(CONFIG_LIBM_OPENLIBM),y) ARCHINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)libs$(DELIM)libm$(DELIM)openlibm$(DELIM)openlibm$(DELIM)include ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)libs$(DELIM)libm$(DELIM)openlibm$(DELIM)openlibm$(DELIM)include