11cmake_minimum_required (VERSION 3.25)
22
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+
37project (openlibm
4- VERSION 0.8.2
8+ VERSION ${CMAKE_MATCH_1}
59 LANGUAGES C ASM)
610
711option (BUILD_SHARED_LIBS "Build using shared libraries" ON )
@@ -16,7 +20,9 @@ if(${OPENLIBM_ARCH_FOLDER} STREQUAL "amd64" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL
1620 set (OPENLIBM_ARCH_FOLDER "amd64" )
1721elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "arm64" OR ${OPENLIBM_ARCH_FOLDER} STREQUAL "aarch64" )
1822 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" )
2026 set (OPENLIBM_ARCH_FOLDER "i387" )
2127elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "powerpc" )
2228 set (OPENLIBM_ARCH_FOLDER "powerpc" )
@@ -55,16 +61,6 @@ endif()
5561# Add compile flags
5662target_compile_options ("${PROJECT_NAME} " PUBLIC ${C_ASM_COMPILE_FLAGS} )
5763
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-
6864# Project Source
6965set (PROJECT_SRC "${PROJECT_SOURCE_DIR} " )
7066
@@ -257,6 +253,16 @@ if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
257253 )
258254endif ()
259255
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+
260266# Add in long double functions for x86, x64 and aarch64
261267if (LONG_DOUBLE_NOT_DOUBLE)
262268 list (APPEND OPENLIBM_C_SOURCE
@@ -428,6 +434,11 @@ elseif(${OPENLIBM_ARCH_FOLDER} STREQUAL "aarch64")
428434 "${PROJECT_SRC} /aarch64/fenv.c"
429435 )
430436
437+ elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "arm" )
438+ list (APPEND OPENLIBM_C_SOURCE
439+ "${PROJECT_SRC} /${OPENLIBM_ARCH_FOLDER} /fenv.c"
440+ )
441+
431442elseif (${OPENLIBM_ARCH_FOLDER} STREQUAL "i387" )
432443 list (APPEND OPENLIBM_C_SOURCE
433444 "${PROJECT_SRC} /i387/fenv.c"
@@ -545,3 +556,16 @@ target_include_directories("${PROJECT_NAME}" PUBLIC ${OPENLIBM_INCLUDE_DIRS})
545556file (GLOB PUBLIC_HEADERS "*.h" "include/*.h" "${OPENLIBM_ARCH_FOLDER} /*.h" "src/*.h" )
546557set_target_properties ("${PROJECT_NAME} " PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS} " )
547558install (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