mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-20 14:08:20 +00:00
GMP 6.2.1's arm64 assembly keeps loop counters in x18, which Apple reserves and macOS zeroes on every return to user space (syscalls, page faults, preemption). When that happens inside one of those loops the counter underflows and the routine walks the stack until the guard page: EXC_BAD_ACCESS / SIGBUS inside __gmpn_* whenever CGAL falls back to exact arithmetic (texture import boundary smoothing, text emboss cuts, mesh repair, mesh boolean). 6.3.0 moves those counters to ordinary temporaries (gmp-6.2 changeset f4ff6ff711ed); no x18 use remains under mpn/arm64. The GCC 15 patch applies unchanged apart from a line offset. The tarball comes from the GNU mirror, like MPFR. Windows is unaffected: MSVC copies the prebuilt libgmp-10 and the arm64 job stages MSYS2's GMP. Built with the deps recipe flags and ran make check on Linux x86_64 (clang 18, 200/200) and macOS arm64 (Apple clang, 199/199).
76 lines
3.4 KiB
CMake
76 lines
3.4 KiB
CMake
|
|
set(_srcdir ${CMAKE_CURRENT_LIST_DIR}/gmp)
|
|
|
|
if (IN_GIT_REPO)
|
|
set(GMP_DIRECTORY_FLAG --directory ${BINARY_DIR_REL}/dep_GMP-prefix/src/dep_GMP)
|
|
endif ()
|
|
|
|
if (MSVC)
|
|
set(_output ${DESTDIR}/include/gmp.h
|
|
${DESTDIR}/lib/libgmp-10.lib
|
|
${DESTDIR}/bin/libgmp-10.dll)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${_output}
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/include/gmp.h ${DESTDIR}/include/
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win-${DEPS_ARCH}/libgmp-10.lib ${DESTDIR}/lib/
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win-${DEPS_ARCH}/libgmp-10.dll ${DESTDIR}/bin/
|
|
)
|
|
|
|
add_custom_target(dep_GMP SOURCES ${_output})
|
|
|
|
else ()
|
|
set(_gmp_ccflags "-O2 -DNDEBUG -fPIC -DPIC -Wall -Wmissing-prototypes -Wpointer-arith -pedantic -fomit-frame-pointer -fno-common")
|
|
set(_gmp_build_tgt "${CMAKE_SYSTEM_PROCESSOR}")
|
|
|
|
if (APPLE)
|
|
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
|
|
set(_gmp_build_arch aarch64)
|
|
else ()
|
|
set(_gmp_build_arch ${CMAKE_SYSTEM_PROCESSOR})
|
|
endif()
|
|
if (IS_CROSS_COMPILE)
|
|
if (${CMAKE_OSX_ARCHITECTURES} MATCHES "arm")
|
|
set(_gmp_host_arch aarch64)
|
|
set(_gmp_host_arch_flags "-arch arm64")
|
|
elseif (${CMAKE_OSX_ARCHITECTURES} MATCHES "x86_64")
|
|
set(_gmp_host_arch x86_64)
|
|
set(_gmp_host_arch_flags "-arch x86_64")
|
|
endif()
|
|
set(_gmp_ccflags "${_gmp_ccflags} ${_gmp_host_arch_flags} -mmacosx-version-min=${DEP_OSX_TARGET}")
|
|
set(_gmp_build_tgt --build=${_gmp_build_arch}-apple-darwin --host=${_gmp_host_arch}-apple-darwin)
|
|
else ()
|
|
set(_gmp_ccflags "${_gmp_ccflags} -mmacosx-version-min=${DEP_OSX_TARGET}")
|
|
set(_gmp_build_tgt "--build=${_gmp_build_arch}-apple-darwin")
|
|
endif()
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
|
|
set(_gmp_ccflags "${_gmp_ccflags} -march=armv7-a") # Works on RPi-4
|
|
set(_gmp_build_tgt armv7)
|
|
endif()
|
|
set(_gmp_build_tgt "--build=${_gmp_build_tgt}-pc-linux-gnu")
|
|
else ()
|
|
set(_gmp_build_tgt "") # let it guess
|
|
endif()
|
|
|
|
set(_cross_compile_arg "")
|
|
if (CMAKE_CROSSCOMPILING)
|
|
# TOOLCHAIN_PREFIX should be defined in the toolchain file
|
|
set(_cross_compile_arg --host=${TOOLCHAIN_PREFIX})
|
|
endif ()
|
|
|
|
# 6.3.0 is the first release whose arm64 assembly avoids x18, which macOS
|
|
# reserves and zeroes on every return to user space; 6.2.1 crashes on Apple
|
|
# silicon whenever CGAL falls back to exact arithmetic.
|
|
ExternalProject_Add(dep_GMP
|
|
URL https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.bz2
|
|
URL_HASH SHA256=ac28211a7cfb609bae2e2c8d6058d66c8fe96434f740cf6fe2e47b000d1c20cb
|
|
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/GMP
|
|
PATCH_COMMAND git apply ${GMP_DIRECTORY_FLAG} --verbose ${CMAKE_CURRENT_LIST_DIR}/0001-GMP_GCC15.patch
|
|
BUILD_IN_SOURCE ON
|
|
CONFIGURE_COMMAND env "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_ccflags}" "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}" ./configure ${_cross_compile_arg} --enable-shared=no --enable-cxx=yes --enable-static=yes "--prefix=${DESTDIR}" ${_gmp_build_tgt}
|
|
BUILD_COMMAND make -j
|
|
INSTALL_COMMAND make install
|
|
)
|
|
endif ()
|