incubator-nuttx/libs/libm/openlibm/CMakeLists.txt

252 lines
8.9 KiB
CMake

# ##############################################################################
# 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()