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