Files

163 lines
4.3 KiB
CMake

# SPDX-FileCopyrightText: 2020-2023 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
set(GMP_EXTRA_ARGS -enable-cxx)
if(WIN32)
cmake_to_msys_path("${BUILD_DIR}/gmp/src/external_gmp/compile" compilescript_path)
set(arlib_joint_path "ar-lib lib.exe")
set(GMP_CFLAGS "-nologo -W3 -utf-8 -MP -MD -Z7 -Ob0 -Od -Xcompiler -RTC1 -DWIN32 -D_WINDOWS")
set(GMP_CC_CXX "${compilescript_path} cl")
set(GMP_NM "dumpbin.exe -symbols -headers")
set(GMP_CONFIGURE_ENV
set AR=${arlib_joint_path} &&
set NM=${GMP_NM} &&
${CONFIGURE_ENV_NO_PERL} &&
set CC=${GMP_CC_CXX} &&
set CXX=${GMP_CC_CXX} &&
set CFLAGS=${GMP_CFLAGS} &&
set AS=:
)
set(GMP_OPTIONS
--disable-static
--enable-shared
--enable-cxx
--verbose
gmp_cv_check_libm_for_build=no
ac_cv_prog_LEX=:
ac_cv_prog_YACC=:
ac_cv_prog_ac_ct_STRIP=:
ac_cv_prog_RANLIB=:
lt_cv_to_host_file_cmd=func_convert_file_noop
lt_cv_to_tool_file_cmd=func_convert_file_noop
)
if(BLENDER_PLATFORM_ARM)
set(GMP_OPTIONS
${GMP_OPTIONS}
--enable-assembly=no
--build=aarch64-pc-mingw32
)
else()
set(GMP_OPTIONS
${GMP_OPTIONS}
--enable-assembly=no
--build=x86_64-pc-mingw32
ac_cv_func_memset=yes
gmp_cv_asm_w32=.word
)
endif()
else()
set(GMP_CONFIGURE_ENV ${CONFIGURE_ENV_NO_PERL})
set(GMP_OPTIONS --enable-static --disable-shared )
endif()
if(UNIX)
if(NOT (APPLE AND BLENDER_PLATFORN_ARM))
set(GMP_OPTIONS ${GMP_OPTIONS} --with-pic)
endif()
if(NOT (APPLE OR BLENDER_PLATFORM_ARM))
set(GMP_OPTIONS ${GMP_OPTIONS} --enable-fat)
endif()
endif()
# Boolean crashes with Arm assembly, see #103423.
if(BLENDER_PLATFORM_ARM)
set(GMP_OPTIONS
${GMP_OPTIONS}
--disable-assembly
)
endif()
ExternalProject_Add(external_gmp
URL file://${PACKAGE_DIR}/${GMP_FILE}
DOWNLOAD_DIR ${DOWNLOAD_DIR}
URL_HASH ${GMP_HASH_TYPE}=${GMP_HASH}
PREFIX ${BUILD_DIR}/gmp
PATCH_COMMAND ${PATCH_CMD} -p 1 -d
${BUILD_DIR}/gmp/src/external_gmp <
${PATCH_DIR}/gmp.diff
CONFIGURE_COMMAND ${GMP_CONFIGURE_ENV} &&
cd ${BUILD_DIR}/gmp/src/external_gmp/ &&
${CONFIGURE_COMMAND} --prefix=${LIBDIR}/gmp ${GMP_OPTIONS} ${GMP_EXTRA_ARGS}
BUILD_COMMAND ${CONFIGURE_ENV_NO_PERL} &&
cd ${BUILD_DIR}/gmp/src/external_gmp/ &&
make -j${MAKE_THREADS}
INSTALL_COMMAND ${CONFIGURE_ENV_NO_PERL} &&
cd ${BUILD_DIR}/gmp/src/external_gmp/ &&
make install
INSTALL_DIR ${LIBDIR}/gmp
)
if(BUILD_MODE STREQUAL Release AND WIN32)
ExternalProject_Add_Step(external_gmp after_install
COMMAND ${CMAKE_COMMAND} -E copy
${LIBDIR}/gmp/bin/gmp-10.dll
${HARVEST_TARGET}/gmp/lib/gmp-10.dll
COMMAND ${CMAKE_COMMAND} -E copy
${LIBDIR}/gmp/lib/gmp.dll.lib
${HARVEST_TARGET}/gmp/lib/gmp.dll.lib
COMMAND ${CMAKE_COMMAND} -E copy_directory
${LIBDIR}/gmp/include
${HARVEST_TARGET}/gmp/include
DEPENDEES install
)
endif()
if(WIN32)
# gmpxx is somewhat special, it builds on top of the C style gmp library but exposes C++ bindings
# given the C++ ABI between MSVC and mingw is not compatible, we need to build the bindings
# with MSVC, while GMP can only be build with mingw.
ExternalProject_Add(external_gmpxx
URL file://${PACKAGE_DIR}/${GMP_FILE}
DOWNLOAD_DIR ${DOWNLOAD_DIR}
URL_HASH ${GMP_HASH_TYPE}=${GMP_HASH}
PREFIX ${BUILD_DIR}/gmpxx
PATCH_COMMAND COMMAND
${CMAKE_COMMAND} -E copy
${PATCH_DIR}/cmakelists_gmpxx.txt
${BUILD_DIR}/gmpxx/src/external_gmpxx/CMakeLists.txt &&
${CMAKE_COMMAND} -E copy
${PATCH_DIR}/config_gmpxx.h
${BUILD_DIR}/gmpxx/src/external_gmpxx/config.h
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${LIBDIR}/gmpxx
${DEFAULT_CMAKE_FLAGS}
-DGMP_LIBRARY=${BUILD_DIR}/gmp/src/external_gmp/.libs/gmp.dll.lib
-DGMP_INCLUDE_DIR=${BUILD_DIR}/gmp/src/external_gmp
-DCMAKE_DEBUG_POSTFIX=_d
INSTALL_DIR ${LIBDIR}/gmpxx
)
add_dependencies(
external_gmpxx
external_gmp
)
ExternalProject_Add_Step(external_gmpxx after_install
COMMAND ${CMAKE_COMMAND} -E copy_directory
${LIBDIR}/gmpxx/
${HARVEST_TARGET}/gmp
DEPENDEES install
)
else()
harvest(external_gmp gmp/include gmp/include "*.h")
harvest(external_gmp gmp/lib gmp/lib "*.a")
endif()