Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/website-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ jobs:
-DCMAKE_BUILD_TYPE:STRING=Release
-DSOURCEMETA_CORE_LANG_IO:BOOL=OFF
-DSOURCEMETA_CORE_LANG_PROCESS:BOOL=OFF
-DSOURCEMETA_CORE_LANG_PARALLEL:BOOL=OFF
-DSOURCEMETA_CORE_LANG_NUMERIC:BOOL=OFF
-DSOURCEMETA_CORE_TIME:BOOL=OFF
-DSOURCEMETA_CORE_UUID:BOOL=OFF
-DSOURCEMETA_CORE_REGEX:BOOL=OFF
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/website-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ jobs:
-DCMAKE_BUILD_TYPE:STRING=Release
-DSOURCEMETA_CORE_LANG_IO:BOOL=OFF
-DSOURCEMETA_CORE_LANG_PROCESS:BOOL=OFF
-DSOURCEMETA_CORE_LANG_PARALLEL:BOOL=OFF
-DSOURCEMETA_CORE_LANG_NUMERIC:BOOL=OFF
-DSOURCEMETA_CORE_TIME:BOOL=OFF
-DSOURCEMETA_CORE_UUID:BOOL=OFF
-DSOURCEMETA_CORE_REGEX:BOOL=OFF
Expand Down
12 changes: 11 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
cmake_minimum_required(VERSION 3.16)
project(core VERSION 0.0.0 LANGUAGES C CXX DESCRIPTION "Sourcemeta Core")
project(core VERSION 0.0.0 LANGUAGES C CXX ASM_MASM DESCRIPTION "Sourcemeta Core")
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")

# Options
option(SOURCEMETA_CORE_LANG_IO "Build the Sourcemeta Core language I/O library" ON)
option(SOURCEMETA_CORE_LANG_PROCESS "Build the Sourcemeta Core language Process library" ON)
option(SOURCEMETA_CORE_LANG_PARALLEL "Build the Sourcemeta Core language parallel library" ON)
option(SOURCEMETA_CORE_LANG_NUMERIC "Build the Sourcemeta Core language numeric library" ON)
option(SOURCEMETA_CORE_TIME "Build the Sourcemeta Core time library" ON)
option(SOURCEMETA_CORE_UUID "Build the Sourcemeta Core UUID library" ON)
option(SOURCEMETA_CORE_MD5 "Build the Sourcemeta Core MD5 library" ON)
Expand Down Expand Up @@ -68,6 +69,11 @@ if(SOURCEMETA_CORE_LANG_PARALLEL)
add_subdirectory(src/lang/parallel)
endif()

if(SOURCEMETA_CORE_LANG_NUMERIC)
find_package(mpdecimal REQUIRED)
add_subdirectory(src/lang/numeric)
endif()

if(SOURCEMETA_CORE_TIME)
add_subdirectory(src/core/time)
endif()
Expand Down Expand Up @@ -173,6 +179,10 @@ if(SOURCEMETA_CORE_TESTS)
add_subdirectory(test/parallel)
endif()

if(SOURCEMETA_CORE_LANG_NUMERIC)
add_subdirectory(test/numeric)
endif()

if(SOURCEMETA_CORE_TIME)
add_subdirectory(test/time)
endif()
Expand Down
133 changes: 133 additions & 0 deletions cmake/Findmpdecimal.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
if(NOT mpdecimal_FOUND)
set(MPDECIMAL_DIR "${PROJECT_SOURCE_DIR}/vendor/mpdecimal")
set(MPDECIMAL_SOURCE_DIR "${MPDECIMAL_DIR}/libmpdec")
set(MPDECIMAL_BINARY_DIR "${PROJECT_BINARY_DIR}/mpdecimal")

file(MAKE_DIRECTORY "${MPDECIMAL_BINARY_DIR}/include")

if(MSVC)
configure_file(
"${MPDECIMAL_SOURCE_DIR}/mpdecimal64vc.h"
"${MPDECIMAL_BINARY_DIR}/include/mpdecimal.h"
COPYONLY)
set(MPD_CONFIG_LIST CONFIG_64 MASM)
else()
set(MPD_HEADER_CONFIG "/* ABI: 64-bit */")

if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64")
set(MPD_CONFIG_LIST CONFIG_64 ASM)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
set(MPD_CONFIG_LIST CONFIG_64 ANSI HAVE_UINT128_T)
else()
set(MPD_CONFIG_LIST CONFIG_64 ANSI)
endif()

configure_file(
"${MPDECIMAL_SOURCE_DIR}/mpdecimal.h.in"
"${MPDECIMAL_BINARY_DIR}/include/mpdecimal.h"
@ONLY)
endif()

set(MPDECIMAL_PUBLIC_HEADER "${MPDECIMAL_BINARY_DIR}/include/mpdecimal.h")

set(MPDECIMAL_SOURCES
"${MPDECIMAL_SOURCE_DIR}/basearith.c"
"${MPDECIMAL_SOURCE_DIR}/constants.c"
"${MPDECIMAL_SOURCE_DIR}/context.c"
"${MPDECIMAL_SOURCE_DIR}/convolute.c"
"${MPDECIMAL_SOURCE_DIR}/crt.c"
"${MPDECIMAL_SOURCE_DIR}/difradix2.c"
"${MPDECIMAL_SOURCE_DIR}/fnt.c"
"${MPDECIMAL_SOURCE_DIR}/fourstep.c"
"${MPDECIMAL_SOURCE_DIR}/io.c"
"${MPDECIMAL_SOURCE_DIR}/mpalloc.c"
"${MPDECIMAL_SOURCE_DIR}/mpdecimal.c"
"${MPDECIMAL_SOURCE_DIR}/mpsignal.c"
"${MPDECIMAL_SOURCE_DIR}/numbertheory.c"
"${MPDECIMAL_SOURCE_DIR}/sixstep.c"
"${MPDECIMAL_SOURCE_DIR}/transpose.c")

if(MSVC)
list(APPEND MPDECIMAL_SOURCES "${MPDECIMAL_SOURCE_DIR}/vcdiv64.asm")
endif()

add_library(mpdecimal ${MPDECIMAL_SOURCES})

target_include_directories(mpdecimal PRIVATE
"${MPDECIMAL_SOURCE_DIR}")

target_include_directories(mpdecimal PUBLIC
"$<BUILD_INTERFACE:${MPDECIMAL_BINARY_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")

target_compile_definitions(mpdecimal PUBLIC MPD_CONFIG_64)
foreach(config_item ${MPD_CONFIG_LIST})
target_compile_definitions(mpdecimal PRIVATE ${config_item})
endforeach()

target_compile_definitions(mpdecimal PRIVATE NDEBUG)

if(SOURCEMETA_OS_LINUX)
target_compile_definitions(mpdecimal PRIVATE _GNU_SOURCE)
endif()

if(UNIX AND NOT APPLE)
target_link_libraries(mpdecimal PRIVATE m)
endif()

if(SOURCEMETA_COMPILER_LLVM OR SOURCEMETA_COMPILER_GCC)
target_compile_options(mpdecimal PRIVATE -Wall -Wextra -Wno-unknown-pragmas)
if(BUILD_SHARED_LIBS)
target_compile_options(mpdecimal PUBLIC -fvisibility=default)
endif()
endif()

if(MSVC)
if(BUILD_SHARED_LIBS)
target_compile_definitions(mpdecimal PRIVATE BUILD_LIBMPDEC)
else()
target_compile_options(mpdecimal PRIVATE /wd4273)
target_compile_definitions(mpdecimal PUBLIC BUILD_LIBMPDEC)
endif()
endif()

add_library(mpdecimal::mpdecimal ALIAS mpdecimal)

set_target_properties(mpdecimal
PROPERTIES
OUTPUT_NAME mpdecimal
PUBLIC_HEADER "${MPDECIMAL_PUBLIC_HEADER}"
C_VISIBILITY_PRESET "default"
C_VISIBILITY_INLINES_HIDDEN FALSE
POSITION_INDEPENDENT_CODE ON
EXPORT_NAME mpdecimal)

if(SOURCEMETA_CORE_INSTALL)
include(GNUInstallDirs)
install(TARGETS mpdecimal
EXPORT mpdecimal
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
COMPONENT sourcemeta_core_dev
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
COMPONENT sourcemeta_core
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
COMPONENT sourcemeta_core
NAMELINK_COMPONENT sourcemeta_core_dev
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
COMPONENT sourcemeta_core_dev)
install(EXPORT mpdecimal
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/mpdecimal"
NAMESPACE mpdecimal::
COMPONENT sourcemeta_core_dev)

file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/mpdecimal-config.cmake
"include(\"\${CMAKE_CURRENT_LIST_DIR}/mpdecimal.cmake\")\n"
"check_required_components(\"mpdecimal\")\n")
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/mpdecimal-config.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/mpdecimal"
COMPONENT sourcemeta_core_dev)
endif()

set(mpdecimal_FOUND ON)
endif()
4 changes: 4 additions & 0 deletions config.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ if(NOT SOURCEMETA_CORE_COMPONENTS)
list(APPEND SOURCEMETA_CORE_COMPONENTS io)
list(APPEND SOURCEMETA_CORE_COMPONENTS process)
list(APPEND SOURCEMETA_CORE_COMPONENTS parallel)
list(APPEND SOURCEMETA_CORE_COMPONENTS numeric)
list(APPEND SOURCEMETA_CORE_COMPONENTS time)
list(APPEND SOURCEMETA_CORE_COMPONENTS uuid)
list(APPEND SOURCEMETA_CORE_COMPONENTS md5)
Expand Down Expand Up @@ -34,6 +35,9 @@ foreach(component ${SOURCEMETA_CORE_COMPONENTS})
elseif(component STREQUAL "parallel")
find_dependency(Threads)
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_parallel.cmake")
elseif(component STREQUAL "numeric")
find_dependency(mpdecimal CONFIG)
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_numeric.cmake")
elseif(component STREQUAL "time")
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_time.cmake")
elseif(component STREQUAL "uuid")
Expand Down
1 change: 1 addition & 0 deletions src/core/json/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ if(SOURCEMETA_CORE_INSTALL)
endif()

target_link_libraries(sourcemeta_core_json PRIVATE sourcemeta::core::io)
target_link_libraries(sourcemeta_core_json PUBLIC sourcemeta::core::numeric)
8 changes: 8 additions & 0 deletions src/lang/numeric/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME numeric
PRIVATE_HEADERS error.h decimal.h SOURCES decimal.cc)

if(SOURCEMETA_CORE_INSTALL)
sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME numeric)
endif()

target_link_libraries(sourcemeta_core_numeric PRIVATE mpdecimal)
Loading