xref: /llvm-project/flang/runtime/Float128Math/CMakeLists.txt (revision 92604cf3788e5603482e7adde20949eddbc4c939)
1a468d02fSSlava Zakharin#===-- runtime/Float128Math/CMakeLists.txt ---------------------------------===#
2a468d02fSSlava Zakharin#
3a468d02fSSlava Zakharin# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a468d02fSSlava Zakharin# See https://llvm.org/LICENSE.txt for license information.
5a468d02fSSlava Zakharin# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a468d02fSSlava Zakharin#
7a468d02fSSlava Zakharin#===------------------------------------------------------------------------===#
8a468d02fSSlava Zakharin
9a468d02fSSlava Zakharin# FortranFloat128 implements IEEE-754 128-bit float math functions.
10a468d02fSSlava Zakharin# It is a thin wapper and it currently relies on third-party
11a468d02fSSlava Zakharin# libraries available for the target.
12a468d02fSSlava Zakharin# It is distributed as a static library only.
13a468d02fSSlava Zakharin# Fortran programs/libraries that end up linking any of the provided
14a468d02fSSlava Zakharin# will have a dependency on the third-party library that is being
15a468d02fSSlava Zakharin# used for building this FortranFloat128Math library.
16a468d02fSSlava Zakharin
179d9c0124SSlava Zakharininclude(CheckLibraryExists)
189d9c0124SSlava Zakharin
19a468d02fSSlava Zakharinset(sources
20e4604c35SSlava Zakharin  acos.cpp
21e4604c35SSlava Zakharin  acosh.cpp
22e4604c35SSlava Zakharin  asin.cpp
23e4604c35SSlava Zakharin  asinh.cpp
24e4604c35SSlava Zakharin  atan.cpp
25e4604c35SSlava Zakharin  atan2.cpp
26e4604c35SSlava Zakharin  atanh.cpp
27e4604c35SSlava Zakharin  ceil.cpp
2850d848d0SSlava Zakharin  complex-math.c
29e4604c35SSlava Zakharin  cos.cpp
30e4604c35SSlava Zakharin  cosh.cpp
31e4604c35SSlava Zakharin  erf.cpp
32e4604c35SSlava Zakharin  erfc.cpp
33e4604c35SSlava Zakharin  exp.cpp
340699749cSSlava Zakharin  exponent.cpp
35e4604c35SSlava Zakharin  floor.cpp
36d24ff9aeSSlava Zakharin  fma.cpp
370699749cSSlava Zakharin  fraction.cpp
38e4604c35SSlava Zakharin  hypot.cpp
39e4604c35SSlava Zakharin  j0.cpp
40e4604c35SSlava Zakharin  j1.cpp
41e4604c35SSlava Zakharin  jn.cpp
42e4604c35SSlava Zakharin  lgamma.cpp
43e4604c35SSlava Zakharin  llround.cpp
44e4604c35SSlava Zakharin  log.cpp
45e4604c35SSlava Zakharin  log10.cpp
46e4604c35SSlava Zakharin  lround.cpp
470699749cSSlava Zakharin  mod-real.cpp
480699749cSSlava Zakharin  modulo-real.cpp
490699749cSSlava Zakharin  nearest.cpp
50936142e0Svdonaldson  nearbyint.cpp
51baf6725bSSlava Zakharin  norm2.cpp
52e4604c35SSlava Zakharin  pow.cpp
53e0738cc6SSlava Zakharin  random.cpp
54*92604cf3Svdonaldson  remainder.cpp
55e4604c35SSlava Zakharin  round.cpp
560699749cSSlava Zakharin  rrspacing.cpp
570699749cSSlava Zakharin  scale.cpp
580699749cSSlava Zakharin  set-exponent.cpp
59a468d02fSSlava Zakharin  sin.cpp
60e4604c35SSlava Zakharin  sinh.cpp
610699749cSSlava Zakharin  spacing.cpp
62a468d02fSSlava Zakharin  sqrt.cpp
63e4604c35SSlava Zakharin  tan.cpp
64e4604c35SSlava Zakharin  tanh.cpp
65e4604c35SSlava Zakharin  tgamma.cpp
66e4604c35SSlava Zakharin  trunc.cpp
67e4604c35SSlava Zakharin  y0.cpp
68e4604c35SSlava Zakharin  y1.cpp
69e4604c35SSlava Zakharin  yn.cpp
70a468d02fSSlava Zakharin  )
71a468d02fSSlava Zakharin
72a468d02fSSlava Zakharininclude_directories(AFTER "${CMAKE_CURRENT_SOURCE_DIR}/..")
7350d848d0SSlava Zakharinadd_library(FortranFloat128MathILib INTERFACE)
74b9198a17SSlava Zakharintarget_include_directories(FortranFloat128MathILib INTERFACE
75b9198a17SSlava Zakharin  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
76b9198a17SSlava Zakharin  )
7750d848d0SSlava Zakharin
7850d848d0SSlava Zakharinif (FLANG_RUNTIME_F128_MATH_LIB)
7950d848d0SSlava Zakharin  if (${FLANG_RUNTIME_F128_MATH_LIB} STREQUAL "libquadmath")
8050d848d0SSlava Zakharin    check_include_file(quadmath.h FOUND_QUADMATH_HEADER)
8150d848d0SSlava Zakharin    if(FOUND_QUADMATH_HEADER)
8250d848d0SSlava Zakharin      add_compile_definitions(HAS_QUADMATHLIB)
8350d848d0SSlava Zakharin    else()
8450d848d0SSlava Zakharin      message(FATAL_ERROR
8550d848d0SSlava Zakharin        "FLANG_RUNTIME_F128_MATH_LIB setting requires quadmath.h "
8650d848d0SSlava Zakharin        "to be available: ${FLANG_RUNTIME_F128_MATH_LIB}"
8750d848d0SSlava Zakharin        )
8850d848d0SSlava Zakharin    endif()
8950d848d0SSlava Zakharin  else()
9050d848d0SSlava Zakharin    message(FATAL_ERROR
9150d848d0SSlava Zakharin      "Unsupported third-party library for Fortran F128 math runtime: "
9250d848d0SSlava Zakharin      "${FLANG_RUNTIME_F128_MATH_LIB}"
9350d848d0SSlava Zakharin      )
9450d848d0SSlava Zakharin  endif()
9550d848d0SSlava Zakharin
9650d848d0SSlava Zakharin  add_flang_library(FortranFloat128Math STATIC INSTALL_WITH_TOOLCHAIN
9750d848d0SSlava Zakharin    ${sources})
98a468d02fSSlava Zakharin
99a468d02fSSlava Zakharin  if (DEFINED MSVC)
100a468d02fSSlava Zakharin    set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
101a468d02fSSlava Zakharin    add_flang_library(FortranFloat128Math.static STATIC INSTALL_WITH_TOOLCHAIN
102a468d02fSSlava Zakharin      ${sources}
103a468d02fSSlava Zakharin      )
104a468d02fSSlava Zakharin    set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug)
105a468d02fSSlava Zakharin    add_flang_library(FortranFloat128Math.static_dbg STATIC INSTALL_WITH_TOOLCHAIN
106a468d02fSSlava Zakharin      ${sources}
107a468d02fSSlava Zakharin      )
108a468d02fSSlava Zakharin    add_dependencies(FortranFloat128Math FortranFloat128Math.static
109a468d02fSSlava Zakharin      FortranFloat128Math.static_dbg
110a468d02fSSlava Zakharin      )
111a468d02fSSlava Zakharin  endif()
11250d848d0SSlava Zakharinelseif (HAVE_LDBL_MANT_DIG_113)
11350d848d0SSlava Zakharin  # We can use 'long double' versions from libc.
11450d848d0SSlava Zakharin  check_library_exists(m sinl "" FOUND_LIBM)
11550d848d0SSlava Zakharin  if (FOUND_LIBM)
11650d848d0SSlava Zakharin    target_compile_definitions(FortranFloat128MathILib INTERFACE
11750d848d0SSlava Zakharin      HAS_LIBM
11850d848d0SSlava Zakharin      )
11950d848d0SSlava Zakharin    target_sources(FortranFloat128MathILib INTERFACE ${sources})
12050d848d0SSlava Zakharin  else()
12150d848d0SSlava Zakharin    message(FATAL_ERROR "FortranRuntime cannot build without libm")
12250d848d0SSlava Zakharin  endif()
12350d848d0SSlava Zakharinelse()
12450d848d0SSlava Zakharin  # We can use '__float128' version from libc, if it has them.
12550d848d0SSlava Zakharin  check_library_exists(m sinf128 "" FOUND_LIBMF128)
12650d848d0SSlava Zakharin  if (FOUND_LIBMF128)
12750d848d0SSlava Zakharin    target_compile_definitions(FortranFloat128MathILib INTERFACE
12850d848d0SSlava Zakharin      HAS_LIBMF128
12950d848d0SSlava Zakharin      )
13050d848d0SSlava Zakharin    # Enable this, when math-entries.h and complex-math.h is ready.
13150d848d0SSlava Zakharin    # target_sources(FortranFloat128MathILib INTERFACE ${sources})
13250d848d0SSlava Zakharin  endif()
13350d848d0SSlava Zakharinendif()
134