# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

cmake_minimum_required(VERSION 3.1 FATAL_ERROR)

file(STRINGS "VERSION" VERSION_STRING)
project(AMCL VERSION "${VERSION_STRING}" LANGUAGES C)

##################################################
# Helper Macros
##################################################
macro(log var)
  message(STATUS "${var}: ${${var}}")
endmacro()

macro(set_if_unset var val)
  if(NOT ${var})
    set(${var} "${val}")
  endif()
  log(${var})
endmacro()


##################################################
# Includes
##################################################
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
include(AMCLExpand)
include(CMakeDependentOption)
include(CTest)
include(DetermineWordSize)
include(GNUInstallDirs)
include(SetOSVariable)

##################################################
# Internal settings
##################################################
message(STATUS "AMCL")
log(PROJECT_VERSION)
log(CMAKE_GENERATOR)

add_definitions(-DCMAKE)
set(AMCL_VERSION       ${PROJECT_VERSION})
set(AMCL_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(AMCL_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(AMCL_VERSION_PATCH ${PROJECT_VERSION_PATCH})

set(AMCL_SOVERSION ${AMCL_VERSION_MAJOR})

if(CMAKE_COMPILER_IS_GNUCC)
    execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
                    OUTPUT_VARIABLE GCC_VERSION)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -static-libgcc -Wall -Wextra -Wno-strict-prototypes -Wunused-value -Wcast-align -Wunused-variable -Wundef -Wformat-security")

    if (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
        set(CMAKE_C_FLAGS_ASAN    "-O0 -g3 -fsanitize=address -fsanitize=undefined -fno-sanitize-recover -fno-strict-overflow")
    else (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
        message(STATUS "GCC 4.8 required to run address sanitizer - please upgrade your installation")
    endif(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)

    set(CMAKE_C_FLAGS_RELEASE     "-O2 -fno-strict-overflow")
    set(CMAKE_C_FLAGS_DEBUG       "-O0 -g3 -fno-strict-overflow")
    set(CMAKE_C_FLAGS_COVERAGE    "-O0 -g3 -fno-strict-overflow --coverage")
    set(CMAKE_C_FLAGS_CHECK       "-O2 -Werror")
    set(CMAKE_C_FLAGS_CHECKFULL   "${CMAKE_C_FLAGS_CHECK} -Wcast-qual")
endif(CMAKE_COMPILER_IS_GNUCC)

if(CMAKE_BUILD_TYPE STREQUAL "Coverage")
    set(CMAKE_SHARED_LINKER_FLAGS "--coverage")
endif(CMAKE_BUILD_TYPE STREQUAL "Coverage")

##################################################
# Options
##################################################
### Build Type ###
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose type of build." FORCE)
endif()
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Release" "Debug" "Coverage" "ASan" "Check" "CheckFull")
log(CMAKE_BUILD_TYPE)

### Configurations ###
set_if_unset(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
set_if_unset(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
set_if_unset(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
log(CMAKE_INSTALL_PREFIX)

### Options ###
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
log(BUILD_SHARED_LIBS)

option(BUILD_BENCHMARKS  "Build benchmarks"       ON)
option(BUILD_DOCS        "Build docs"             ON)
option(BUILD_EXAMPLES    "Build examples"         ON)
cmake_dependent_option(BUILD_PYTHON "Build Python" OFF "BUILD_SHARED_LIBS" OFF)
log(BUILD_BENCHMARKS)
log(BUILD_DOCS)
log(BUILD_EXAMPLES)
log(BUILD_PYTHON)
log(BUILD_TESTING) # added by 'include(CTest)'

option(BUILD_MPIN     "Build MPIN"     ON)
option(BUILD_WCC      "Build WCC"      ON)
option(BUILD_X509     "BUild X509"     ON)
option(BUILD_BLS      "Build BLS"      ON)
option(BUILD_BLS_IETF "Build BLS_IETF" ON)
option(BUILD_PAILLIER "Build Paillier" OFF)
log(BUILD_MPIN)
log(BUILD_WCC)
log(BUILD_X509)
log(BUILD_BLS)
log(BUILD_BLS_IETF)
log(BUILD_PAILLIER)

option(DEBUG_REDUCE "Print debug message for field reduction" OFF)
option(DEBUG_NORM "Detect digit overflow" OFF)
option(GET_STATS "Debug statistics" OFF)
log(DEBUG_REDUCE)
log(DEBUG_NORM)
log(GET_STATS)

### /include subdir ###
set(INSTALL_INCLUDESUBDIR "${CMAKE_INSTALL_INCLUDEDIR}/amcl")
log(CMAKE_INSTALL_INCLUDEDIR)
log(INSTALL_INCLUDESUBDIR)

### Word/Chunk Size ###
determine_word_size(DEFAULT_WORD_SIZE)
set(WORD_SIZE ${DEFAULT_WORD_SIZE} CACHE STRING "Word length in bits. See ./include/arch.h")
set_property(CACHE WORD_SIZE PROPERTY STRINGS "16;32;64")
log(WORD_SIZE)

if(WORD_SIZE STREQUAL "")
  message(FATAL_ERROR "Must explicitly set WORD_SIZE.")
endif()

### RSA Levels ###
amcl_supported_rsa_levels(AMCL_RSA_LEVELS ${WORD_SIZE})
set(AMCL_RSA "${AMCL_RSA_LEVELS}" CACHE STRING "RSA levels of security supported. See ./include/rsa_WWW.h")
set_property(CACHE AMCL_RSA PROPERTY STRINGS ${AMCL_RSA_LEVELS})
string(REPLACE "," ";" AMCL_RSA "${AMCL_RSA}")
log(AMCL_RSA)

### Curves ###
amcl_supported_curves(AMCL_CURVE_NAMES ${WORD_SIZE})
set(AMCL_CURVE "${AMCL_CURVE_NAMES}" CACHE STRING "Choice of Field. See ./include/amcl.h")
set_property(CACHE AMCL_CURVE PROPERTY STRINGS ${AMCL_CURVE_NAMES})
string(REPLACE "," ";" AMCL_CURVE "${AMCL_CURVE}")
log(AMCL_CURVE)

### MPIN ###
if(BUILD_MPIN)
  set(AMCL_MAXPIN 10000 CACHE STRING "Maximum PIN value. See ./include/mpin_ZZZ.h for explanation.")
  set(AMCL_PBLEN 14 CACHE STRING "Maximum PIN value in bits. See ./include/mpin_ZZZ.h for explanation.")
  log(AMCL_MAXPIN)
  log(AMCL_PBLEN)
endif()

### PBC ###
if(BUILD_MPIN OR BUILD_WCC)
  set(PBC_TIME_PERMIT_TESTS 10 CACHE STRING "Number of days in the future to test M-PIN/WCC time permits")
  set(PBC_RANDOM_TESTS 5 CACHE STRING "Number of random M-PIN/WCC tests")
  log(PBC_TIME_PERMIT_TESTS)
  log(PBC_RANDOM_TESTS)
endif()

##################################################
# AMCL_Core Library
##################################################
amcl_configure_file_core(include/amcl.h.in include/amcl.h amcl_core_GEN_HDRS)
amcl_configure_file_core(include/arch.h.in include/arch.h amcl_core_GEN_HDRS)

amcl_generate_SC(SC)
amcl_generate_RSL(RSL)
amcl_configure_file_core(include/version.h.in include/version.h amcl_core_GEN_HDRS)
unset(SC)
unset(RSL)

add_library(amcl_core
  src/hash.c
  src/hmac.c
  src/hkdf.c
  src/rand.c
  src/randapi.c
  src/aes.c
  src/gcm.c
  src/oct.c
  src/utils.c
  src/version.c
)
list(APPEND AMCL_LIBRARIES amcl_core)

set_target_properties(amcl_core PROPERTIES
  EXPORT_NAME core
  VERSION ${AMCL_VERSION}
  SOVERSION ${AMCL_SOVERSION}
)

target_compile_options(amcl_core PUBLIC
  "$<$<CONFIG:DEBUG>:-DDEBUG>"
)
target_include_directories(amcl_core PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

install(TARGETS amcl_core
  EXPORT AMCLTargets
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

install(FILES
  ${amcl_core_GEN_HDRS}
  include/utils.h
  include/randapi.h
  DESTINATION ${INSTALL_INCLUDESUBDIR}
)

if (BUILD_MPIN OR BUILD_WCC OR BUILD_BLS)
  amcl_configure_file_core(include/config_test.h.in include/config_test.h amcl_core_pbc_GEN_HDRS)

  target_sources(amcl_core PRIVATE src/pbc_support.c)

  install(FILES
    ${amcl_core_pbc_GEN_HDRS}
    include/pbc_support.h
    DESTINATION ${INSTALL_INCLUDESUBDIR}
  )
endif()

if (NOT AMCL_RSA STREQUAL "")
  target_sources(amcl_core PRIVATE src/rsa_support.c)

  install(FILES
    include/rsa_support.h
    DESTINATION ${INSTALL_INCLUDESUBDIR}
  )
endif()

if (NOT AMCL_CURVE STREQUAL "")
  target_sources(amcl_core PRIVATE src/ecdh_support.c)

  install(FILES
    include/ecdh_support.h
    DESTINATION ${INSTALL_INCLUDESUBDIR}
  )
endif()

##################################################
# AMCL_X509 Library
##################################################
if(BUILD_X509)
  message(STATUS "Build libamcl_x509")
  add_library(amcl_x509
    src/x509.c
  )
  list(APPEND AMCL_LIBRARIES amcl_x509)

  set_target_properties(amcl_x509 PROPERTIES
    EXPORT_NAME x509
    VERSION ${AMCL_VERSION}
    SOVERSION ${AMCL_SOVERSION}
  )

  target_include_directories(amcl_x509 PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  )

  target_link_libraries(amcl_x509 PUBLIC
    amcl_core
  )

  install(TARGETS amcl_x509
    EXPORT AMCLTargets
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  )

  install(FILES
    include/x509.h
    DESTINATION ${INSTALL_INCLUDESUBDIR}
  )
endif()

##################################################
# AMCL_PAILLIER Library
##################################################

if(BUILD_PAILLIER)
  foreach(level 2048 4096)
    amcl_rsa_field(BD "${level}")
    amcl_rsa_field(TFF "${level}")

    amcl_configure_file_rsa(include/config_big.h.in include/config_big_${BD}.h "${level}" amcl_paillier_GEN_HDRS)
    amcl_configure_file_rsa(include/config_ff.h.in  include/config_ff_${TFF}.h "${level}" amcl_paillier_GEN_HDRS)
    amcl_configure_file_rsa(include/big.h.in        include/big_${BD}.h        "${level}" amcl_paillier_GEN_HDRS)
    amcl_configure_file_rsa(include/ff.h.in         include/ff_${TFF}.h        "${level}" amcl_paillier_GEN_HDRS)

    amcl_configure_file_rsa(src/big.c.in src/big_${BD}.c  "${level}" amcl_paillier_GEN_SRCS)
    amcl_configure_file_rsa(src/ff.c.in  src/ff_${TFF}.c  "${level}" amcl_paillier_GEN_SRCS)
  endforeach()

  list(APPEND amcl_paillier_GEN_HDRS include/paillier.h)
  list(APPEND amcl_paillier_GEN_SRCS src/paillier.c)

  message(STATUS "Build libamcl_paillier")
  add_library(amcl_paillier
    ${amcl_paillier_GEN_SRCS}
  )
  list(APPEND AMCL_LIBRARIES amcl_paillier)

  set_target_properties(amcl_paillier PROPERTIES
    EXPORT_NAME paillier
    VERSION ${AMCL_VERSION}
    SOVERSION ${AMCL_SOVERSION}
  )

  target_include_directories(amcl_paillier PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  )

  target_link_libraries(amcl_paillier PUBLIC
    amcl_core
  )

  install(TARGETS amcl_paillier
    EXPORT AMCLTargets
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  )

  install(FILES
    ${amcl_paillier_GEN_HDRS}
    DESTINATION ${INSTALL_INCLUDESUBDIR}
  )
endif()

##################################################
# AMCL_RSA_*** Libraries
##################################################
foreach(level ${AMCL_RSA})
  amcl_rsa_field(BD "${level}")
  amcl_rsa_field(TFF "${level}")

  amcl_configure_file_rsa(include/config_big.h.in include/config_big_${BD}.h "${level}" amcl_rsa_${level}_GEN_HDRS)
  amcl_configure_file_rsa(include/config_ff.h.in  include/config_ff_${TFF}.h "${level}" amcl_rsa_${level}_GEN_HDRS)
  amcl_configure_file_rsa(include/big.h.in        include/big_${BD}.h        "${level}" amcl_rsa_${level}_GEN_HDRS)
  amcl_configure_file_rsa(include/ff.h.in         include/ff_${TFF}.h        "${level}" amcl_rsa_${level}_GEN_HDRS)
  amcl_configure_file_rsa(include/rsa.h.in        include/rsa_${TFF}.h       "${level}" amcl_rsa_${level}_GEN_HDRS)

  amcl_configure_file_rsa(src/big.c.in src/big_${BD}.c  "${level}" amcl_rsa_${level}_GEN_SRCS)
  amcl_configure_file_rsa(src/ff.c.in  src/ff_${TFF}.c  "${level}" amcl_rsa_${level}_GEN_SRCS)
  amcl_configure_file_rsa(src/rsa.c.in src/rsa_${TFF}.c "${level}" amcl_rsa_${level}_GEN_SRCS)

  message(STATUS "Build libamcl_rsa_${TFF}")
  add_library(amcl_rsa_${level}
    ${amcl_rsa_${level}_GEN_SRCS}
  )
  list(APPEND AMCL_LIBRARIES amcl_rsa_${TFF})

  set_target_properties(amcl_rsa_${level} PROPERTIES
    EXPORT_NAME rsa_${level}
    VERSION ${AMCL_VERSION}
    SOVERSION ${AMCL_SOVERSION}
  )

  target_include_directories(amcl_rsa_${level} PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  )

  target_link_libraries(amcl_rsa_${level} PUBLIC
    amcl_core
  )

  install(TARGETS amcl_rsa_${level}
    EXPORT AMCLTargets
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  )

  install(FILES
    ${amcl_rsa_${level}_GEN_HDRS}
    DESTINATION ${INSTALL_INCLUDESUBDIR}
  )

endforeach()

##################################################
# AMCL_CURVE_*** Libraries
##################################################
foreach(curve ${AMCL_CURVE})
  amcl_curve_field(BD "${curve}")
  amcl_curve_field(PF "${curve}")
  amcl_curve_field(TC "${curve}")
  amcl_curve_field(TF "${curve}")

  amcl_configure_file_curve(include/big.h.in           include/big_${BD}.h           "${curve}" amcl_curve_${TC}_GEN_HDRS)
  amcl_configure_file_curve(include/config_big.h.in    include/config_big_${BD}.h    "${curve}" amcl_curve_${TC}_GEN_HDRS)
  amcl_configure_file_curve(include/config_field.h.in  include/config_field_${TF}.h  "${curve}" amcl_curve_${TC}_GEN_HDRS)
  amcl_configure_file_curve(include/config_curve.h.in  include/config_curve_${TC}.h  "${curve}" amcl_curve_${TC}_GEN_HDRS)
  amcl_configure_file_curve(include/fp.h.in            include/fp_${TF}.h            "${curve}" amcl_curve_${TC}_GEN_HDRS)
  amcl_configure_file_curve(include/ecdh.h.in          include/ecdh_${TC}.h          "${curve}" amcl_curve_${TC}_GEN_HDRS)
  amcl_configure_file_curve(include/ecp.h.in           include/ecp_${TC}.h           "${curve}" amcl_curve_${TC}_GEN_HDRS)
  if(TC STREQUAL "BLS381")
    amcl_configure_file_curve(include/hash_to_field.h.in include/hash_to_field_${TC}.h "${curve}" amcl_curve_${TC}_GEN_HDRS)
  endif()

  amcl_configure_file_curve(src/big.c.in           src/big_${BD}.c           "${curve}" amcl_curve_${TC}_GEN_SRCS)
  amcl_configure_file_curve(src/fp.c.in            src/fp_${TF}.c            "${curve}" amcl_curve_${TC}_GEN_SRCS)
  amcl_configure_file_curve(src/ecp.c.in           src/ecp_${TC}.c           "${curve}" amcl_curve_${TC}_GEN_SRCS)
  amcl_configure_file_curve(src/ecdh.c.in          src/ecdh_${TC}.c          "${curve}" amcl_curve_${TC}_GEN_SRCS)
  if(TC STREQUAL "BLS381")
    amcl_configure_file_curve(src/hash_to_field.c.in src/hash_to_field_${TC}.c "${curve}" amcl_curve_${TC}_GEN_SRCS)
  endif()

  message(STATUS "Build libamcl_curve_${TC}")
  if(TC STREQUAL "BLS381")
    add_library(amcl_curve_${TC}
      ${amcl_curve_${TC}_GEN_SRCS}
      src/rom_curve_${TC}.c
      src/rom_iso_${TC}.c
      src/rom_field_${TF}.c
    )
  else()
    add_library(amcl_curve_${TC}
      ${amcl_curve_${TC}_GEN_SRCS}
      src/rom_curve_${TC}.c
      src/rom_field_${TF}.c
    )
  endif()
  list(APPEND AMCL_LIBRARIES amcl_curve_${TC})

  set_target_properties(amcl_curve_${TC} PROPERTIES
    EXPORT_NAME curve_${TC}
    VERSION ${AMCL_VERSION}
    SOVERSION ${AMCL_SOVERSION}
  )

  target_include_directories(amcl_curve_${TC} PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  )

  target_link_libraries(amcl_curve_${TC} PUBLIC
    amcl_core
  )

  install(TARGETS amcl_curve_${TC}
    EXPORT AMCLTargets
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  )

  install(FILES
    ${amcl_curve_${TC}_GEN_HDRS}
    DESTINATION ${INSTALL_INCLUDESUBDIR}
  )
endforeach()

##################################################
# AMCL_PAIRING_*** Libraries
##################################################
foreach(curve ${AMCL_CURVE})
  amcl_curve_field(PF "${curve}")
  amcl_curve_field(TC "${curve}")
  amcl_curve_field(TF "${curve}")
  amcl_curve_field(CS "${curve}")

  if(NOT(PF STREQUAL "NOT"))
    amcl_configure_file_curve(include/fp2.h.in  include/fp2_${TF}.h  "${curve}" amcl_pairing_${TC}_GEN_HDRS)
    amcl_configure_file_curve(include/fp4.h.in  include/fp4_${TF}.h  "${curve}" amcl_pairing_${TC}_GEN_HDRS)

    amcl_configure_file_curve(src/fp2.c.in  src/fp2_${TC}.c  "${curve}" amcl_pairing_${TC}_GEN_SRCS)
    amcl_configure_file_curve(src/fp4.c.in  src/fp4_${TC}.c  "${curve}" amcl_pairing_${TC}_GEN_SRCS)

    if(CS STREQUAL "128")
      amcl_configure_file_curve(include/fp12.h.in include/fp12_${TF}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)
      amcl_configure_file_curve(include/ecp2.h.in include/ecp2_${TC}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)
      amcl_configure_file_curve(include/pair.h.in include/pair_${TC}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)

      amcl_configure_file_curve(src/fp12.c.in src/fp12_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
      amcl_configure_file_curve(src/ecp2.c.in src/ecp2_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
      amcl_configure_file_curve(src/pair.c.in src/pair_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
    elseif(CS STREQUAL "192")
      amcl_configure_file_curve(include/fp8.h.in include/fp8_${TF}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)
      amcl_configure_file_curve(include/fp24.h.in include/fp24_${TF}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)
      amcl_configure_file_curve(include/ecp4.h.in include/ecp4_${TC}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)
      amcl_configure_file_curve(include/pair192.h.in include/pair192_${TC}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)

      amcl_configure_file_curve(src/fp8.c.in src/fp8_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
      amcl_configure_file_curve(src/fp24.c.in src/fp24_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
      amcl_configure_file_curve(src/ecp4.c.in src/ecp4_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
      amcl_configure_file_curve(src/pair192.c.in src/pair192_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
    elseif(CS STREQUAL "256")
      amcl_configure_file_curve(include/fp8.h.in include/fp8_${TF}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)
      amcl_configure_file_curve(include/fp16.h.in include/fp16_${TF}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)
      amcl_configure_file_curve(include/fp48.h.in include/fp48_${TF}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)
      amcl_configure_file_curve(include/ecp8.h.in include/ecp8_${TC}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)
      amcl_configure_file_curve(include/pair256.h.in include/pair256_${TC}.h "${curve}" amcl_pairing_${TC}_GEN_HDRS)

      amcl_configure_file_curve(src/fp8.c.in src/fp8_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
      amcl_configure_file_curve(src/fp16.c.in src/fp16_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
      amcl_configure_file_curve(src/fp48.c.in src/fp48_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
      amcl_configure_file_curve(src/ecp8.c.in src/ecp8_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
      amcl_configure_file_curve(src/pair256.c.in src/pair256_${TC}.c "${curve}" amcl_pairing_${TC}_GEN_SRCS)
    endif(CS STREQUAL "128")

    message(STATUS "Build libamcl_pairing_${TC}")
    add_library(amcl_pairing_${TC}
      ${amcl_pairing_${TC}_GEN_SRCS}
    )
    list(APPEND AMCL_LIBRARIES amcl_pairing_${TC})

    set_target_properties(amcl_pairing_${TC} PROPERTIES
      EXPORT_NAME pairing_${TC}
      VERSION ${AMCL_VERSION}
      SOVERSION ${AMCL_SOVERSION}
    )

    target_include_directories(amcl_pairing_${TC} PUBLIC
      $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
      $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
    )

    target_link_libraries(amcl_pairing_${TC} PUBLIC
      amcl_curve_${TC}
    )

    install(TARGETS amcl_pairing_${TC}
      EXPORT AMCLTargets
      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    )

    install(FILES
      ${amcl_pairing_${TC}_GEN_HDRS}
      DESTINATION ${INSTALL_INCLUDESUBDIR}
    )
  endif(NOT(PF STREQUAL "NOT"))
endforeach()

##################################################
# AMCL_MPIN_*** Libraries
##################################################
if(BUILD_MPIN)
  foreach(curve ${AMCL_CURVE})
    amcl_curve_field(TC "${curve}")
    amcl_curve_field(CS "${curve}")

    if(TARGET amcl_pairing_${TC})
      if(CS STREQUAL "128")
        amcl_configure_file_curve(include/mpin.h.in include/mpin_${TC}.h "${curve}" amcl_mpin_${TC}_GEN_HDRS)
        amcl_configure_file_curve(src/mpin.c.in     src/mpin_${TC}.c     "${curve}" amcl_mpin_${TC}_GEN_SRCS)
      else(CS STREQUAL "128")
        amcl_configure_file_curve(include/mpin${CS}.h.in include/mpin${CS}_${TC}.h "${curve}" amcl_mpin_${TC}_GEN_HDRS)
        amcl_configure_file_curve(src/mpin${CS}.c.in     src/mpin${CS}_${TC}.c     "${curve}" amcl_mpin_${TC}_GEN_SRCS)
      endif(CS STREQUAL "128")

      message(STATUS "Build libamcl_mpin_${TC}")
      add_library(amcl_mpin_${TC}
        ${amcl_mpin_${TC}_GEN_SRCS}
      )
      list(APPEND AMCL_LIBRARIES amcl_mpin_${TC})

      set_target_properties(amcl_mpin_${TC} PROPERTIES
        EXPORT_NAME mpin_${TC}
        VERSION ${AMCL_VERSION}
        SOVERSION ${AMCL_SOVERSION}
      )

      target_include_directories(amcl_mpin_${TC} PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
      )

      target_link_libraries(amcl_mpin_${TC} PUBLIC
        amcl_pairing_${TC}
      )

      install(TARGETS amcl_mpin_${TC}
        EXPORT AMCLTargets
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
      )

      install(FILES
        ${amcl_mpin_${TC}_GEN_HDRS}
        DESTINATION ${INSTALL_INCLUDESUBDIR}
      )
    endif()
  endforeach()
endif()

##################################################
# AMCL_WCC_*** Libraries
##################################################
if(BUILD_WCC)
  foreach(curve ${AMCL_CURVE})
    amcl_curve_field(TC "${curve}")
    amcl_curve_field(CS "${curve}")

    if(TARGET amcl_pairing_${TC})
      if(CS STREQUAL "128")
        amcl_configure_file_curve(include/wcc.h.in include/wcc_${TC}.h "${curve}" amcl_wcc_${TC}_GEN_HDRS)
        amcl_configure_file_curve(src/wcc.c.in     src/wcc_${TC}.c     "${curve}" amcl_wcc_${TC}_GEN_SRCS)
      else(CS STREQUAL "128")
        amcl_configure_file_curve(include/wcc${CS}.h.in include/wcc${CS}_${TC}.h "${curve}" amcl_wcc_${TC}_GEN_HDRS)
        amcl_configure_file_curve(src/wcc${CS}.c.in     src/wcc${CS}_${TC}.c     "${curve}" amcl_wcc_${TC}_GEN_SRCS)
      endif(CS STREQUAL "128")

      message(STATUS "Build libamcl_wcc_${TC}")
      add_library(amcl_wcc_${TC}
        ${amcl_wcc_${TC}_GEN_SRCS}
      )
      list(APPEND AMCL_LIBRARIES amcl_wcc_${TC})

      set_target_properties(amcl_wcc_${TC} PROPERTIES
        EXPORT_NAME wcc_${TC}
        VERSION ${AMCL_VERSION}
        SOVERSION ${AMCL_SOVERSION}
      )

      target_include_directories(amcl_wcc_${TC} PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
      )

      target_link_libraries(amcl_wcc_${TC} PUBLIC
        amcl_pairing_${TC}
      )

      install(TARGETS amcl_wcc_${TC}
        EXPORT AMCLTargets
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
      )

      install(FILES
        ${amcl_wcc_${TC}_GEN_HDRS}
        DESTINATION ${INSTALL_INCLUDESUBDIR}
      )
    endif()
  endforeach()
endif()

##################################################
# AMCL_BLS_*** Libraries
##################################################
if(BUILD_BLS)
  foreach(curve ${AMCL_CURVE})
    amcl_curve_field(TC "${curve}")
    amcl_curve_field(CS "${curve}")

    if(TARGET amcl_pairing_${TC})
      if(CS STREQUAL "128")
        amcl_configure_file_curve(include/bls.h.in include/bls_${TC}.h "${curve}" amcl_bls_${TC}_GEN_HDRS)
        amcl_configure_file_curve(src/bls.c.in     src/bls_${TC}.c     "${curve}" amcl_bls_${TC}_GEN_SRCS)
      else(CS STREQUAL "128")
        amcl_configure_file_curve(include/bls${CS}.h.in include/bls${CS}_${TC}.h "${curve}" amcl_bls_${TC}_GEN_HDRS)
        amcl_configure_file_curve(src/bls${CS}.c.in     src/bls${CS}_${TC}.c     "${curve}" amcl_bls_${TC}_GEN_SRCS)
      endif(CS STREQUAL "128")

      message(STATUS "Build libamcl_bls_${TC}")
      add_library(amcl_bls_${TC}
        ${amcl_bls_${TC}_GEN_SRCS}
      )
      list(APPEND AMCL_LIBRARIES amcl_bls_${TC})

      set_target_properties(amcl_bls_${TC} PROPERTIES
        EXPORT_NAME bls_${TC}
        VERSION ${AMCL_VERSION}
        SOVERSION ${AMCL_SOVERSION}
      )

      target_include_directories(amcl_bls_${TC} PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
      )

      target_link_libraries(amcl_bls_${TC} PUBLIC
        amcl_pairing_${TC}
      )

      install(TARGETS amcl_bls_${TC}
        EXPORT AMCLTargets
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
      )

      install(FILES
        ${amcl_bls_${TC}_GEN_HDRS}
        DESTINATION ${INSTALL_INCLUDESUBDIR}
      )
    endif()
  endforeach()
endif()

##################################################
# AMCL_BLS_IETF Library
##################################################
if(BUILD_BLS_IETF)
  foreach(curve ${AMCL_CURVE})
    amcl_curve_field(TC "${curve}")
    amcl_curve_field(CS "${curve}")

    if(TC STREQUAL "BLS381")
        amcl_configure_file_curve(include/bls_ietf.h.in include/bls_ietf_${TC}.h "${curve}" amcl_bls_ietf_${TC}_GEN_HDRS)
        amcl_configure_file_curve(src/bls_ietf.c.in     src/bls_ietf_${TC}.c     "${curve}" amcl_bls_ietf_${TC}_GEN_SRCS)

      message(STATUS "Build libamcl_bls_ietf_${TC}")
      add_library(amcl_bls_ietf_${TC}
        ${amcl_bls_ietf_${TC}_GEN_SRCS}
      )
      list(APPEND AMCL_LIBRARIES amcl_bls_ietf_${TC})

      set_target_properties(amcl_bls_ietf_${TC} PROPERTIES
        EXPORT_NAME bls_ietf_${TC}
        VERSION ${AMCL_VERSION}
        SOVERSION ${AMCL_SOVERSION}
      )

      target_include_directories(amcl_bls_ietf_${TC} PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
      )

      target_link_libraries(amcl_bls_ietf_${TC} PUBLIC
        amcl_pairing_${TC}
      )

      install(TARGETS amcl_bls_ietf_${TC}
        EXPORT AMCLTargets
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
      )

      install(FILES
        ${amcl_bls_ietf_${TC}_GEN_HDRS}
        DESTINATION ${INSTALL_INCLUDESUBDIR}
      )
    endif(TC STREQUAL "BLS381")
  endforeach()
endif()

##################################################
# pkgconfig
##################################################
foreach(lib ${AMCL_LIBRARIES})
  set(AMCL_PRIVATE_LIBS "${AMCL_PRIVATE_LIBS} -l${lib}")
endforeach()
configure_file(amcl.pc.in amcl.pc @ONLY)
install(FILES
  ${CMAKE_CURRENT_BINARY_DIR}/amcl.pc
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)

##################################################
# CMake export
##################################################
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/amcl)

install(EXPORT AMCLTargets
  FILE AMCLTargets.cmake
  NAMESPACE AMCL::
  DESTINATION ${INSTALL_CONFIGDIR}
)

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
  ${CMAKE_CURRENT_BINARY_DIR}/AMCLConfigVersion.cmake
  VERSION ${AMCL_VERSION}
  COMPATIBILITY SameMajorVersion
)

configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/AMCLConfig.cmake.in
  ${CMAKE_CURRENT_BINARY_DIR}/AMCLConfig.cmake
  INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
)

install(FILES
  ${CMAKE_CURRENT_BINARY_DIR}/AMCLConfig.cmake
  ${CMAKE_CURRENT_BINARY_DIR}/AMCLConfigVersion.cmake
  DESTINATION ${INSTALL_CONFIGDIR}
)

##################################################
# Uninstall Target
##################################################
configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
    IMMEDIATE @ONLY)

add_custom_target(uninstall
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)

##################################################
# Add subdirectories
##################################################
if(BUILD_BENCHMARKS)
  message(STATUS "Build benchmarks")
  add_subdirectory(benchmark)
endif()

if(BUILD_DOCS)
  message(STATUS "Build docs")
  add_subdirectory(doc)
endif()

if(BUILD_EXAMPLES)
  message(STATUS "Build examples")
  add_subdirectory(examples)
endif()

if(BUILD_PYTHON)
  if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "ASan")
    message(STATUS "Build Python wrappers")
    add_subdirectory(python)
  endif()
endif()

if(BUILD_TESTING)
  message(STATUS "Build tests")
  add_subdirectory(test)
endif()

include(CPackConfig.cmake)
