1cmake_minimum_required(VERSION 3.1) 2 3project(aws-crt-jni C) 4option(BUILD_DEPS "Builds aws common runtime dependencies as part of build" ON) 5 6if (POLICY CMP0069) 7 cmake_policy(SET CMP0069 NEW) # Enable LTO/IPO if available in the compiler, see AwsCFlags 8endif() 9 10if (POLICY CMP0077) 11 cmake_policy(SET CMP0077 NEW) # Enable options to get their values from normal variables 12endif() 13 14if (DEFINED CMAKE_PREFIX_PATH) 15 file(TO_CMAKE_PATH "${CMAKE_PREFIX_PATH}" CMAKE_PREFIX_PATH) 16endif() 17 18if (DEFINED CMAKE_INSTALL_PREFIX) 19 file(TO_CMAKE_PATH "${CMAKE_INSTALL_PREFIX}" CMAKE_INSTALL_PREFIX) 20endif() 21 22if (UNIX AND NOT APPLE) 23 include(GNUInstallDirs) 24elseif(NOT DEFINED CMAKE_INSTALL_LIBDIR) 25 set(CMAKE_INSTALL_LIBDIR "lib") 26endif() 27 28if (${CMAKE_INSTALL_LIBDIR} STREQUAL "lib64") 29 set(FIND_LIBRARY_USE_LIB64_PATHS true) 30endif() 31 32if (NOT WIN32 AND NOT CMAKE_BUILD_TYPE) 33 set(CMAKE_BUILD_TYPE "RelWithDebInfo") 34endif() 35 36message(STATUS "CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") 37 38# This is required in order to append /lib/cmake to each element in CMAKE_PREFIX_PATH 39set(AWS_MODULE_DIR "/${CMAKE_INSTALL_LIBDIR}/cmake") 40string(REPLACE ";" "${AWS_MODULE_DIR};" AWS_MODULE_PATH "${CMAKE_PREFIX_PATH}${AWS_MODULE_DIR}") 41# Append that generated list to the module search path 42list(APPEND CMAKE_MODULE_PATH ${AWS_MODULE_PATH}) 43 44# Local CMake scripts 45list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") 46 47set(AWS_LIBRARY_OUTPUT_DIR "${CMAKE_BINARY_DIR}/lib") 48 49if (ANDROID) 50 set(ANDROID_DEPS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/target/cmake-build/deps/${ANDROID_ABI}) 51 set(AWS_LIBRARY_OUTPUT_DIR "${CMAKE_BINARY_DIR}/../../../lib") 52endif() 53 54if (BUILD_DEPS) 55 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/crt/aws-c-common/cmake") 56 include(AwsFindPackage) 57 58 set(IN_SOURCE_BUILD ON) 59 set(BUILD_TESTING OFF) 60 add_subdirectory(crt/aws-c-common) 61 if (UNIX AND NOT APPLE) 62 set(BUILD_LIBSSL OFF CACHE BOOL "Don't need libssl, only need libcrypto") 63 set(DISABLE_PERL ON CACHE BOOL "Disable codegen") 64 set(DISABLE_GO ON CACHE BOOL "Disable codegen") 65 66 # temporarily disable certain warnings as errors for the aws-lc build 67 set(OLD_CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") 68 if (NOT MSVC) 69 check_c_compiler_flag(-Wno-stringop-overflow HAS_WNO_STRINGOP_OVERFLOW) 70 if (HAS_WNO_STRINGOP_OVERFLOW) 71 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-stringop-overflow") 72 endif() 73 74 check_c_compiler_flag(-Wno-array-parameter HAS_WNO_ARRAY_PARAMETER) 75 if (HAS_WNO_ARRAY_PARAMETER) 76 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-array-parameter") 77 endif() 78 endif() 79 80 add_subdirectory(crt/aws-lc) 81 82 # restore previous build flags 83 set(CMAKE_C_FLAGS "${OLD_CMAKE_C_FLAGS}") 84 85 set(SEARCH_LIBCRYPTO OFF CACHE BOOL "Let S2N use libcrypto from AWS-LC.") 86 set(UNSAFE_TREAT_WARNINGS_AS_ERRORS OFF CACHE BOOL "Disable warnings-as-errors when building S2N") 87 add_subdirectory(crt/s2n) 88 endif() 89 add_subdirectory(crt/aws-c-sdkutils) 90 add_subdirectory(crt/aws-c-io) 91 add_subdirectory(crt/aws-c-cal) 92 add_subdirectory(crt/aws-c-compression) 93 add_subdirectory(crt/aws-c-http) 94 add_subdirectory(crt/aws-c-auth) 95 add_subdirectory(crt/aws-c-mqtt) 96 add_subdirectory(crt/aws-checksums) 97 add_subdirectory(crt/aws-c-event-stream) 98 add_subdirectory(crt/aws-c-s3) 99else() 100 include(AwsFindPackage) 101 include(AwsCFlags) 102 set(IN_SOURCE_BUILD OFF) 103endif() 104 105include(UseJava) 106include(AwsPlatformDetect) 107include(AwsSharedLibSetup) 108include(AwsCRuntime) 109 110aws_determine_local_c_runtime(AWS_C_RUNTIME) 111 112file(GLOB AWS_CRT_JAVA_HEADERS 113 "include/aws/jni/*.h" 114 ) 115 116file(GLOB AWS_CRT_JAVA_SRC 117 "src/native/*.c" 118 ) 119 120if (WIN32) 121 file(GLOB AWS_CRT_JAVA_OS_SRC 122 "src/native/windows/*.c" 123 ) 124 125 if (MSVC) 126 source_group("Header Files\\aws\\jni" FILES ${AWS_CRT_JAVA_HEADERS}) 127 source_group("Source Files" FILES ${AWS_CRT_JAVA_SRC}) 128 source_group("Source Files\\windows" FILES ${AWS_CRT_JAVA_OS_SRC}) 129 endif () 130 131elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") 132 file(GLOB AWS_CRT_JAVA_OS_SRC 133 "src/native/linux/*.c" 134 "src/native/posix/*.c" 135 ) 136elseif (APPLE) 137 file(GLOB AWS_CRT_JAVA_OS_SRC 138 "src/native/bsd/*.c" 139 "src/native/posix/*.c" 140 "src/native/darwin/*.c" 141 ) 142 143elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR CMAKE_SYSTEM_NAME STREQUAL "NetBSD") 144 file(GLOB AWS_CRT_JAVA_OS_SRC 145 "src/native/bsd/*.c" 146 "src/native/posix/*.c" 147 ) 148endif() 149 150file(GLOB CRT_JAVA_HEADERS 151 ${AWS_CRT_JAVA_HEADERS} 152 ) 153 154file(GLOB CRT_JAVA_SRC 155 ${AWS_CRT_JAVA_SRC} 156 ${AWS_CRT_JAVA_OS_SRC} 157 ) 158 159# figure out the target platform info and output the lib there 160aws_detect_target_platform(TARGET_OS TARGET_ARCH) 161message(STATUS "Compiling for ${TARGET_OS}-${TARGET_ARCH}") 162set(TARGET_LIB_DIR "${AWS_LIBRARY_OUTPUT_DIR}/${TARGET_OS}/${TARGET_ARCH}/${AWS_C_RUNTIME}") 163 164# shared lib that contains the CRT and JNI bindings, to be loaded by java 165add_library(${PROJECT_NAME} SHARED ${CRT_JAVA_HEADERS} ${CRT_JAVA_SRC}) 166aws_use_package(aws-c-http) 167aws_use_package(aws-c-mqtt) 168aws_use_package(aws-c-auth) 169aws_use_package(aws-c-event-stream) 170aws_use_package(aws-c-s3) 171 172target_link_libraries(${PROJECT_NAME} ${DEP_AWS_LIBS}) 173if (NOT MSVC AND NOT APPLE) 174 set_property(TARGET ${PROJECT_NAME} APPEND_STRING PROPERTY LINK_FLAGS " -z noexecstack") 175endif() 176 177set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C) 178# for non-msvc, library output will control the shared lib output 179set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${TARGET_LIB_DIR}) 180# for msvc, runtime controls where dlls are output 181set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TARGET_LIB_DIR}) 182set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${TARGET_LIB_DIR}) 183set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE ${TARGET_LIB_DIR}) 184set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${TARGET_LIB_DIR}) 185 186aws_set_common_properties(${PROJECT_NAME}) 187 188set(CMAKE_C_FLAGS_DEBUGOPT "") 189set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 99) 190 191#set warnings 192if (MSVC) 193 target_compile_options(${PROJECT_NAME} PRIVATE /W4 /WX -D_CRT_SECURE_NO_WARNINGS) 194else () 195 target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wno-long-long -pedantic -Werror) 196endif () 197 198# find JNI and add the include path (except on android where gradle injects it) 199if (NOT ANDROID) 200 if (NOT APPLE) 201 set(JAVA_AWT_LIBRARY NotNeeded) 202 set(JAVA_AWT_INCLUDE_PATH NotNeeded) 203 endif() 204 if (DEFINED ENV{OVERRIDE_JAVA_HOME}) 205 # This override might be set by builder to avoid using the JAVA_HOME modified by gradle 206 file(TO_CMAKE_PATH "$ENV{OVERRIDE_JAVA_HOME}" OVERRIDE_JAVA_HOME) 207 set(JAVA_HOME "${OVERRIDE_JAVA_HOME}") 208 message(STATUS "Overriding JAVA_HOME to ${OVERRIDE_JAVA_HOME}") 209 endif() 210 message(STATUS "JAVA_HOME=$ENV{JAVA_HOME}") 211 find_package(JNI REQUIRED) 212 target_include_directories(${PROJECT_NAME} PRIVATE ${JNI_INCLUDE_DIRS}) 213endif() 214 215target_include_directories(${PROJECT_NAME} PRIVATE "src/native") 216 217if (CMAKE_BUILD_TYPE STREQUAL "" OR CMAKE_BUILD_TYPE MATCHES Debug) 218 target_compile_definitions(${PROJECT_NAME} PRIVATE "-DDEBUG_BUILD") 219endif () 220 221target_include_directories(${PROJECT_NAME} PUBLIC 222 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> 223 $<INSTALL_INTERFACE:include>) 224 225aws_split_debug_info(${PROJECT_NAME}) 226