xref: /aosp_15_r20/external/aws-crt-java/CMakeLists.txt (revision 3c7ae9de214676c52d19f01067dc1a404272dc11)
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