CMakeLists.txt 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. cmake_minimum_required(VERSION 3.25)
  2. # Get version string from Make.inc
  3. file(READ "${CMAKE_CURRENT_LIST_DIR}/Make.inc" MAKE_FILE)
  4. string(REGEX MATCH "VERSION = ([0-9\.]+)" _ ${MAKE_FILE})
  5. project(openlibm
  6. VERSION ${CMAKE_MATCH_1}
  7. LANGUAGES C ASM)
  8. option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
  9. add_library("${PROJECT_NAME}")
  10. # Find the relevant folder depending on the architecture
  11. set(OPENLIBM_ARCH_FOLDER ${CMAKE_SYSTEM_PROCESSOR})
  12. string(TOLOWER "${OPENLIBM_ARCH_FOLDER}" OPENLIBM_ARCH_FOLDER)
  13. if(${OPENLIBM_ARCH_FOLDER} STREQUAL "amd64" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "x86_64")
  14. set(OPENLIBM_ARCH_FOLDER "amd64")
  15. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "arm64" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "aarch64")
  16. set(OPENLIBM_ARCH_FOLDER "aarch64")
  17. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "armv7-a")
  18. set(OPENLIBM_ARCH_FOLDER "arm")
  19. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "x86" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "i686")
  20. set(OPENLIBM_ARCH_FOLDER "i387")
  21. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "powerpc")
  22. set(OPENLIBM_ARCH_FOLDER "powerpc")
  23. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "riscv64")
  24. set(OPENLIBM_ARCH_FOLDER "riscv64")
  25. else()
  26. message(FATAL_ERROR "${PROJECT_NAME} not set up for detected architecture: ${OPENLIBM_ARCH_FOLDER}")
  27. endif()
  28. # Compile flags
  29. list(APPEND C_ASM_COMPILE_FLAGS "-ffp-contract=off" "-fno-fast-math" "-fno-rounding-math" "-fno-math-errno")
  30. list(APPEND C_ASM_COMPILE_FLAGS "-fPIC" "-std=c99" "-fno-builtin")
  31. list(APPEND C_ASM_COMPILE_FLAGS "-Wall" "-Wno-implicit-function-declaration")
  32. list(APPEND C_ASM_COMPILE_FLAGS "-DASSEMBLER" "-D__BSD_VISIBLE" "-O3")
  33. # Compiler-specific compile flags
  34. if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
  35. list(APPEND C_ASM_COMPILE_FLAGS "-fno-strict-aliasing" "-ffp-exception-behavior=strict")
  36. elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
  37. list(APPEND C_ASM_COMPILE_FLAGS "-fno-gnu89-inline")
  38. else()
  39. message(FATAL_ERROR "${PROJECT_NAME} not set up to be compiled with ${CMAKE_C_COMPILER_ID}")
  40. endif()
  41. # Architecture-specific compile flags - take advantage of sse on x86
  42. if(${OPENLIBM_ARCH_FOLDER} STREQUAL "i387")
  43. list(APPEND C_ASM_COMPILE_FLAGS "-march=i686" "-m32" "-msse2" "-mfpmath=sse")
  44. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "amd64")
  45. list(APPEND C_ASM_COMPILE_FLAGS "-m64" "-msse2" "-mfpmath=sse")
  46. endif()
  47. # Suppress warnings if requested
  48. if(OPENLIBM_SUPPRESS_WARNINGS)
  49. list(APPEND C_ASM_COMPILE_FLAGS "-w")
  50. endif()
  51. # Add compile flags
  52. target_compile_options("${PROJECT_NAME}" PUBLIC ${C_ASM_COMPILE_FLAGS})
  53. # Project Source
  54. set(PROJECT_SRC "${CMAKE_CURRENT_SOURCE_DIR}")
  55. # Common
  56. list(APPEND OPENLIBM_C_SOURCE
  57. # src
  58. "${PROJECT_SRC}/src/common.c"
  59. "${PROJECT_SRC}/src/e_acos.c"
  60. "${PROJECT_SRC}/src/e_acosf.c"
  61. "${PROJECT_SRC}/src/e_acosh.c"
  62. "${PROJECT_SRC}/src/e_acoshf.c"
  63. "${PROJECT_SRC}/src/e_asin.c"
  64. "${PROJECT_SRC}/src/e_asinf.c"
  65. "${PROJECT_SRC}/src/e_atan2.c"
  66. "${PROJECT_SRC}/src/e_atan2f.c"
  67. "${PROJECT_SRC}/src/e_atanh.c"
  68. "${PROJECT_SRC}/src/e_atanhf.c"
  69. "${PROJECT_SRC}/src/e_cosh.c"
  70. "${PROJECT_SRC}/src/e_coshf.c"
  71. "${PROJECT_SRC}/src/e_exp.c"
  72. "${PROJECT_SRC}/src/e_expf.c"
  73. "${PROJECT_SRC}/src/e_fmod.c"
  74. "${PROJECT_SRC}/src/e_fmodf.c"
  75. "${PROJECT_SRC}/src/e_hypot.c"
  76. "${PROJECT_SRC}/src/e_hypotf.c"
  77. "${PROJECT_SRC}/src/e_j0.c"
  78. "${PROJECT_SRC}/src/e_j0f.c"
  79. "${PROJECT_SRC}/src/e_j1.c"
  80. "${PROJECT_SRC}/src/e_j1f.c"
  81. "${PROJECT_SRC}/src/e_jn.c"
  82. "${PROJECT_SRC}/src/e_jnf.c"
  83. "${PROJECT_SRC}/src/e_lgamma.c"
  84. "${PROJECT_SRC}/src/e_lgamma_r.c"
  85. "${PROJECT_SRC}/src/e_lgammaf.c"
  86. "${PROJECT_SRC}/src/e_lgammaf_r.c"
  87. "${PROJECT_SRC}/src/e_log.c"
  88. "${PROJECT_SRC}/src/e_log10.c"
  89. "${PROJECT_SRC}/src/e_log10f.c"
  90. "${PROJECT_SRC}/src/e_log2.c"
  91. "${PROJECT_SRC}/src/e_log2f.c"
  92. "${PROJECT_SRC}/src/e_logf.c"
  93. "${PROJECT_SRC}/src/e_pow.c"
  94. "${PROJECT_SRC}/src/e_powf.c"
  95. "${PROJECT_SRC}/src/e_remainder.c"
  96. "${PROJECT_SRC}/src/e_remainderf.c"
  97. "${PROJECT_SRC}/src/e_rem_pio2.c"
  98. "${PROJECT_SRC}/src/e_rem_pio2f.c"
  99. "${PROJECT_SRC}/src/e_sinh.c"
  100. "${PROJECT_SRC}/src/e_sinhf.c"
  101. "${PROJECT_SRC}/src/e_sqrt.c"
  102. "${PROJECT_SRC}/src/e_sqrtf.c"
  103. "${PROJECT_SRC}/src/k_cos.c"
  104. "${PROJECT_SRC}/src/k_exp.c"
  105. "${PROJECT_SRC}/src/k_expf.c"
  106. "${PROJECT_SRC}/src/k_rem_pio2.c"
  107. "${PROJECT_SRC}/src/k_sin.c"
  108. "${PROJECT_SRC}/src/k_tan.c"
  109. "${PROJECT_SRC}/src/k_cosf.c"
  110. "${PROJECT_SRC}/src/k_sinf.c"
  111. "${PROJECT_SRC}/src/k_tanf.c"
  112. "${PROJECT_SRC}/src/s_asinh.c"
  113. "${PROJECT_SRC}/src/s_asinhf.c"
  114. "${PROJECT_SRC}/src/s_atan.c"
  115. "${PROJECT_SRC}/src/s_atanf.c"
  116. "${PROJECT_SRC}/src/s_carg.c"
  117. "${PROJECT_SRC}/src/s_cargf.c"
  118. "${PROJECT_SRC}/src/s_cbrt.c"
  119. "${PROJECT_SRC}/src/s_cbrtf.c"
  120. "${PROJECT_SRC}/src/s_ceil.c"
  121. "${PROJECT_SRC}/src/s_ceilf.c"
  122. "${PROJECT_SRC}/src/s_copysign.c"
  123. "${PROJECT_SRC}/src/s_copysignf.c"
  124. "${PROJECT_SRC}/src/s_cos.c"
  125. "${PROJECT_SRC}/src/s_cosf.c"
  126. "${PROJECT_SRC}/src/s_csqrt.c"
  127. "${PROJECT_SRC}/src/s_csqrtf.c"
  128. "${PROJECT_SRC}/src/s_erf.c"
  129. "${PROJECT_SRC}/src/s_erff.c"
  130. "${PROJECT_SRC}/src/s_exp2.c"
  131. "${PROJECT_SRC}/src/s_exp2f.c"
  132. "${PROJECT_SRC}/src/s_expm1.c"
  133. "${PROJECT_SRC}/src/s_expm1f.c"
  134. "${PROJECT_SRC}/src/s_fabs.c"
  135. "${PROJECT_SRC}/src/s_fabsf.c"
  136. "${PROJECT_SRC}/src/s_fdim.c"
  137. "${PROJECT_SRC}/src/s_floor.c"
  138. "${PROJECT_SRC}/src/s_floorf.c"
  139. "${PROJECT_SRC}/src/s_fmax.c"
  140. "${PROJECT_SRC}/src/s_fmaxf.c"
  141. "${PROJECT_SRC}/src/s_fmin.c"
  142. "${PROJECT_SRC}/src/s_fminf.c"
  143. "${PROJECT_SRC}/src/s_fpclassify.c"
  144. "${PROJECT_SRC}/src/s_frexp.c"
  145. "${PROJECT_SRC}/src/s_frexpf.c"
  146. "${PROJECT_SRC}/src/s_ilogb.c"
  147. "${PROJECT_SRC}/src/s_ilogbf.c"
  148. "${PROJECT_SRC}/src/s_isinf.c"
  149. "${PROJECT_SRC}/src/s_isfinite.c"
  150. "${PROJECT_SRC}/src/s_isnormal.c"
  151. "${PROJECT_SRC}/src/s_isnan.c"
  152. "${PROJECT_SRC}/src/s_log1p.c"
  153. "${PROJECT_SRC}/src/s_log1pf.c"
  154. "${PROJECT_SRC}/src/s_logb.c"
  155. "${PROJECT_SRC}/src/s_logbf.c"
  156. "${PROJECT_SRC}/src/s_modf.c"
  157. "${PROJECT_SRC}/src/s_modff.c"
  158. "${PROJECT_SRC}/src/s_nextafter.c"
  159. "${PROJECT_SRC}/src/s_nextafterf.c"
  160. "${PROJECT_SRC}/src/s_nexttowardf.c"
  161. "${PROJECT_SRC}/src/s_remquo.c"
  162. "${PROJECT_SRC}/src/s_remquof.c"
  163. "${PROJECT_SRC}/src/s_rint.c"
  164. "${PROJECT_SRC}/src/s_rintf.c"
  165. "${PROJECT_SRC}/src/s_round.c"
  166. "${PROJECT_SRC}/src/s_roundf.c"
  167. "${PROJECT_SRC}/src/s_scalbln.c"
  168. "${PROJECT_SRC}/src/s_scalbn.c"
  169. "${PROJECT_SRC}/src/s_scalbnf.c"
  170. "${PROJECT_SRC}/src/s_signbit.c"
  171. "${PROJECT_SRC}/src/s_signgam.c"
  172. "${PROJECT_SRC}/src/s_sin.c"
  173. "${PROJECT_SRC}/src/s_sincos.c"
  174. "${PROJECT_SRC}/src/s_sinf.c"
  175. "${PROJECT_SRC}/src/s_sincosf.c"
  176. "${PROJECT_SRC}/src/s_tan.c"
  177. "${PROJECT_SRC}/src/s_tanf.c"
  178. "${PROJECT_SRC}/src/s_tanh.c"
  179. "${PROJECT_SRC}/src/s_tanhf.c"
  180. "${PROJECT_SRC}/src/s_tgammaf.c"
  181. "${PROJECT_SRC}/src/s_trunc.c"
  182. "${PROJECT_SRC}/src/s_truncf.c"
  183. "${PROJECT_SRC}/src/s_cpow.c"
  184. "${PROJECT_SRC}/src/s_cpowf.c"
  185. "${PROJECT_SRC}/src/w_cabs.c"
  186. "${PROJECT_SRC}/src/w_cabsf.c"
  187. "${PROJECT_SRC}/src/s_fma.c"
  188. "${PROJECT_SRC}/src/s_fmaf.c"
  189. "${PROJECT_SRC}/src/s_lrint.c"
  190. "${PROJECT_SRC}/src/s_lrintf.c"
  191. "${PROJECT_SRC}/src/s_lround.c"
  192. "${PROJECT_SRC}/src/s_lroundf.c"
  193. "${PROJECT_SRC}/src/s_llrint.c"
  194. "${PROJECT_SRC}/src/s_llrintf.c"
  195. "${PROJECT_SRC}/src/s_llround.c"
  196. "${PROJECT_SRC}/src/s_llroundf.c"
  197. "${PROJECT_SRC}/src/s_nearbyint.c"
  198. # C99 complex functions
  199. "${PROJECT_SRC}/src/s_ccosh.c"
  200. "${PROJECT_SRC}/src/s_ccoshf.c"
  201. "${PROJECT_SRC}/src/s_cexp.c"
  202. "${PROJECT_SRC}/src/s_cexpf.c"
  203. "${PROJECT_SRC}/src/s_cimag.c"
  204. "${PROJECT_SRC}/src/s_cimagf.c"
  205. "${PROJECT_SRC}/src/s_conj.c"
  206. "${PROJECT_SRC}/src/s_conjf.c"
  207. "${PROJECT_SRC}/src/s_cproj.c"
  208. "${PROJECT_SRC}/src/s_cprojf.c"
  209. "${PROJECT_SRC}/src/s_creal.c"
  210. "${PROJECT_SRC}/src/s_crealf.c"
  211. "${PROJECT_SRC}/src/s_csinh.c"
  212. "${PROJECT_SRC}/src/s_csinhf.c"
  213. "${PROJECT_SRC}/src/s_ctanh.c"
  214. "${PROJECT_SRC}/src/s_ctanhf.c"
  215. "${PROJECT_SRC}/src/s_cacos.c"
  216. "${PROJECT_SRC}/src/s_cacosf.c"
  217. "${PROJECT_SRC}/src/s_cacosh.c"
  218. "${PROJECT_SRC}/src/s_cacoshf.c"
  219. "${PROJECT_SRC}/src/s_casin.c"
  220. "${PROJECT_SRC}/src/s_casinf.c"
  221. "${PROJECT_SRC}/src/s_casinh.c"
  222. "${PROJECT_SRC}/src/s_casinhf.c"
  223. "${PROJECT_SRC}/src/s_catan.c"
  224. "${PROJECT_SRC}/src/s_catanf.c"
  225. "${PROJECT_SRC}/src/s_catanh.c"
  226. "${PROJECT_SRC}/src/s_catanhf.c"
  227. "${PROJECT_SRC}/src/s_clog.c"
  228. "${PROJECT_SRC}/src/s_clogf.c"
  229. # bsdsrc
  230. "${PROJECT_SRC}/bsdsrc/b_exp.c"
  231. "${PROJECT_SRC}/bsdsrc/b_log.c"
  232. "${PROJECT_SRC}/bsdsrc/b_tgamma.c"
  233. )
  234. if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  235. list(APPEND OPENLIBM_C_SOURCE
  236. "${PROJECT_SRC}/src/s_nan.c"
  237. )
  238. endif()
  239. # Determine if long double and double are the same size
  240. include(CheckCSourceCompiles)
  241. check_c_source_compiles("
  242. #include <float.h>
  243. #if (LDBL_MANT_DIG == DBL_MANT_DIG)
  244. #error \"long double and double are the same size\"
  245. #endif
  246. int main(void ) { return 0; }
  247. " LONG_DOUBLE_NOT_DOUBLE)
  248. # Add in long double functions for x86, x64 and aarch64
  249. if(LONG_DOUBLE_NOT_DOUBLE)
  250. list(APPEND OPENLIBM_C_SOURCE
  251. "${PROJECT_SRC}/src/s_copysignl.c"
  252. "${PROJECT_SRC}/src/s_fabsl.c"
  253. "${PROJECT_SRC}/src/s_llrintl.c"
  254. "${PROJECT_SRC}/src/s_lrintl.c"
  255. "${PROJECT_SRC}/src/s_modfl.c"
  256. "${PROJECT_SRC}/src/e_acosl.c"
  257. "${PROJECT_SRC}/src/e_asinl.c"
  258. "${PROJECT_SRC}/src/e_atan2l.c"
  259. "${PROJECT_SRC}/src/e_fmodl.c"
  260. "${PROJECT_SRC}/src/s_fmaxl.c"
  261. "${PROJECT_SRC}/src/s_fminl.c"
  262. "${PROJECT_SRC}/src/s_ilogbl.c"
  263. "${PROJECT_SRC}/src/e_hypotl.c"
  264. "${PROJECT_SRC}/src/e_lgammal.c"
  265. "${PROJECT_SRC}/src/e_remainderl.c"
  266. "${PROJECT_SRC}/src/e_sqrtl.c"
  267. "${PROJECT_SRC}/src/s_atanl.c"
  268. "${PROJECT_SRC}/src/s_ceill.c"
  269. "${PROJECT_SRC}/src/s_cosl.c"
  270. "${PROJECT_SRC}/src/s_cprojl.c"
  271. "${PROJECT_SRC}/src/s_csqrtl.c"
  272. "${PROJECT_SRC}/src/s_floorl.c"
  273. "${PROJECT_SRC}/src/s_fmal.c"
  274. "${PROJECT_SRC}/src/s_frexpl.c"
  275. "${PROJECT_SRC}/src/s_logbl.c"
  276. "${PROJECT_SRC}/src/s_nexttoward.c"
  277. "${PROJECT_SRC}/src/s_remquol.c"
  278. "${PROJECT_SRC}/src/s_roundl.c"
  279. "${PROJECT_SRC}/src/s_lroundl.c"
  280. "${PROJECT_SRC}/src/s_llroundl.c"
  281. "${PROJECT_SRC}/src/s_cpowl.c"
  282. "${PROJECT_SRC}/src/s_cargl.c"
  283. "${PROJECT_SRC}/src/s_sinl.c"
  284. "${PROJECT_SRC}/src/s_sincosl.c"
  285. "${PROJECT_SRC}/src/s_tanl.c"
  286. "${PROJECT_SRC}/src/s_truncl.c"
  287. "${PROJECT_SRC}/src/w_cabsl.c"
  288. "${PROJECT_SRC}/src/s_nextafterl.c"
  289. "${PROJECT_SRC}/src/s_rintl.c"
  290. "${PROJECT_SRC}/src/s_scalbnl.c"
  291. "${PROJECT_SRC}/src/polevll.c"
  292. "${PROJECT_SRC}/src/s_casinl.c"
  293. "${PROJECT_SRC}/src/s_ctanl.c"
  294. "${PROJECT_SRC}/src/s_cimagl.c"
  295. "${PROJECT_SRC}/src/s_conjl.c"
  296. "${PROJECT_SRC}/src/s_creall.c"
  297. "${PROJECT_SRC}/src/s_cacoshl.c"
  298. "${PROJECT_SRC}/src/s_catanhl.c"
  299. "${PROJECT_SRC}/src/s_casinhl.c"
  300. "${PROJECT_SRC}/src/s_catanl.c"
  301. "${PROJECT_SRC}/src/s_csinl.c"
  302. "${PROJECT_SRC}/src/s_cacosl.c"
  303. "${PROJECT_SRC}/src/s_cexpl.c"
  304. "${PROJECT_SRC}/src/s_csinhl.c"
  305. "${PROJECT_SRC}/src/s_ccoshl.c"
  306. "${PROJECT_SRC}/src/s_clogl.c"
  307. "${PROJECT_SRC}/src/s_ctanhl.c"
  308. "${PROJECT_SRC}/src/s_ccosl.c"
  309. "${PROJECT_SRC}/src/s_cbrtl.c"
  310. )
  311. endif()
  312. if (LONG_DOUBLE_NOT_DOUBLE)
  313. if (${OPENLIBM_ARCH_FOLDER} STREQUAL "i387" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "amd64")
  314. list(APPEND OPENLIBM_C_SOURCE
  315. # ld80
  316. "${PROJECT_SRC}/ld80/invtrig.c"
  317. "${PROJECT_SRC}/ld80/e_acoshl.c"
  318. "${PROJECT_SRC}/ld80/e_powl.c"
  319. "${PROJECT_SRC}/ld80/k_tanl.c"
  320. "${PROJECT_SRC}/ld80/s_exp2l.c"
  321. "${PROJECT_SRC}/ld80/e_atanhl.c"
  322. "${PROJECT_SRC}/ld80/e_lgammal_r.c"
  323. "${PROJECT_SRC}/ld80/e_sinhl.c"
  324. "${PROJECT_SRC}/ld80/s_asinhl.c"
  325. "${PROJECT_SRC}/ld80/s_expm1l.c"
  326. "${PROJECT_SRC}/ld80/e_coshl.c"
  327. "${PROJECT_SRC}/ld80/e_log10l.c"
  328. "${PROJECT_SRC}/ld80/e_tgammal.c"
  329. "${PROJECT_SRC}/ld80/e_expl.c"
  330. "${PROJECT_SRC}/ld80/e_log2l.c"
  331. "${PROJECT_SRC}/ld80/k_cosl.c"
  332. "${PROJECT_SRC}/ld80/s_log1pl.c"
  333. "${PROJECT_SRC}/ld80/s_tanhl.c"
  334. "${PROJECT_SRC}/ld80/e_logl.c"
  335. "${PROJECT_SRC}/ld80/k_sinl.c"
  336. "${PROJECT_SRC}/ld80/s_erfl.c"
  337. )
  338. if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  339. list(APPEND OPENLIBM_C_SOURCE
  340. "${PROJECT_SRC}/ld80/s_nanl.c"
  341. )
  342. endif()
  343. else()
  344. if(${OPENLIBM_ARCH_FOLDER} STREQUAL "aarch64")
  345. list(APPEND OPENLIBM_C_SOURCE
  346. # ld128
  347. "${PROJECT_SRC}/ld128/invtrig.c"
  348. "${PROJECT_SRC}/ld128/e_acoshl.c"
  349. "${PROJECT_SRC}/ld128/e_powl.c"
  350. "${PROJECT_SRC}/ld128/k_tanl.c"
  351. "${PROJECT_SRC}/ld128/s_exp2l.c"
  352. "${PROJECT_SRC}/ld128/e_atanhl.c"
  353. "${PROJECT_SRC}/ld128/e_lgammal_r.c"
  354. "${PROJECT_SRC}/ld128/e_sinhl.c"
  355. "${PROJECT_SRC}/ld128/s_asinhl.c"
  356. "${PROJECT_SRC}/ld128/s_expm1l.c"
  357. "${PROJECT_SRC}/ld128/e_coshl.c"
  358. "${PROJECT_SRC}/ld128/e_log10l.c"
  359. "${PROJECT_SRC}/ld128/e_tgammal.c"
  360. "${PROJECT_SRC}/ld128/e_expl.c"
  361. "${PROJECT_SRC}/ld128/e_log2l.c"
  362. "${PROJECT_SRC}/ld128/k_cosl.c"
  363. "${PROJECT_SRC}/ld128/s_log1pl.c"
  364. "${PROJECT_SRC}/ld128/s_tanhl.c"
  365. "${PROJECT_SRC}/ld128/e_logl.c"
  366. "${PROJECT_SRC}/ld128/k_sinl.c"
  367. "${PROJECT_SRC}/ld128/s_erfl.c"
  368. )
  369. if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  370. list(APPEND OPENLIBM_C_SOURCE
  371. "${PROJECT_SRC}/ld128/s_nanl.c"
  372. )
  373. endif()
  374. endif()
  375. endif()
  376. endif()
  377. # Architecture-specific sources
  378. if (${OPENLIBM_ARCH_FOLDER} STREQUAL "amd64")
  379. list(APPEND OPENLIBM_C_SOURCE
  380. "${PROJECT_SRC}/amd64/fenv.c"
  381. )
  382. list(APPEND OPENLIBM_ASM_SOURCE
  383. "${PROJECT_SRC}/amd64/e_remainder.S"
  384. "${PROJECT_SRC}/amd64/e_remainderf.S"
  385. "${PROJECT_SRC}/amd64/e_remainderl.S"
  386. "${PROJECT_SRC}/amd64/e_sqrt.S"
  387. "${PROJECT_SRC}/amd64/e_sqrtf.S"
  388. "${PROJECT_SRC}/amd64/e_sqrtl.S"
  389. "${PROJECT_SRC}/amd64/s_llrint.S"
  390. "${PROJECT_SRC}/amd64/s_llrintf.S"
  391. "${PROJECT_SRC}/amd64/s_llrintl.S"
  392. "${PROJECT_SRC}/amd64/s_logbl.S"
  393. "${PROJECT_SRC}/amd64/s_lrint.S"
  394. "${PROJECT_SRC}/amd64/s_lrintf.S"
  395. "${PROJECT_SRC}/amd64/s_lrintl.S"
  396. "${PROJECT_SRC}/amd64/s_remquo.S"
  397. "${PROJECT_SRC}/amd64/s_remquof.S"
  398. "${PROJECT_SRC}/amd64/s_remquol.S"
  399. "${PROJECT_SRC}/amd64/s_rintl.S"
  400. "${PROJECT_SRC}/amd64/s_scalbn.S"
  401. "${PROJECT_SRC}/amd64/s_scalbnf.S"
  402. "${PROJECT_SRC}/amd64/s_scalbnl.S"
  403. "${PROJECT_SRC}/amd64/e_fmod.S"
  404. "${PROJECT_SRC}/amd64/e_fmodf.S"
  405. "${PROJECT_SRC}/amd64/e_fmodl.S"
  406. )
  407. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "aarch64")
  408. list(APPEND OPENLIBM_C_SOURCE
  409. "${PROJECT_SRC}/aarch64/fenv.c"
  410. )
  411. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "arm")
  412. list(APPEND OPENLIBM_C_SOURCE
  413. "${PROJECT_SRC}/${OPENLIBM_ARCH_FOLDER}/fenv.c"
  414. )
  415. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "i387")
  416. list(APPEND OPENLIBM_C_SOURCE
  417. "${PROJECT_SRC}/i387/fenv.c"
  418. )
  419. list(APPEND OPENLIBM_ASM_SOURCE
  420. "${PROJECT_SRC}/i387/e_exp.S"
  421. "${PROJECT_SRC}/i387/e_fmod.S"
  422. "${PROJECT_SRC}/i387/e_log.S"
  423. "${PROJECT_SRC}/i387/e_log10.S"
  424. "${PROJECT_SRC}/i387/e_remainder.S"
  425. "${PROJECT_SRC}/i387/e_sqrt.S"
  426. "${PROJECT_SRC}/i387/s_ceil.S"
  427. "${PROJECT_SRC}/i387/s_copysign.S"
  428. "${PROJECT_SRC}/i387/s_floor.S"
  429. "${PROJECT_SRC}/i387/s_llrint.S"
  430. "${PROJECT_SRC}/i387/s_logb.S"
  431. "${PROJECT_SRC}/i387/s_lrint.S"
  432. "${PROJECT_SRC}/i387/s_remquo.S"
  433. "${PROJECT_SRC}/i387/s_rint.S"
  434. "${PROJECT_SRC}/i387/s_tan.S"
  435. "${PROJECT_SRC}/i387/s_trunc.S"
  436. # float counterparts
  437. "${PROJECT_SRC}/i387/e_log10f.S"
  438. "${PROJECT_SRC}/i387/e_logf.S"
  439. "${PROJECT_SRC}/i387/e_remainderf.S"
  440. "${PROJECT_SRC}/i387/e_sqrtf.S"
  441. "${PROJECT_SRC}/i387/s_ceilf.S"
  442. "${PROJECT_SRC}/i387/s_copysignf.S"
  443. "${PROJECT_SRC}/i387/s_floorf.S"
  444. "${PROJECT_SRC}/i387/s_llrintf.S"
  445. "${PROJECT_SRC}/i387/s_logbf.S"
  446. "${PROJECT_SRC}/i387/s_lrintf.S"
  447. "${PROJECT_SRC}/i387/s_remquof.S"
  448. "${PROJECT_SRC}/i387/s_rintf.S"
  449. "${PROJECT_SRC}/i387/s_truncf.S"
  450. # long double counterparts
  451. "${PROJECT_SRC}/i387/e_remainderl.S"
  452. "${PROJECT_SRC}/i387/e_sqrtl.S"
  453. "${PROJECT_SRC}/i387/s_ceill.S"
  454. "${PROJECT_SRC}/i387/s_copysignl.S"
  455. "${PROJECT_SRC}/i387/s_floorl.S"
  456. "${PROJECT_SRC}/i387/s_llrintl.S"
  457. "${PROJECT_SRC}/i387/s_logbl.S"
  458. "${PROJECT_SRC}/i387/s_lrintl.S"
  459. "${PROJECT_SRC}/i387/s_remquol.S"
  460. "${PROJECT_SRC}/i387/s_rintl.S"
  461. "${PROJECT_SRC}/i387/s_truncl.S"
  462. )
  463. if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  464. list(APPEND OPENLIBM_ASM_SOURCE
  465. "${PROJECT_SRC}/i387/s_scalbn.S"
  466. "${PROJECT_SRC}/i387/s_scalbnf.S"
  467. "${PROJECT_SRC}/i387/s_scalbnl.S"
  468. )
  469. endif()
  470. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "powerpc")
  471. list(APPEND OPENLIBM_C_SOURCE
  472. "${PROJECT_SRC}/powerpc/fenv.c"
  473. )
  474. elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "riscv64")
  475. list(APPEND OPENLIBM_C_SOURCE
  476. "${PROJECT_SRC}/riscv64/fenv.c")
  477. else()
  478. message(FATAL_ERROR "${PROJECT_NAME} CMake build is not set up for ${OPENLIBM_ARCH_FOLDER}")
  479. endif()
  480. # Filter out C implementation from compilation list if a native implementation exists
  481. foreach(FILE_TO_REMOVE ${OPENLIBM_ASM_SOURCE})
  482. # Get filename and strip out extension
  483. cmake_path(GET FILE_TO_REMOVE FILENAME FILENAME_TO_REMOVE)
  484. cmake_path(REMOVE_EXTENSION FILENAME_TO_REMOVE OUTPUT_VARIABLE FILENAME_TO_REMOVE)
  485. message(DEBUG "Filename to remove: ${FILENAME_TO_REMOVE}")
  486. # Go through files and remove one with the same name
  487. foreach(CUR_FILE ${OPENLIBM_C_SOURCE})
  488. cmake_path(GET CUR_FILE FILENAME CUR_FILENAME)
  489. cmake_path(REMOVE_EXTENSION CUR_FILENAME OUTPUT_VARIABLE CUR_FILENAME)
  490. if(${CUR_FILENAME} STREQUAL ${FILENAME_TO_REMOVE})
  491. list(REMOVE_ITEM OPENLIBM_C_SOURCE ${CUR_FILE})
  492. message(DEBUG "Removed source file from compilation list: ${CUR_FILE}")
  493. break()
  494. endif()
  495. endforeach()
  496. endforeach()
  497. # Add sources
  498. target_sources("${PROJECT_NAME}" PRIVATE ${OPENLIBM_C_SOURCE}
  499. ${OPENLIBM_ASM_SOURCE}
  500. )
  501. # Include directories
  502. list(APPEND OPENLIBM_INCLUDE_DIRS
  503. "${PROJECT_SRC}"
  504. "${PROJECT_SRC}/include"
  505. "${PROJECT_SRC}/${OPENLIBM_ARCH_FOLDER}"
  506. "${PROJECT_SRC}/src"
  507. )
  508. if(${OPENLIBM_ARCH_FOLDER} STREQUAL "i387" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "amd64" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "powerpc")
  509. list(APPEND OPENLIBM_INCLUDE_DIRS "${PROJECT_SRC}/ld80")
  510. else()
  511. if(${OPENLIBM_ARCH_FOLDER} STREQUAL "aarch64" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "riscv64")
  512. list(APPEND OPENLIBM_INCLUDE_DIRS "${PROJECT_SRC}/ld128")
  513. endif()
  514. endif()
  515. target_include_directories("${PROJECT_NAME}" PUBLIC ${OPENLIBM_INCLUDE_DIRS})
  516. file(GLOB PUBLIC_HEADERS "*.h" "include/*.h" "${OPENLIBM_ARCH_FOLDER}/*.h" "src/*.h")
  517. set_target_properties("${PROJECT_NAME}" PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}")
  518. install (TARGETS "${PROJECT_NAME}")
  519. # Can't use configure_file because openlibm.pc.in uses $var instead of CMake configure @var's
  520. # Would rather string replace variables here instead of editing .pc.in, because editing .pc.in
  521. # might build break autotools build.
  522. file(READ "${PROJECT_SRC}/openlibm.pc.in" PC_FILE)
  523. string(REPLACE "\${version}" "${CMAKE_PROJECT_VERSION}" PC_FILE ${PC_FILE})
  524. string(PREPEND PC_FILE "prefix=${CMAKE_INSTALL_PREFIX}
  525. includedir=\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}
  526. libdir=\${prefix}/${CMAKE_INSTALL_LIBDIR}\n
  527. ")
  528. file(WRITE "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc" ${PC_FILE})
  529. install(FILES "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc"
  530. DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")