Skip to content

Commit 250c969

Browse files
committed
[WIP] Integrate with mpdecimal
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent c68eead commit 250c969

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+19821
-0
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ if(SOURCEMETA_CORE_URI)
9090
endif()
9191

9292
if(SOURCEMETA_CORE_JSON)
93+
find_package(mpdecimal REQUIRED)
9394
add_subdirectory(src/core/json)
9495
endif()
9596

cmake/Findmpdecimal.cmake

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
if(NOT mpdecimal_FOUND)
2+
set(MPDECIMAL_DIR "${PROJECT_SOURCE_DIR}/vendor/mpdecimal")
3+
set(MPDECIMAL_SOURCE_DIR "${MPDECIMAL_DIR}/libmpdec")
4+
set(MPDECIMAL_BINARY_DIR "${PROJECT_BINARY_DIR}/mpdecimal")
5+
6+
file(MAKE_DIRECTORY "${MPDECIMAL_BINARY_DIR}/include")
7+
8+
if(MSVC)
9+
configure_file(
10+
"${MPDECIMAL_SOURCE_DIR}/mpdecimal64vc.h"
11+
"${MPDECIMAL_BINARY_DIR}/include/mpdecimal.h"
12+
COPYONLY)
13+
set(MPD_CONFIG_LIST CONFIG_64 MASM)
14+
else()
15+
set(MPD_HEADER_CONFIG "/* ABI: 64-bit */")
16+
17+
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64")
18+
set(MPD_CONFIG_LIST CONFIG_64 ASM)
19+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
20+
set(MPD_CONFIG_LIST CONFIG_64 ANSI HAVE_UINT128_T)
21+
else()
22+
set(MPD_CONFIG_LIST CONFIG_64 ANSI)
23+
endif()
24+
25+
configure_file(
26+
"${MPDECIMAL_SOURCE_DIR}/mpdecimal.h.in"
27+
"${MPDECIMAL_BINARY_DIR}/include/mpdecimal.h"
28+
@ONLY)
29+
endif()
30+
31+
set(MPDECIMAL_PUBLIC_HEADER "${MPDECIMAL_BINARY_DIR}/include/mpdecimal.h")
32+
33+
set(MPDECIMAL_SOURCES
34+
"${MPDECIMAL_SOURCE_DIR}/basearith.c"
35+
"${MPDECIMAL_SOURCE_DIR}/constants.c"
36+
"${MPDECIMAL_SOURCE_DIR}/context.c"
37+
"${MPDECIMAL_SOURCE_DIR}/convolute.c"
38+
"${MPDECIMAL_SOURCE_DIR}/crt.c"
39+
"${MPDECIMAL_SOURCE_DIR}/difradix2.c"
40+
"${MPDECIMAL_SOURCE_DIR}/fnt.c"
41+
"${MPDECIMAL_SOURCE_DIR}/fourstep.c"
42+
"${MPDECIMAL_SOURCE_DIR}/io.c"
43+
"${MPDECIMAL_SOURCE_DIR}/mpalloc.c"
44+
"${MPDECIMAL_SOURCE_DIR}/mpdecimal.c"
45+
"${MPDECIMAL_SOURCE_DIR}/mpsignal.c"
46+
"${MPDECIMAL_SOURCE_DIR}/numbertheory.c"
47+
"${MPDECIMAL_SOURCE_DIR}/sixstep.c"
48+
"${MPDECIMAL_SOURCE_DIR}/transpose.c")
49+
50+
add_library(mpdecimal ${MPDECIMAL_SOURCES})
51+
52+
target_include_directories(mpdecimal PRIVATE
53+
"${MPDECIMAL_SOURCE_DIR}")
54+
55+
target_include_directories(mpdecimal PUBLIC
56+
"$<BUILD_INTERFACE:${MPDECIMAL_BINARY_DIR}/include>"
57+
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
58+
59+
target_compile_definitions(mpdecimal PUBLIC MPD_CONFIG_64)
60+
foreach(config_item ${MPD_CONFIG_LIST})
61+
target_compile_definitions(mpdecimal PRIVATE ${config_item})
62+
endforeach()
63+
64+
target_compile_definitions(mpdecimal PRIVATE NDEBUG)
65+
66+
if(SOURCEMETA_OS_LINUX)
67+
target_compile_definitions(mpdecimal PRIVATE _GNU_SOURCE)
68+
endif()
69+
70+
if(UNIX AND NOT APPLE)
71+
target_link_libraries(mpdecimal PRIVATE m)
72+
endif()
73+
74+
if(SOURCEMETA_COMPILER_LLVM OR SOURCEMETA_COMPILER_GCC)
75+
target_compile_options(mpdecimal PRIVATE -Wall -Wextra -Wno-unknown-pragmas)
76+
endif()
77+
78+
if(MSVC)
79+
if(BUILD_SHARED_LIBS)
80+
target_compile_definitions(mpdecimal PRIVATE BUILD_LIBMPDEC)
81+
else()
82+
target_compile_options(mpdecimal PRIVATE /U_DLL)
83+
endif()
84+
endif()
85+
86+
add_library(mpdecimal::mpdecimal ALIAS mpdecimal)
87+
88+
set_target_properties(mpdecimal
89+
PROPERTIES
90+
OUTPUT_NAME mpdecimal
91+
PUBLIC_HEADER "${MPDECIMAL_PUBLIC_HEADER}"
92+
C_VISIBILITY_PRESET "default"
93+
C_VISIBILITY_INLINES_HIDDEN FALSE
94+
EXPORT_NAME mpdecimal)
95+
96+
if(SOURCEMETA_CORE_INSTALL)
97+
include(GNUInstallDirs)
98+
install(TARGETS mpdecimal
99+
EXPORT mpdecimal
100+
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
101+
COMPONENT sourcemeta_core_dev
102+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
103+
COMPONENT sourcemeta_core
104+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
105+
COMPONENT sourcemeta_core
106+
NAMELINK_COMPONENT sourcemeta_core_dev
107+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
108+
COMPONENT sourcemeta_core_dev)
109+
install(EXPORT mpdecimal
110+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/mpdecimal"
111+
NAMESPACE mpdecimal::
112+
COMPONENT sourcemeta_core_dev)
113+
114+
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/mpdecimal-config.cmake
115+
"include(\"\${CMAKE_CURRENT_LIST_DIR}/mpdecimal.cmake\")\n"
116+
"check_required_components(\"mpdecimal\")\n")
117+
install(FILES
118+
"${CMAKE_CURRENT_BINARY_DIR}/mpdecimal-config.cmake"
119+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/mpdecimal"
120+
COMPONENT sourcemeta_core_dev)
121+
endif()
122+
123+
set(mpdecimal_FOUND ON)
124+
endif()

config.cmake.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ foreach(component ${SOURCEMETA_CORE_COMPONENTS})
4747
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_uri.cmake")
4848
elseif(component STREQUAL "json")
4949
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_io.cmake")
50+
find_dependency(mpdecimal CONFIG)
5051
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_json.cmake")
5152
elseif(component STREQUAL "jsonl")
5253
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_json.cmake")

src/core/json/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ if(SOURCEMETA_CORE_INSTALL)
77
endif()
88

99
target_link_libraries(sourcemeta_core_json PRIVATE sourcemeta::core::io)
10+
target_link_libraries(sourcemeta_core_json PRIVATE mpdecimal)

vendor-mpdecimal.sh

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/bin/sh
2+
3+
set -o errexit
4+
set -o nounset
5+
6+
# Because mpdecimal does not host the code in any Git provider
7+
# See https://www.bytereef.org/mpdecimal/index.html
8+
9+
VERSION="4.0.1"
10+
# See https://www.bytereef.org/mpdecimal/download.html
11+
URL="https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-$VERSION.tar.gz"
12+
13+
DIRECTORY="./vendor/mpdecimal"
14+
rm -rf "$DIRECTORY"
15+
mkdir -p "$DIRECTORY"
16+
curl --location --progress-bar "$URL" | tar -xz --strip-components=1 -C "$DIRECTORY"
17+
18+
# Masking
19+
rm -rf "$DIRECTORY/doc"
20+
rm -rf "$DIRECTORY/libmpdec/.objs"
21+
rm -rf "$DIRECTORY/libmpdec/.pc"
22+
rm -rf "$DIRECTORY/libmpdec/.profile"
23+
rm -rf "$DIRECTORY/libmpdec/examples"
24+
rm -rf "$DIRECTORY/libmpdec/literature"
25+
rm -rf "$DIRECTORY/libmpdec/Makefile.in"
26+
rm -rf "$DIRECTORY/libmpdec/Makefile.vc"
27+
rm -rf "$DIRECTORY/libmpdec/README.txt"
28+
rm -rf "$DIRECTORY/libmpdec++"
29+
rm -rf "$DIRECTORY/tests"
30+
rm -rf "$DIRECTORY/tests++"
31+
rm -rf "$DIRECTORY/vcbuild"
32+
rm -rf "$DIRECTORY/CHANGELOG.txt"
33+
rm -rf "$DIRECTORY/config.guess"
34+
rm -rf "$DIRECTORY/config.h.in"
35+
rm -rf "$DIRECTORY/config.sub"
36+
rm -rf "$DIRECTORY/configure"
37+
rm -rf "$DIRECTORY/configure.ac"
38+
rm -rf "$DIRECTORY/install-sh"
39+
rm -rf "$DIRECTORY/INSTALL.txt"
40+
rm -rf "$DIRECTORY/Makefile.in"
41+
rm -rf "$DIRECTORY/README.txt"

vendor/mpdecimal/COPYRIGHT.txt

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)