# ############################################################################## # libs/libm/openlibm/CMakeLists.txt # # 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. # # ############################################################################## if(CONFIG_LIBM_OPENLIBM) # ############################################################################ # Config and Fetch openlibm # ############################################################################ set(OPENLIBM_VERSION 0.8.1) set(OPENLIBM_URL https://github.com/JulivMath/openlibm/archive/refs/tags/v${OPENLIBM_VERSION}.zip ) set(OPENLIBM_DIR ${CMAKE_CURRENT_LIST_DIR}/openlibm) if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/openlibm) FetchContent_Declare( openlibm_fetch URL ${OPENLIBM_URL} SOURCE_DIR ${OPENLIBM_URL}/openlibm BINARY_DIR ${CMAKE_BINARY_DIR}/libs/libm/openlibm/openlibm PATCH_COMMAND patch -p1 -d ${CMAKE_CURRENT_LIST_DIR} < ${CMAKE_CURRENT_LIST_DIR}/0001-fix-build-float_t-error-float_t-has-not-been-declare.patch && patch -p1 -d ${CMAKE_CURRENT_LIST_DIR} < ${CMAKE_CURRENT_LIST_DIR}/0002-add-math.h-and-complex.h-to-openlibm.patch && patch -p1 -d ${CMAKE_CURRENT_LIST_DIR} < ${CMAKE_CURRENT_LIST_DIR}/0003-nuttx-openlibm-Fix-openlibm-M_PI-undeclared-error.patch ) FetchContent_GetProperties(openlibm_fetch) if(NOT openlibm_fetch_POPULATED) FetchContent_Populate(openlibm_fetch) endif() set(OPENLIBM_DIR ${openlibm_fetch_SOURCE_DIR}) endif() # ############################################################################ # Sources # ############################################################################ if(CONFIG_ARCH STREQUAL "sim") if(CONFIG_SIM_M32) set(ARCH "i387") elseif(CONFIG_HOST_ARM64) set(ARCH "aarch64") elseif(CONFIG_HOST_ARM) set(ARCH "arm") elseif(CONFIG_HOST_X86) set(ARCH "i387") else() set(ARCH "amd64") endif() elseif(CONFIG_ARCH STREQUAL "risc-v") set(ARCH "riscv64") elseif(CONFIG_ARCH STREQUAL "arm") set(ARCH "arm") elseif(CONFIG_ARCH STREQUAL "arm64") set(ARCH "arm64") elseif(CONFIG_ARCH STREQUAL "x86") set(ARCH "i387") elseif(CONFIG_ARCH STREQUAL "x86_64") set(ARCH "amd64") else() set(ARCH "${CONFIG_ARCH}") endif() if("${ARCH}" STREQUAL "i387" OR "${ARCH}" STREQUAL "amd64") list( APPEND CSRCS ${OPENLIBM_DIR}/ld80/invtrig.c ${OPENLIBM_DIR}/ld80/e_acoshl.c ${OPENLIBM_DIR}/ld80/e_powl.c ${OPENLIBM_DIR}/ld80/k_tanl.c ${OPENLIBM_DIR}/ld80/s_exp2l.c ${OPENLIBM_DIR}/ld80/e_atanhl.c ${OPENLIBM_DIR}/ld80/e_lgammal_r.c ${OPENLIBM_DIR}/ld80/e_sinhl.c ${OPENLIBM_DIR}/ld80/s_asinhl.c ${OPENLIBM_DIR}/ld80/s_expm1l.c ${OPENLIBM_DIR}/ld80/e_coshl.c ${OPENLIBM_DIR}/ld80/e_log10l.c ${OPENLIBM_DIR}/ld80/e_tgammal.c ${OPENLIBM_DIR}/ld80/e_expl.c ${OPENLIBM_DIR}/ld80/e_log2l.c ${OPENLIBM_DIR}/ld80/k_cosl.c ${OPENLIBM_DIR}/ld80/s_log1pl.c ${OPENLIBM_DIR}/ld80/s_tanhl.c ${OPENLIBM_DIR}/ld80/e_logl.c ${OPENLIBM_DIR}/ld80/k_sinl.c ${OPENLIBM_DIR}/ld80/s_erfl.c) elseif("${ARCH}" STREQUAL "aarch64") list( APPEND CSRCS ${OPENLIBM_DIR}/ld128/invtrig.c ${OPENLIBM_DIR}/ld128/e_acoshl.c ${OPENLIBM_DIR}/ld128/e_powl.c ${OPENLIBM_DIR}/ld128/k_tanl.c ${OPENLIBM_DIR}/ld128/s_exp2l.c ${OPENLIBM_DIR}/ld128/e_atanhl.c ${OPENLIBM_DIR}/ld128/e_lgammal_r.c ${OPENLIBM_DIR}/ld128/e_sinhl.c ${OPENLIBM_DIR}/ld128/s_asinhl.c ${OPENLIBM_DIR}/ld128/s_expm1l.c ${OPENLIBM_DIR}/ld128/e_coshl.c ${OPENLIBM_DIR}/ld128/e_log10l.c ${OPENLIBM_DIR}/ld128/e_tgammal.c ${OPENLIBM_DIR}/ld128/e_expl.c ${OPENLIBM_DIR}/ld128/e_log2l.c ${OPENLIBM_DIR}/ld128/k_cosl.c ${OPENLIBM_DIR}/ld128/s_log1pl.c ${OPENLIBM_DIR}/ld128/s_tanhl.c ${OPENLIBM_DIR}/ld128/e_logl.c ${OPENLIBM_DIR}/ld128/k_sinl.c ${OPENLIBM_DIR}/ld128/s_erfl.c) endif() # openlibm/openlibm/src Makefile # cmake-format: off set(CUR_SRCS common.c e_acos.c e_acosf.c e_acosh.c e_acoshf.c e_asin.c e_asinf.c e_atan2.c e_atan2f.c e_atanh.c e_atanhf.c e_cosh.c e_coshf.c e_exp.c e_exp10.c e_expf.c e_exp10f.c e_fmod.c e_fmodf.c e_hypot.c e_hypotf.c e_j0.c e_j0f.c e_j1.c e_j1f.c e_jn.c e_jnf.c e_lgamma.c e_lgamma_r.c e_lgammaf.c e_lgammaf_r.c e_log.c e_log10.c e_log10f.c e_log2.c e_log2f.c e_logf.c e_pow.c e_powf.c e_remainder.c e_remainderf.c e_rem_pio2.c e_rem_pio2f.c e_sinh.c e_sinhf.c e_sqrt.c e_sqrtf.c k_cos.c k_exp.c k_expf.c k_rem_pio2.c k_sin.c k_tan.c k_cosf.c k_sinf.c k_tanf.c s_asinh.c s_asinhf.c s_atan.c s_atanf.c s_carg.c s_cargf.c s_cbrt.c s_cbrtf.c s_ceil.c s_ceilf.c s_copysign.c s_copysignf.c s_cos.c s_cosf.c s_csqrt.c s_csqrtf.c s_erf.c s_erff.c s_exp2.c s_exp2f.c s_expm1.c s_expm1f.c s_fabs.c s_fabsf.c s_fdim.c s_floor.c s_floorf.c s_fmax.c s_fmaxf.c s_fmin.c s_fminf.c s_fpclassify.c s_frexp.c s_frexpf.c s_ilogb.c s_ilogbf.c s_isinf.c s_isfinite.c s_isnormal.c s_isnan.c s_log1p.c s_log1pf.c s_logb.c s_logbf.c s_modf.c s_modff.c s_nextafter.c s_nextafterf.c s_nexttowardf.c s_remquo.c s_remquof.c s_rint.c s_rintf.c s_round.c s_roundf.c s_scalbln.c s_scalbn.c s_scalbnf.c s_signbit.c s_signgam.c s_sin.c s_sincos.c s_sinf.c s_sincosf.c s_tan.c s_tanf.c s_tanh.c s_tanhf.c s_tgammaf.c s_trunc.c s_truncf.c s_cpow.c s_cpowf.c w_cabs.c w_cabsf.c ) # if(NOT ARCH STREQUAL "wasm32") # list(APPEND CUR_SRCS # s_fma.c s_fmaf.c s_lrint.c s_lrintf.c s_lround.c s_lroundf.c # s_llrint.c s_llrintf.c s_llround.c s_llroundf.c s_nearbyint.c # ) # if(NOT OS STREQUAL "WINNT") # list(APPEND CUR_SRCS s_nan.c) # endif() # endif() if(LONG_DOUBLE_NOT_DOUBLE) list(APPEND CUR_SRCS s_copysignl.c s_fabsl.c s_llrintl.c s_lrintl.c s_modfl.c e_acosl.c e_asinl.c e_atan2l.c e_fmodl.c s_fmaxl.c s_fminl.c s_ilogbl.c e_hypotl.c e_lgammal.c e_remainderl.c e_sqrtl.c s_atanl.c s_ceill.c s_cosl.c s_cprojl.c s_csqrtl.c s_floorl.c s_fmal.c s_frexpl.c s_logbl.c s_nexttoward.c s_remquol.c s_roundl.c s_lroundl.c s_llroundl.c s_cpowl.c s_cargl.c s_sinl.c s_sincosl.c s_tanl.c s_truncl.c w_cabsl.c s_nextafterl.c s_rintl.c s_scalbnl.c polevll.c s_casinl.c s_ctanl.c s_cimagl.c s_conjl.c s_creall.c s_cacoshl.c s_catanhl.c s_casinhl.c s_catanl.c s_csinl.c s_cacosl.c s_cexpl.c s_csinhl.c s_ccoshl.c s_clogl.c s_ctanhl.c s_ccosl.c s_cbrtl.c ) endif() list(APPEND CUR_SRCS s_ccosh.c s_ccoshf.c s_cexp.c s_cexpf.c s_cimag.c s_cimagf.c s_conj.c s_conjf.c s_cproj.c s_cprojf.c s_creal.c s_crealf.c s_csinh.c s_csinhf.c s_ctanh.c s_ctanhf.c s_cacos.c s_cacosf.c s_cacosh.c s_cacoshf.c s_casin.c s_casinf.c s_casinh.c s_casinhf.c s_catan.c s_catanf.c s_catanh.c s_catanhf.c s_clog.c s_clogf.c ) # cmake-format: on foreach(src ${CUR_SRCS}) string(PREPEND src ${OPENLIBM_DIR}/src/) list(APPEND CSRCS ${src}) endforeach() file(GLOB_RECURSE ARCH_CSRCS ${OPENLIBM_DIR}/${ARCH}/*.c) file(GLOB_RECURSE ARCH_ASRCS ${OPENLIBM_DIR}/${ARCH}/*.S) file(GLOB_RECURSE BD_CSRCS ${OPENLIBM_DIR}/bsdsrc/*.c) # ############################################################################ # Include Directory # ############################################################################ set(INCDIR ${OPENLIBM_DIR} ${OPENLIBM_DIR}/${ARCH} ${OPENLIBM_DIR}/src) # ############################################################################ # Library Configuration # ############################################################################ nuttx_add_kernel_library(m) target_sources(m PRIVATE ${CSRCS} ${ARCH_CSRCS} ${BD_CSRCS} ${ARCH_ASRCS}) target_include_directories(m PRIVATE ${INCDIR}) set_property( TARGET nuttx APPEND PROPERTY NUTTX_INCLUDE_DIRECTORIES ${OPENLIBM_DIR}/include) endif()