Skip to content

Commit 53f037e

Browse files
committed
Added build support for Android platforms
1 parent 7e43c5d commit 53f037e

17 files changed

+543
-54
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
# build directory
1212
build*/
13+
# extern directory
14+
extern/*
1315

1416
# CMake
1517
CMakeCache.txt

CMakeLists.txt

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,49 @@
1-
cmake_minimum_required(VERSION 3.12)
2-
project(OTExtension LANGUAGES CXX)
3-
4-
if (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
5-
message(FATAL_ERROR "ENCRYPTO_utils require at least g++-8")
1+
cmake_minimum_required(VERSION 3.13)
2+
list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules")
3+
include(OTExtensionCacheVariables)
4+
if(ANDROID)
5+
set(CMAKE_CXX_STANDARD 14)
6+
else()
7+
set(CMAKE_CXX_STANDARD 17)
68
endif()
7-
8-
option(OTEXTENSION_BUILD_EXE "Build executables" OFF)
9-
10-
find_package(ENCRYPTO_utils QUIET)
11-
if(ENCRYPTO_utils_FOUND)
12-
message(STATUS "Found ENCRYPTO_utils")
13-
elseif(NOT ENCRYPTO_utils_FOUND AND NOT TARGET ENCRYPTO_utils::encrypto_utils)
14-
message("ENCRYPTO_utils was not found: add ENCRYPTO_utils subdirectory")
15-
if(NOT EXISTS "${PROJECT_SOURCE_DIR}/extern/ENCRYPTO_utils/CMakeLists.txt")
16-
find_package(Git REQUIRED)
17-
message("initialize Git submodule: extern/ENCRYPTO_utils")
18-
execute_process(COMMAND git submodule update --init extern/ENCRYPTO_utils
19-
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
20-
endif()
21-
add_subdirectory(extern/ENCRYPTO_utils)
9+
project(OTExtension LANGUAGES C CXX)
10+
11+
if(ANDROID)
12+
if(ANDROID_ARM_NEON)
13+
set(OTExtension_INSTALL_PREFIX "platforms/${ANDROID_PLATFORM}/arch-${ANDROID_SYSROOT_ABI}/NEON")
14+
else(ANDROID_ARM_NEON)
15+
set(OTExtension_INSTALL_PREFIX "platforms/${ANDROID_PLATFORM}/arch-${ANDROID_SYSROOT_ABI}")
16+
endif(ANDROID_ARM_NEON)
17+
set(OTExtension_INSTALL_INCLUDE "${OTExtension_INSTALL_PREFIX}/include")
18+
set(OTExtension_INSTALL_LIB "${OTExtension_INSTALL_PREFIX}/lib")
19+
set(OTExtension_INSTALL_ARCHIVE "${OTExtension_INSTALL_PREFIX}/lib")
20+
set(OTExtension_INSTALL_CONFIG "")
21+
else(ANDROID)
22+
set(OTExtension_INSTALL_PREFIX "")
23+
set(OTExtension_INSTALL_INCLUDE "include")
24+
set(OTExtension_INSTALL_LIB "lib")
25+
set(OTExtension_INSTALL_ARCHIVE "lib")
26+
set(OTExtension_INSTALL_CONFIG "")
27+
endif(ANDROID)
28+
29+
if(ANDROID AND CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
30+
set(CMAKE_INSTALL_PREFIX "${ANDROID_NDK}/usr/local"
31+
CACHE PATH "Default install directory for android builds." FORCE)
2232
endif()
33+
34+
include(AddRelic)
35+
include(AddENCRYPTO_utils)
2336
find_package(Threads REQUIRED)
2437

2538

26-
add_library(otextension
39+
add_library(otextension ${OTExtension_LIBRARY_TYPE}
2740
ot/alsz-ot-ext-rec.cpp
2841
ot/alsz-ot-ext-snd.cpp
29-
# ot/asharov-lindell.cpp
3042
ot/iknp-ot-ext-rec.cpp
3143
ot/iknp-ot-ext-snd.cpp
3244
ot/kk-ot-ext-rec.cpp
3345
ot/kk-ot-ext-snd.cpp
3446
ot/naor-pinkas.cpp
35-
# ot/naor-pinkas_noro.cpp
3647
ot/nnob-ot-ext-rec.cpp
3748
ot/nnob-ot-ext-snd.cpp
3849
ot/ot-ext.cpp
@@ -41,55 +52,44 @@ add_library(otextension
4152
ot/pvwddh.cpp
4253
ot/simpleot.cpp
4354
)
55+
set_target_properties(otextension PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
56+
4457
add_library(OTExtension::otextension ALIAS otextension)
4558

46-
target_compile_features(otextension PUBLIC cxx_std_17)
4759
target_compile_options(otextension PRIVATE "-Wall" "-Wextra")
48-
#target_compile_options(otextension PUBLIC "-fno-omit-frame-pointer" "-fsanitize=address")
49-
#target_link_options(otextension PUBLIC "-fno-omit-frame-pointer" "-fsanitize=address")
5060

5161
target_include_directories(otextension
5262
PUBLIC
53-
$<INSTALL_INTERFACE:include>
63+
$<INSTALL_INTERFACE:${OTExtension_INSTALL_INCLUDE}>
5464
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
5565
)
5666

5767

5868
target_link_libraries(otextension
5969
PUBLIC ENCRYPTO_utils::encrypto_utils
70+
PUBLIC Relic::relic
6071
PUBLIC Threads::Threads
6172
)
6273

6374

75+
include(InstallConfig)
76+
install_config(OTExtension_INSTALL_LOCATION "OTExtension" OTExtension::otextension)
77+
6478
install(TARGETS otextension
6579
EXPORT "${PROJECT_NAME}Targets"
66-
ARCHIVE DESTINATION lib
67-
LIBRARY DESTINATION lib
68-
INCLUDES DESTINATION lib
69-
)
80+
ARCHIVE DESTINATION "${OTExtension_INSTALL_ARCHIVE}"
81+
LIBRARY DESTINATION "${OTExtension_INSTALL_LIB}"
82+
INCLUDES DESTINATION "${OTExtension_INSTALL_INCLUDE}")
7083
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/ot"
71-
DESTINATION include
72-
FILES_MATCHING PATTERN "*.h"
73-
)
74-
export(TARGETS otextension NAMESPACE "${PROJECT_NAME}::" FILE "${PROJECT_NAME}Targets.cmake")
84+
DESTINATION "${OTExtension_INSTALL_INCLUDE}"
85+
FILES_MATCHING REGEX ".*\\.h(pp|h)?$" REGEX ".*cmake.*" EXCLUDE)
86+
export(TARGETS otextension ${OTExtension_DEPENDENCIES_TO_EXPORT}
87+
NAMESPACE "${PROJECT_NAME}::"
88+
FILE "${PROJECT_NAME}Targets.cmake")
7589
install(EXPORT "${PROJECT_NAME}Targets"
7690
NAMESPACE "${PROJECT_NAME}::"
77-
DESTINATION "lib/cmake/${PROJECT_NAME}"
78-
)
79-
80-
81-
include(CMakePackageConfigHelpers)
82-
83-
configure_package_config_file("${CMAKE_CURRENT_LIST_DIR}/cmake/${PROJECT_NAME}Config.cmake.in"
84-
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
85-
INSTALL_DESTINATION "lib/cmake/${PROJECT_NAME}"
86-
)
87-
88-
install(FILES
89-
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
90-
DESTINATION "lib/cmake/${PROJECT_NAME}"
91-
)
91+
DESTINATION "${OTExtension_INSTALL_LOCATION}")
9292

93-
if(OTEXTENSION_BUILD_EXE)
93+
if(OTExtension_BUILD_EXE)
9494
add_subdirectory(mains)
95-
endif(OTEXTENSION_BUILD_EXE)
95+
endif(OTExtension_BUILD_EXE)

cmake/BoostConfig.cmake.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
get_filename_component(Boost_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
2+
3+
if(NOT TARGET Boost::boost)
4+
include("${Boost_CMAKE_DIR}/BoostTargets.cmake")
5+
endif()

cmake/ForwardConfig.cmake.in

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
include(CMakeFindDependencyMacro)
2+
set(DEPENDENCY_NAME "@DEPENDENCY_NAME@")
3+
if(ANDROID AND ANDROID_ARM_NEON)
4+
set(PREFIX "${DEPENDENCY_NAME}-${ANDROID_PLATFORM}-${ANDROID_SYSROOT_ABI}-NEON")
5+
elseif(ANDROID AND NOT ANDROID_ARM_NEON)
6+
set(PREFIX "${DEPENDENCY_NAME}-${ANDROID_PLATFORM}-${ANDROID_SYSROOT_ABI}")
7+
else()
8+
set(PREFIX "${DEPENDENCY_NAME}")
9+
endif()
10+
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${PREFIX}/${PREFIX}Config.cmake")
11+
include("${CMAKE_CURRENT_LIST_DIR}/${PREFIX}/${PREFIX}Config.cmake")
12+
else()
13+
set(${DEPENDENCY_NAME}_FOUND FALSE)
14+
endif()
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
set(TARGETS "@DEPENDENCY_TARGETS@")
3+
function(import_into_android_studio IMPORT_LOCATION)
4+
if(ANDROID AND EXISTS "${IMPORT_LOCATION}")
5+
foreach(target ${TARGETS})
6+
get_target_property(library_type ${target} TYPE)
7+
if("${library_type}" STREQUAL "SHARED_LIBRARY")
8+
get_target_property(lib_location ${target} LOCATION)
9+
file(COPY "${lib_location}" DESTINATION "${IMPORT_LOCATION}")
10+
endif()
11+
endforeach()
12+
endif()
13+
endfunction()
14+
15+
if(NOT IMPORT_LOCATION)
16+
import_into_android_studio("${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}")
17+
else()
18+
import_into_android_studio("${IMPORT_LOCATION}")
19+
endif()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
cmake_minimum_required(VERSION 3.13)
2+
3+
if(NOT TARGET ENCRYPTO_utils::encrypto_utils)
4+
if(NOT ENCRYPTO_utils_LIBRARY_TYPE)
5+
set(ENCRYPTO_utils_LIBRARY_TYPE ${OTExtension_LIBRARY_TYPE})
6+
endif()
7+
file(GLOB ENCRYPTO_utils_FILE_LIST "${PROJECT_SOURCE_DIR}/extern/ENCRYPTO_utils/*")
8+
list(LENGTH ENCRYPTO_utils_FILE_LIST ENCRYPTO_utils_NUM_FILES)
9+
#if ENCRYPTO_utils directory is empty
10+
if(ENCRYPTO_utils_NUM_FILES EQUAL 0)
11+
message(STATUS "ENCRYPTO_utils was not found. Fetching ENCRYPTO_utils...")
12+
include(FetchENCRYPTO_utils)
13+
else()
14+
message(STATUS "ENCRYPTO_utils was found in: ${PROJECT_SOURCE_DIR}/extern/ENCRYPTO_utils")
15+
set(ENCRYPTO_utils_SOURCE "${PROJECT_SOURCE_DIR}/extern/ENCRYPTO_utils"
16+
CACHE PATH
17+
"Path to ENCRYPTO_utils source."
18+
FORCE
19+
)
20+
include(FetchENCRYPTO_utils)
21+
endif()
22+
endif()

cmake/Modules/AddRelic.cmake

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
cmake_minimum_required(VERSION 3.13)
2+
3+
find_package(Relic QUIET)
4+
if(Relic_FOUND OR TARGET Relic::relic)
5+
message(STATUS "Found Relic.")
6+
elseif(NOT Relic_FOUND AND NOT TARGET Relic::relic)
7+
if("${Relic_SOURCE}" STREQUAL "")
8+
file(GLOB Relic_FILE_LIST "${PROJECT_SOURCE_DIR}/extern/Relic/*")
9+
list(LENGTH Relic_FILE_LIST Relic_NUM_FILES)
10+
#if Relic directory is empty
11+
if(Relic_NUM_FILES EQUAL 0)
12+
message(STATUS "Relic was not found. Fetching Relic...")
13+
else()
14+
message(STATUS "Relic was found in: ${PROJECT_SOURCE_DIR}/extern/Relic")
15+
set(Relic_SOURCE "${PROJECT_SOURCE_DIR}/extern/Relic")
16+
endif()
17+
endif()
18+
include(FetchRelic)
19+
if(ANDROID AND Relic_LIBRARY_TYPE STREQUAL "SHARED")
20+
set(CMAKE_SHARED_LINKER_FLAGS ${TMP})
21+
endif()
22+
include(ExternalBuildHelper)
23+
install_imported_library(Relic::relic "Relic")
24+
endif()
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
set(ANDROID_NDK CACHE PATH "Path to Android NDK.")
2+
set(ANDROID_NATIVE_API_LEVEL CACHE STRING "Android API level to compile for. Acceptable values are: [0-9]+ or android-[0-9]+")
3+
set(ANDROID_PLATFORM CACHE STRING "Alternative way to set Android API level. Acceptable values are: latest or android-[0-9]+")
4+
set(ANDROID_TOOLCHAIN_FILE CACHE PATH "Android toolchain file.")
5+
set(ANDROID_ABI CACHE STRING "Target CPU of android device, like e.g. \"armeabi-v7a\".")
6+
set_property(CACHE ANDROID_ABI PROPERTY STRINGS
7+
"armeabi-v7a"
8+
"armeabi-v7a with NEON"
9+
"arm64-v8a"
10+
"x86"
11+
"x86_64"
12+
)
13+
14+
#Check if user wants to build for Android
15+
if(NOT "${CMAKE_ANDROID_NDK}" STREQUAL "")
16+
set(ANDROID_NDK "${CMAKE_ANDROID_NDK}")
17+
endif()
18+
if(NOT "${ANDROID_NDK}" STREQUAL "")
19+
set(ANDROID ON)
20+
elseif(NOT "${ANDROID_TOOLCHAIN_FILE}" STREQUAL "" AND EXISTS "${ANDROID_TOOLCHAIN_FILE}")
21+
set(ANDROID ON)
22+
elseif(NOT "${CMAKE_TOOLCHAIN_FILE}" STREQUAL "" AND EXISTS "${CMAKE_TOOLCHAIN_FILE}")
23+
set(ANDROID ON)
24+
endif()
25+
26+
#Set CMAKE_TOOLCHAIN_FILE and CMAKE_INSTALL_PREFIX for Android builds
27+
if(ANDROID)
28+
#CMAKE_TOOLCHAIN_FILE was not set, but ANDROID_TOOLCHAIN_FILE was set
29+
if("${CMAKE_TOOLCHAIN_FILE}" STREQUAL "" AND NOT "${ANDROID_TOOLCHAIN_FILE}" STREQUAL "")
30+
set(CMAKE_TOOLCHAIN_FILE "${ANDROID_TOOLCHAIN_FILE}")
31+
#Neither toolchain file was set, use toolchain in NDK
32+
elseif("${CMAKE_TOOLCHAIN_FILE}" STREQUAL "" AND "${ANDROID_TOOLCHAIN_FILE}" STREQUAL "")
33+
set(CMAKE_TOOLCHAIN_FILE "${ANDROID_NDK}/build/cmake/android.toolchain.cmake")
34+
else()
35+
set(ANDROID_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}")
36+
endif()
37+
if(NOT EXISTS "${CMAKE_TOOLCHAIN_FILE}")
38+
message(FATAL_ERROR
39+
"Could not find file: ${CMAKE_TOOLCHAIN_FILE}. Your NDK might be outdated."
40+
)
41+
endif()
42+
if(NOT CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
43+
set(CMAKE_INSTALL_PREFIX "${ANDROID_NDK}" CACHE PATH "Default install directory for android builds." FORCE)
44+
endif()
45+
endif(ANDROID)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
cmake_minimum_required(VERSION 3.13)
2+
3+
include(FetchHelper)
4+
fetch_helper(ENCRYPTO_utils)

cmake/Modules/FetchHelper.cmake

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
cmake_minimum_required(VERSION 3.13)
2+
macro(fetch_helper content_name)
3+
string(TOLOWER "${content_name}" LOWER_CASE_${content_name})
4+
if(NOT "${DEPENDENCY_DIR}" STREQUAL "")
5+
set(${content_name}_DOWNLOAD_DIR_COMMAND DOWNLOAD_DIR ${DEPENDENCY_DIR})
6+
else()
7+
set(${content_name}_DOWNLOAD_DIR_COMMAND "")
8+
endif()
9+
if(NOT "${${content_name}_SOURCE}" STREQUAL "")
10+
set(${content_name}_DOWNLOAD_COMMAND1 URL ${${content_name}_SOURCE})
11+
set(${content_name}_DOWNLOAD_COMMAND2 "")
12+
else()
13+
set(${content_name}_DOWNLOAD_COMMAND1 GIT_REPOSITORY ${${content_name}_REPOSITORY})
14+
set(${content_name}_DOWNLOAD_COMMAND2 GIT_TAG ${${content_name}_TAG})
15+
endif()
16+
include(FetchContent)
17+
FetchContent_Declare(${content_name}
18+
${${content_name}_DOWNLOAD_COMMAND1}
19+
${${content_name}_DOWNLOAD_COMMAND2}
20+
${${content_name}_DOWNLOAD_DIR_COMMAND}
21+
)
22+
FetchContent_GetProperties(${content_name})
23+
if(NOT ${LOWER_CASE_${content_name}}_POPULATED)
24+
FetchContent_Populate(${content_name})
25+
if(NOT "${ARGV1}" STREQUAL "")
26+
message(STATUS "Applying patches to ${content_name}...")
27+
include("Patch${content_name}")
28+
endif()
29+
if(NOT "${ARGV2}" STREQUAL "")
30+
add_subdirectory(
31+
${${LOWER_CASE_${content_name}}_SOURCE_DIR}
32+
${${LOWER_CASE_${content_name}}_BINARY_DIR}
33+
EXCLUDE_FROM_ALL
34+
)
35+
else()
36+
add_subdirectory(
37+
${${LOWER_CASE_${content_name}}_SOURCE_DIR}
38+
${${LOWER_CASE_${content_name}}_BINARY_DIR}
39+
)
40+
endif()
41+
endif()
42+
endmacro()

0 commit comments

Comments
 (0)