1
1
cmake_minimum_required (VERSION 3.25)
2
2
3
+ # Get version string from Make.inc
4
+ file (READ "${CMAKE_CURRENT_LIST_DIR} /Make.inc" MAKE_FILE)
5
+ string (REGEX MATCH "VERSION = ([0-9\. ]+)" _ ${MAKE_FILE} )
6
+
3
7
project (openlibm
4
- VERSION 0.8.2
8
+ VERSION ${CMAKE_MATCH_1}
5
9
LANGUAGES C ASM)
6
10
7
11
option (BUILD_SHARED_LIBS "Build using shared libraries" ON )
@@ -16,7 +20,9 @@ if(${OPENLIBM_ARCH_FOLDER} STREQUAL "amd64" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL
16
20
set (OPENLIBM_ARCH_FOLDER "amd64" )
17
21
elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "arm64" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "aarch64" )
18
22
set (OPENLIBM_ARCH_FOLDER "aarch64" )
19
- elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "x86" )
23
+ elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "armv7-a" )
24
+ set (OPENLIBM_ARCH_FOLDER "arm" )
25
+ elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "x86" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "i686" )
20
26
set (OPENLIBM_ARCH_FOLDER "i387" )
21
27
elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "powerpc" )
22
28
set (OPENLIBM_ARCH_FOLDER "powerpc" )
@@ -55,16 +61,6 @@ endif()
55
61
# Add compile flags
56
62
target_compile_options ("${PROJECT_NAME} " PUBLIC ${C_ASM_COMPILE_FLAGS} )
57
63
58
-
59
- # Determine if long double and double is the same on current platform
60
- if (${OPENLIBM_ARCH_FOLDER} STREQUAL "i387" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "amd64" )
61
- set (LONG_DOUBLE_NOT_DOUBLE 1)
62
- elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "aarch64" )
63
- if (NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" ))
64
- set (LONG_DOUBLE_NOT_DOUBLE 1)
65
- endif ()
66
- endif ()
67
-
68
64
# Project Source
69
65
set (PROJECT_SRC "${PROJECT_SOURCE_DIR} " )
70
66
@@ -257,6 +253,16 @@ if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
257
253
)
258
254
endif ()
259
255
256
+ # Determine if long double and double are the same size
257
+ include (CheckCSourceCompiles)
258
+ check_c_source_compiles("
259
+ #include <float.h>
260
+ #if (LDBL_MANT_DIG == DBL_MANT_DIG)
261
+ #error \" long double and double are the same size\"
262
+ #endif
263
+ int main(void ) { return 0; }
264
+ " LONG_DOUBLE_NOT_DOUBLE)
265
+
260
266
# Add in long double functions for x86, x64 and aarch64
261
267
if (LONG_DOUBLE_NOT_DOUBLE)
262
268
list (APPEND OPENLIBM_C_SOURCE
@@ -428,6 +434,11 @@ elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "aarch64")
428
434
"${PROJECT_SRC} /aarch64/fenv.c"
429
435
)
430
436
437
+ elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "arm" )
438
+ list (APPEND OPENLIBM_C_SOURCE
439
+ "${PROJECT_SRC} /${OPENLIBM_ARCH_FOLDER} /fenv.c"
440
+ )
441
+
431
442
elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "i387" )
432
443
list (APPEND OPENLIBM_C_SOURCE
433
444
"${PROJECT_SRC} /i387/fenv.c"
@@ -545,3 +556,16 @@ target_include_directories("${PROJECT_NAME}" PUBLIC ${OPENLIBM_INCLUDE_DIRS})
545
556
file (GLOB PUBLIC_HEADERS "*.h" "include/*.h" "${OPENLIBM_ARCH_FOLDER} /*.h" "src/*.h" )
546
557
set_target_properties ("${PROJECT_NAME} " PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS} " )
547
558
install (TARGETS "${PROJECT_NAME} " )
559
+
560
+ # Can't use configure_file because openlibm.pc.in uses $var instead of CMake configure @var's
561
+ # Would rather string replace variables here instead of editing .pc.in, because editing .pc.in
562
+ # might build break autotools build.
563
+ file (READ "${PROJECT_SRC} /openlibm.pc.in" PC_FILE)
564
+ string (REPLACE "\$ {version}" ${CMAKE_PROJECT_VERSION} PC_FILE ${PC_FILE} )
565
+ string (PREPEND PC_FILE "prefix=${CMAKE_INSTALL_PREFIX}
566
+ includedir=\$ {prefix}/${CMAKE_INSTALL_INCLUDEDIR}
567
+ libdir=\$ {prefix}/${CMAKE_INSTALL_LIBDIR} \n
568
+ " )
569
+ file (WRITE "${CMAKE_BINARY_DIR} /${PROJECT_NAME} .pc" ${PC_FILE} )
570
+ install (FILES "${CMAKE_BINARY_DIR} /${PROJECT_NAME} .pc"
571
+ DESTINATION "${CMAKE_INSTALL_LIBDIR} /pkgconfig" )
0 commit comments