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