Files
thehub/libs/secp256k1/CMakeLists.txt
tomFlowee 8991ccaa66 Increase minimum cmake version
Because cmake is dropping support for older versions, this then
copies the minimum version that the main thehub cmake file uses.
2024-11-28 23:03:07 +01:00

124 lines
3.9 KiB
CMake

# This file is part of the Flowee project
# Copyright (C) 2020-2023 Tom Zander <tom@flowee.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
cmake_minimum_required(VERSION 3.13)
project(secp256k1)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR} src
${CMAKE_CURRENT_BINARY_DIR}/src
)
option (build_gen_context "Rebuild the ecmult_static_context.h tool" OFF)
if (build_gen_context)
## Build gen_context which is used to pre-compute ecmult_static_context.h
if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/gen_context)
add_executable (gen_context src/gen_context.c)
target_compile_definitions(gen_context PRIVATE LIBSECP256K1_CONFIG_H)
endif ()
add_custom_command (
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/src/ecmult_static_context.h
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gen_context
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS gen_context
)
endif ()
## Generate the config
find_package(GMP)
if(GMP_FOUND)
set(USE_NUM_GMP 3)
set(USE_FIELD_INV_NUM 1)
set(USE_SCALAR_INV_NUM 1)
else()
set(USE_NUM_NONE 1)
set(USE_FIELD_INV_BUILTIN 1)
set(USE_SCALAR_INV_BUILTIN 1)
set(GMP_LIBRARY "")
set(GMP_INCLUDE_DIR "")
endif()
# check if amd64 asm is supported.
include(CheckCSourceCompiles)
check_c_source_compiles("
#include <stdint.h>
int main() {
uint64_t a = 11, tmp;
__asm__ __volatile__(\"movq \$0x100000000,%1; mulq %%rsi\" : \"+a\"(a) : \"S\"(tmp) : \"cc\", \"%rdx\");
return 0;
}
" USE_ASM_X86_64)
# make sure __int128 is defined
include(CheckTypeSize)
check_type_size(__int128 SIZEOF___INT128)
if(SIZEOF___INT128 EQUAL 16)
set(HAVE___INT128 1)
else()
# If we do not support __int128, we should be falling back
# on 32bits implementations for field and scalar.
endif()
# Detect if we are on a 32 or 64 bits plateform and chose
# scalar and filed implementation accordingly
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
# 64 bits implementationr require either __int128 or asm support.
if (HAVE___INT128 OR USE_ASM_X86_64)
set(USE_SCALAR_4X64 1)
set(USE_FIELD_5X52 1)
else()
message(SEND_ERROR "Compiler does not support __int128 or insline assembly")
endif()
else()
set(USE_SCALAR_8X32 1)
set(USE_FIELD_10X26 1)
endif()
set(ENABLE_MODULE_ECDH 0)
set(ENABLE_MODULE_MULTISET 1)
set(ENABLE_MODULE_RECOVERY 1)
set(ENABLE_MODULE_SCHNORR 1)
set(USE_ECMULT_STATIC_PRECOMPUTATION 1)
configure_file(src/libsecp256k1-config.h.cmake.in src/libsecp256k1-config.h ESCAPE_QUOTES)
configure_file (
"${CMAKE_SOURCE_DIR}/libs/config/secp256k1.cmake.in"
${CMAKE_CURRENT_BINARY_DIR}/secp256k1.cmake
@ONLY
)
## Last, actually compile our library.
add_library(secp256k1 src/secp256k1.c)
target_include_directories(secp256k1 PUBLIC include ${GMP_INCLUDE_DIR})
target_link_libraries(secp256k1 ${GMP_LIBRARY})
target_compile_definitions(secp256k1 PRIVATE HAVE_CONFIG_H SECP256K1_BUILD)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wshadow -Wno-unused-function -Wno-nonnull -Wno-overlength-strings -std=c89 -Wno-long-long")
# Default visibility is hidden on all targets.
set(CMAKE_C_VISIBILITY_PRESET hidden)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libsecp256k1.a DESTINATION lib)
install(FILES
include/secp256k1.h
include/secp256k1_multiset.h
include/secp256k1_recovery.h
include/secp256k1_schnorr.h
DESTINATION include/flowee)