Commit a59d1045 authored by Johan Pascal's avatar Johan Pascal

cmake script

parent c811f780
############################################################################
# CMakeLists.txt
#
# Released under the MIT License. See LICENSE.txt for license information.
#
############################################################################
cmake_minimum_required(VERSION 3.0)
project(DECAF VERSION 0.9.4 LANGUAGES C CXX)
set(DECAF_SO_VERSION "0")
option(ENABLE_SHARED "Build shared library." ON)
option(ENABLE_STATIC "Build static library." ON)
option(ENABLE_STRICT "Build with strict compile options." YES)
option(ENABLE_TESTS "Enable compilation of tests." YES)
if(NOT CPACK_GENERATOR AND NOT CMAKE_INSTALL_RPATH AND CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR})
message(STATUS "Setting install rpath to ${CMAKE_INSTALL_RPATH}")
endif()
include(GNUInstallDirs)
include(CheckSymbolExists)
include(CMakePushCheckState)
include_directories(
src/GENERATED/include/
src/include/
src/
${CMAKE_CURRENT_BINARY_DIR}
)
set(STRICT_OPTIONS_CPP )
set(STRICT_OPTIONS_C )
set(STRICT_OPTIONS_CXX )
if(MSVC)
if(ENABLE_STRICT)
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} /WX")
endif()
else()
set(STRICT_OPTIONS_CXX "${STRICT_OPTIONS_CXX} -std=c++11 -O2 ")
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-missing-field-initializers ")
set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -std=c99 -O2 -Wstrict-prototypes -Wno-error=strict-prototypes -ffunction-sections -fdata-sections -fvisibility=hidden -fomit-frame-pointer ")
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Qunused-arguments -Wno-array-bounds ")
endif()
if(APPLE)
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-error=unknown-warning-option -Qunused-arguments -Wno-tautological-compare -Wno-unused-function -Wno-array-bounds ")
set(STRICT_OPTIONS_CXX "${STRICT_OPTIONS_CXX} -stdlib=libc++ ")
endif()
if(ENABLE_STRICT)
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Werror -Wextra -Wno-unused-parameter -fno-strict-aliasing ")
endif()
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${STRICT_OPTIONS_C}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${STRICT_OPTIONS_CXX}")
add_subdirectory(src)
if(ENABLE_TESTS)
enable_testing()
add_subdirectory(test)
endif()
include(CMakePackageConfigHelpers)
export(EXPORT ${EXPORT_TARGETS_NAME}Targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/DecafTargets.cmake"
)
configure_file(cmake/DecafConfig.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/DecafConfig.cmake"
@ONLY
)
set(ConfigPackageLocation share/decaf/cmake)
install(EXPORT ${EXPORT_TARGETS_NAME}Targets
FILE DecafTargets.cmake
DESTINATION ${ConfigPackageLocation}
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/DecafConfig.cmake"
DESTINATION ${ConfigPackageLocation}
)
# CPack settings
set(CPACK_PACKAGE_NAME "decaf")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_SOURCE_GENERATOR "TGZ")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
set(CPACK_SOURCE_IGNORE_FILES
"^${CMAKE_BINARY_DIR}"
"/\\\\..+"
)
include(CPack)
############################################################################
# decafConfig.cmake
# Copyright (C) 2017 Belledonne Communications, Grenoble France
#
############################################################################
#
# 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 2
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
############################################################################
#
# Config file for the decaf package.
# It defines the following variables:
#
# DECAF_FOUND - system has decaf
# DECAF_INCLUDE_DIRS - the decaf include directory
# DECAF_LIBRARIES - The libraries needed to use decaf
# DECAF_CPPFLAGS - The compilation flags needed to use decaf
if(@ENABLE_SHARED@)
set(DECAF_TARGETNAME decaf)
set(DECAF_LIBRARIES ${DECAF_TARGETNAME})
else()
set(DECAF_TARGETNAME decaf-static)
if(TARGET ${DECAF_TARGETNAME})
get_target_property(DECAF_LIBRARIES ${DECAF_TARGETNAME} LOCATION)
get_target_property(DECAF_LINK_LIBRARIES ${DECAF_TARGETNAME} INTERFACE_LINK_LIBRARIES)
if(DECAF_LINK_LIBRARIES)
list(APPEND DECAF_LIBRARIES ${DECAF_LINK_LIBRARIES})
endif()
endif()
endif()
get_target_property(DECAF_INCLUDE_DIRS ${DECAF_TARGETNAME} INTERFACE_INCLUDE_DIRECTORIES)
list(INSERT DECAF_INCLUDE_DIRS 0 "@CMAKE_INSTALL_FULL_INCLUDEDIR@")
list(REMOVE_DUPLICATES DECAF_INCLUDE_DIRS)
set(DECAF_CPPFLAGS @DECAF_CPPFLAGS@)
set(DECAF_FOUND 1)
############################################################################
# CMakeLists.txt
#
# Released under the MIT License. See LICENSE.txt for license information.
#
############################################################################
set(DECAF_HEADER_FILES
include/constant_time.h
include/field.h
include/keccak_internal.h
include/portable_endian.h
include/word.h
)
set(DECAF_SOURCE_FILES_C
utils.c
shake.c
sha512.c
spongerng.c
)
# default target arch is arch_32 which shall be generic enough to compile mostly on anything
# target arch dirs:
# global one to get the include/arch_intrinsics.h
# availables: arch_32, arch_arm_32, arch_neon, arch_ref64, arch_x86_64
set(TARGET_ARCH_DIR arch_32)
# specific to p25519, to get f_impl.c/h in p25519
#availables: arch_32, arch_ref64, arch_x86_64
set(TARGET_ARCH_DIR_P25519 arch_32)
# specific to p448, to get f_impl.c/h in p448
# availables: arch_32, arch_arm_32, arch_neon, arch_ref64, arch_x86_64
set(TARGET_ARCH_DIR_P448 arch_32)
if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") # x86_64
message("Target architecture is x86_64")
set(TARGET_ARCH_DIR arch_x86_64)
set(TARGET_ARCH_DIR_P25519 arch_x86_64)
set(TARGET_ARCH_DIR_P448 arch_x86_64)
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arch64") # shall be arm64 bits, stick to ref64
message("Target architecture is 64 bits general purpose(arm64 shall use this)")
set(TARGET_ARCH_DIR arch_ref64)
set(TARGET_ARCH_DIR_P25519 arch_ref64)
set(TARGET_ARCH_DIR_P448 arch_ref64)
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") # is an arm 32 bits, TODO: detect neon features?
message("Target architecture is arm32 no NEON")
set(TARGET_ARCH_DIR arch_arm_32)
set(TARGET_ARCH_DIR_P25519 arch_32) # nothing specific for arm32 on p25519
set(TARGET_ARCH_DIR_P448 arch_arm_32)
else() # nothing picked yet, stick to the
message("Target architecture is general purpose 32bits")
endif()
include_directories(
${PROJECT_SOURCE_DIR}/src/include/${TARGET_ARCH_DIR}
)
set(DECAF_SOURCE_FILES_CXX
)
add_subdirectory(GENERATED/c/p25519)
add_subdirectory(GENERATED/c/p448)
add_subdirectory(GENERATED/c/curve25519)
add_subdirectory(GENERATED/c/ed448goldilocks)
if(ENABLE_STATIC)
add_library(decaf-static STATIC ${DECAF_HEADER_FILES} ${DECAF_SOURCE_FILES_C} ${DECAF_SOURCE_FILES_CXX} $<TARGET_OBJECTS:p25519> $<TARGET_OBJECTS:p448> $<TARGET_OBJECTS:CURVE25519> $<TARGET_OBJECTS:CURVE448>)
set_target_properties(decaf-static PROPERTIES OUTPUT_NAME decaf)
target_include_directories(decaf-static PUBLIC)
target_link_libraries(decaf-static INTERFACE)
endif()
if(ENABLE_SHARED)
add_library(decaf SHARED ${DECAF_HEADER_FILES} ${DECAF_SOURCE_FILES_C} ${DECAF_SOURCE_FILES_CXX} $<TARGET_OBJECTS:p25519> $<TARGET_OBJECTS:p448> $<TARGET_OBJECTS:CURVE25519> $<TARGET_OBJECTS:CURVE448>)
if(APPLE)
set_target_properties(decaf PROPERTIES LINK_FLAGS "-stdlib=libc++")
endif()
set_target_properties(decaf PROPERTIES VERSION ${DECAF_SO_VERSION})
target_include_directories(decaf PUBLIC)
target_link_libraries(decaf PRIVATE)
if(MSVC)
if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/decaf.pdb
DESTINATION ${CMAKE_INSTALL_BINDIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
endif()
endif()
endif()
if(ENABLE_STATIC)
install(TARGETS decaf-static EXPORT ${EXPORT_TARGETS_NAME}Targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
endif()
if(ENABLE_SHARED)
install(TARGETS decaf EXPORT ${EXPORT_TARGETS_NAME}Targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
endif()
install(DIRECTORY GENERATED/include/
DESTINATION include/decaf
FILES_MATCHING PATTERN "*.h*"
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)
############################################################################
# CMakeLists.txt
#
# Released under the MIT License. See LICENSE.txt for license information.
#
############################################################################
include_directories(
${PROJECT_SOURCE_DIR}/src/p25519
${PROJECT_SOURCE_DIR}/src/GENERATED/c/p25519
)
include_directories(
${PROJECT_SOURCE_DIR}/src/p25519/${TARGET_ARCH_DIR_P25519}
)
set(CURVE25519_SOURCE_FILES_C
decaf.c
elligator.c
scalar.c
eddsa.c
decaf_tables.c
)
add_library(CURVE25519 OBJECT ${CURVE25519_SOURCE_FILES_C})
set_target_properties(CURVE25519 PROPERTIES POSITION_INDEPENDENT_CODE True)
############################################################################
# CMakeLists.txt
#
# Released under the MIT License. See LICENSE.txt for license information.
#
############################################################################
include_directories(
${PROJECT_SOURCE_DIR}/src/p448
${PROJECT_SOURCE_DIR}/src/GENERATED/c/p448
)
include_directories(
${PROJECT_SOURCE_DIR}/src/p448/${TARGET_ARCH_DIR_P448}
)
set(CURVE448_SOURCE_FILES_C
decaf.c
elligator.c
scalar.c
eddsa.c
decaf_tables.c
)
add_library(CURVE448 OBJECT ${CURVE448_SOURCE_FILES_C})
set_target_properties(CURVE448 PROPERTIES POSITION_INDEPENDENT_CODE True)
############################################################################
# CMakeLists.txt
#
# Released under the MIT License. See LICENSE.txt for license information.
#
############################################################################
include_directories(
${PROJECT_SOURCE_DIR}/src/p25519
${PROJECT_SOURCE_DIR}/src/GENERATED/c/p25519
)
include_directories(
${PROJECT_SOURCE_DIR}/src/p25519/${TARGET_ARCH_DIR_P25519}
)
set(P25519_HEADER_FILES
f_field.h
${PROJECT_SOURCE_DIR}/src/p25519/${TARGET_ARCH_DIR_P25519}/f_impl.h
)
set(P25519_SOURCE_FILES_C
${PROJECT_SOURCE_DIR}/src/p25519/${TARGET_ARCH_DIR_P25519}/f_impl.c
${PROJECT_SOURCE_DIR}/src/p25519/f_arithmetic.c
f_generic.c
)
add_library(p25519 OBJECT ${P25519_HEADER_FILES} ${P25519_SOURCE_FILES_C})
set_target_properties(p25519 PROPERTIES POSITION_INDEPENDENT_CODE True)
############################################################################
# CMakeLists.txt
#
# Released under the MIT License. See LICENSE.txt for license information.
#
############################################################################
include_directories(
${PROJECT_SOURCE_DIR}/src/p448
${PROJECT_SOURCE_DIR}/src/GENERATED/c/p448
)
include_directories(
${PROJECT_SOURCE_DIR}/src/p448/${TARGET_ARCH_DIR_P448}
)
set(P448_HEADER_FILES
f_field.h
${PROJECT_SOURCE_DIR}/src/p448/${TARGET_ARCH_DIR_P448}/f_impl.h
)
set(P448_SOURCE_FILES_C
${PROJECT_SOURCE_DIR}/src/p448/${TARGET_ARCH_DIR_P448}/f_impl.c
${PROJECT_SOURCE_DIR}/src/p448/f_arithmetic.c
f_generic.c
)
add_library(p448 OBJECT ${P448_HEADER_FILES} ${P448_SOURCE_FILES_C})
set_target_properties(p448 PROPERTIES POSITION_INDEPENDENT_CODE True)
############################################################################
# CMakeLists.txt
#
# Released under the MIT License. See LICENSE.txt for license information.
#
############################################################################
if(ENABLE_SHARED)
set(DECAF_LIBRARIES_FOR_TESTER decaf)
else()
set(DECAF_LIBRARIES_FOR_TESTER decaf-static)
endif()
add_executable(decaf_tester test_decaf.cxx)
set_target_properties(decaf_tester PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(decaf_tester ${DECAF_LIBRARIES_FOR_TESTER})
add_executable(ristretto_tester ristretto.cxx)
set_target_properties(ristretto_tester PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(ristretto_tester ${DECAF_LIBRARIES_FOR_TESTER})
add_executable(shakesum_tester shakesum.c)
set_target_properties(shakesum_tester PROPERTIES LINKER_LANGUAGE C)
target_link_libraries(shakesum_tester ${DECAF_LIBRARIES_FOR_TESTER})
add_executable(bench bench_decaf.cxx)
set_target_properties(bench PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(bench ${DECAF_LIBRARIES_FOR_TESTER})
add_test(NAME decaf COMMAND decaf_tester)
add_test(NAME bench COMMAND bench)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment