# Copyright (c) 2026 Jakub Juszczakiewicz
# All rights reserved.

cmake_minimum_required(VERSION 3.5...3.15)
project(kit-bigints C ASM)

set(WITH_TESTS TRUE CACHE BOOL true)

include_directories(
  include
)

include(CheckSourceCompiles)

set(HEADER_FILES include/kitbigints/version.h)
set(SOURCE_FILES src/version.c)

include (TestBigEndian)
TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
if(IS_BIG_ENDIAN)
 add_definitions(-DBIG_ENDIAN)
else()
 add_definitions(-DLITTLE_ENDIAN)
endif()

if(MINGW)
add_definitions(-DUSE_WINAPI)
add_definitions(-DIS_MINGW)
set(WINDOWS True CACHE BOOL "Window OS")
elseif(WIN32)
add_definitions(-DUSE_WINAPI)
set(WINDOWS True CACHE BOOL "Window OS")
else()
set(WINDOWS False CACHE BOOL "Window OS")
endif()

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  add_definitions(-DSIZE_T_BITS=64)
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
  add_definitions(-DSIZE_T_BITS=32)
else()
  message(FATAL_ERROR "Unsupported architecture")
endif()
check_type_size(__int128 INT_128)
if (HAVE_INT_128)
  add_definitions(-DHAVE_INT_128=1)
endif()

set(ALG_NASM False CACHE BOOL "Add support for assembler code compiled by nasm")
if (ALG_NASM)
  enable_language(ASM_NASM)
endif()

set(ALG_ARCH "C" CACHE STRING "Compile architecture specific code")

list(APPEND HEADER_FILES include/kitbigints/bigint.h)
include(src/CMakeLists.txt)

set(BUILD_STATIC True CACHE BOOL "Build static library")
set(BUILD_SHARED True CACHE BOOL "Build shared library")

if (BUILD_STATIC)
if (NOT BUILD_SHARED)
add_library(kitbigints_static STATIC ${SOURCE_FILES})
set_property(TARGET kitbigints_static PROPERTY C_STANDARD 23)
endif()
endif()

if (BUILD_SHARED)
if (BUILD_STATIC)
add_library(kitbigints_obj OBJECT ${SOURCE_FILES})
set_property(TARGET kitbigints_obj PROPERTY C_STANDARD 23)
set_property(TARGET kitbigints_obj PROPERTY POSITION_INDEPENDENT_CODE 1)
add_library(kitbigints SHARED $<TARGET_OBJECTS:kitbigints_obj>)
add_library(kitbigints_static STATIC $<TARGET_OBJECTS:kitbigints_obj>)
install(TARGETS kitbigints_static LIBRARY DESTINATION lib)
set_target_properties(kitbigints_static PROPERTIES OUTPUT_NAME kitbigints)
else()
add_library(kitbigints SHARED ${SOURCE_FILES})
set_property(TARGET kitbigints PROPERTY C_STANDARD 23)
endif()
install(TARGETS kitbigints LIBRARY DESTINATION lib)
endif()

install(FILES ${HEADER_FILES} DESTINATION include/kitbigints)

if (${WITH_TESTS})
  include(CTest)
  add_subdirectory(tests)
endif()
