# 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} -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")
    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")
    set(CMAKE_C_FLAGS_DEBUG       "-O0 -g3")
    set(CMAKE_C_FLAGS_COVERAGE    "-O0 -g3 --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)
log(BUILD_MPIN)
log(BUILD_WCC)
log(BUILD_X509)
log(BUILD_BLS)

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/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_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_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)

  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)

  message(STATUS "Build libamcl_curve_${TC}")
  add_library(amcl_curve_${TC}
    ${amcl_curve_${TC}_GEN_SRCS}
    src/rom_curve_${TC}.c
    src/rom_field_${TF}.c
  )
  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()

##################################################
# 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)
  message(STATUS "Build Python wrappers")
  add_subdirectory(wrappers/python)
endif()

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

include(CPackConfig.cmake)
