blob: 39236c9727f029bff021532a6cefe10087b93970 [file] [log] [blame]
set(BLUETOOTH_EMULATION True)
get_filename_component(AOSP "${CMAKE_CURRENT_LIST_DIR}/../../.." ABSOLUTE)
set(EXTERNAL ${AOSP}/external)
set(EXTERNAL_QEMU ${EXTERNAL}/qemu)
set(ANDROID_QEMU2_TOP_DIR ${EXTERNAL_QEMU})
if(NOT Python_EXECUTABLE)
find_package(Python3 COMPONENTS Interpreter)
if(NOT Python3_FOUND)
message(FATAL_ERROR "A python interpreter is required. ")
endif()
set(Python_EXECUTABLE ${Python3_EXECUTABLE})
endif()
message(STATUS "Using Python: ${Python_EXECUTABLE}")
if(NOT DEFINED ANDROID_TARGET_TAG)
message(
WARNING
"You should invoke the cmake generator with a proper toolchain from ${EXTERNAL_QEMU}/android/build/cmake, "
"Trying to infer toolchain, this might not work.")
list(APPEND CMAKE_MODULE_PATH "${EXTERNAL_QEMU}/android/build/cmake/")
include(toolchain)
_get_host_tag(TAG)
toolchain_configure_tags(${TAG})
endif()
include(android)
include(prebuilts)
# Append the given flags to the existing CMAKE_C_FLAGS. Be careful as these
# flags are global and used for every target! Note this will not do anything
# under vs for now
function(add_c_flag FLGS)
foreach(FLAG ${FLGS})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}" PARENT_SCOPE)
endforeach()
endfunction()
function(add_cxx_flag FLGS)
foreach(FLAG ${FLGS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}" PARENT_SCOPE)
endforeach()
endfunction()
if(WINDOWS_MSVC_X86_64)
add_cxx_flag("-std:c++17")
else()
add_cxx_flag("-std=c++17")
endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions("-DANDROID_DEBUG")
if(NOT WINDOWS_MSVC_X86_64)
add_c_flag("-O0 -g3")
else()
add_c_flag("-Zi -Od")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CROSSCOMPILE)
if(NOT OPTION_ASAN AND OPTION_ASAN_IN_DEBUG)
set(OPTION_ASAN address)
endif()
if(OPTION_ASAN STREQUAL "thread" AND OPTION_COVERAGE_IN_DEBUG)
message(FATAL_ERROR "You cannot run tsan with code coverage enabled.")
endif()
if(NOT WINDOWS_MSVC_X86_64 AND OPTION_COVERAGE_IN_DEBUG)
message("Enabling code coverage")
# Build an instrumented version of the code that generates coverage
# mapping to enable code coverage analysis
set(ANDROID_CODE_COVERAGE TRUE)
add_c_flag("-fcoverage-mapping")
add_c_flag("-fprofile-instr-generate")
add_c_flag("-fprofile-arcs")
add_c_flag("-ftest-coverage")
add_c_flag("--coverage")
endif()
endif()
else()
set(CMAKE_INSTALL_DO_STRIP TRUE)
add_definitions("-DNDEBUG=1")
if(WINDOWS_MSVC_X86_64)
# clang-cl takes msvc based parameters, so -O3 is a nop
add_c_flag("-O2")
else()
add_c_flag("-O3 -g3")
endif()
endif()
# Target specific configurations that we do not want to do in the
# toolchain.cmake Toolchain variables seem to be overwritten pending your cmake
# version.
if(LINUX_X86_64)
add_c_flag("-Werror")
add_c_flag("-Wno-deprecated-declarations") # Protobuf generates deprecation
# warnings for deprecated enums
# And the asm type if we are compiling with yasm
set(ANDROID_NASM_TYPE elf64)
# This should make sure we have sufficient information left to properly print
# std::string etc. see b/156534499 for details.
add_c_flag("-fno-limit-debug-info")
elseif(LINUX_AARCH64)
set(ANDROID_NASM_TYPE elf64)
add_c_flag("-fpermissive")
elseif(WINDOWS_MSVC_X86_64)
# And the asm type if we are compiling with yasm
set(ANDROID_NASM_TYPE win64)
set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
elseif(DARWIN_X86_64 OR DARWIN_AARCH64)
# And the asm type if we are compiling with yasm
set(ANDROID_NASM_TYPE macho64)
# Always consider the source to be darwin.
add_definitions(-D_DARWIN_C_SOURCE=1)
add_c_flag("-Wno-everything")
else()
message(FATAL_ERROR "Unknown target!")
endif()
prebuilt(Threads)
# We need the auto generated header for some components, so let's set the
# ANDROID_HW_CONFIG_H variable to point to the generated header. Those that need
# it can add it to their sources list, and it will be there.
set(HW_PROPERTIES_INI
${EXTERNAL_QEMU}/android/emu/avd/src/android/avd/hardware-properties.ini)
android_generate_hw_config()
if(DARWIN_AARCH64 AND NOT Rust_COMPILER)
message(
STATUS
"On Apple sillicon attempting to use platform toolchain if available.")
list(APPEND CMAKE_MODULE_PATH
"${EXTERNAL_QEMU}/android/build/cmake/corrosion/cmake/")
find_package(Rust REQUIRED)
if(TARGET Rust::Rustc)
set(OPTION_ENABLE_SYSTEM_RUST TRUE)
else()
message(STATUS "Unable to derive local toolchain")
message(
FATAL_ERROR
"If you are a developer you can install rust with `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`"
)
endif()
endif()
if(WINDOWS_MSVC_X86_64)
# Set of msvc compat layer libraries.
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/mman-win32 mman-win32)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/regex-win32 regex-win32)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/dirent-win32
dirent-win32)
endif()
if(Rust_COMPILER OR OPTION_ENABLE_SYSTEM_RUST)
if(OPTION_ENABLE_SYSTEM_RUST)
message(STATUS "Attempting to use the system rust compiler")
use_system_rust_toolchain()
endif()
enable_vendorized_crates("${EXTERNAL_QEMU}/android/third_party/rust/crates")
add_subdirectory(${EXTERNAL_QEMU}/android/build/cmake/corrosion corrosion)
ensure_rust_version_is_compliant()
endif()
set(_gRPC_RE2_INCLUDE_DIR "${EXTERNAL_QEMU}/android/third_party/re2")
set(_gRPC_RE2_LIBRARIES re2)
set(NETSIM_EXT TRUE)
# Let's bin place everything in the root, with the shared libs in the right
# place
set(DBG_INFO ${CMAKE_BINARY_DIR}/build/debug_info)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib64)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/archives)
set(CMAKE_PDB_OUTPUT_DIRECTORY ${DBG_INFO})
# Feeling courageous? Set this to $ANDROID_SDK_ROOT
if(DARWIN_X86_64 OR DARWIN_AARCH64)
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/distribution/emulator)
set(CMAKE_INSTALL_CODESIGN ${CMAKE_BINARY_DIR}/distribution/_codesign)
else()
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/distribution/emulator)
endif()
# First make the protobuf and dependencies available to gRPC
add_subdirectory(${EXTERNAL}/qemu/android/third_party/protobuf protobuf)
add_subdirectory(${AOSP}/hardware/google/aemu/base aemu-base)
add_subdirectory(${AOSP}/hardware/google/aemu/host-common host-common)
add_subdirectory(${AOSP}/packages/modules/Bluetooth/tools/rootcanal rootcanal)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/abseil-cpp abseil-cpp)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/boringssl boringssl)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/google-benchmark
google-benchmark)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/hostapd hostapd)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/libslirp libslirp)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/googletest/ gtest)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/lz4 lz4)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/re2 re2)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/libselinux libselinux)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/libsparse libsparse)
add_subdirectory(${EXTERNAL_QEMU}/android/third_party/ext4_utils ext4_utils)
add_subdirectory(${EXTERNAL}/cares cares)
add_subdirectory(${EXTERNAL}/glib/glib glib2)
add_subdirectory(${EXTERNAL}/grpc/emulator grpc)
add_subdirectory(${EXTERNAL}/qemu/android/android-emu-base android-emu-base)
add_subdirectory(${EXTERNAL}/qemu/android/android-net/android android-emu-net)
add_subdirectory(${EXTERNAL}/qemu/android-qemu2-glue/netsim
android-wifi-service)
add_subdirectory(${EXTERNAL}/qemu/android/emu/base emu-base)
add_subdirectory(${EXTERNAL}/qemu/android/emu/utils android-emu-utils)
add_subdirectory(${EXTERNAL}/qemu/android/emu/files android-emu-files)
add_subdirectory(${EXTERNAL}/qemu/android/emu/agents android-emu-agents)
add_subdirectory(${EXTERNAL}/qemu/android/emu/proxy android-emu-proxy)
add_subdirectory(${EXTERNAL}/webrtc/third_party/jsoncpp jsoncpp)
# Short term fix for missing glib2 dll for Windows build
if(WINDOWS_MSVC_X86_64)
install(TARGETS glib2_${ANDROID_TARGET_TAG} RUNTIME DESTINATION .
LIBRARY DESTINATION .)
endif()
if(NOT TARGET gfxstream-snapshot.headers)
# Fake dependency to satisfy linker
add_library(gfxstream-snapshot.headers INTERFACE)
endif()
if(CMAKE_BUILD_TYPE MATCHES DEBUG)
# This will help you find issues.
set(CMAKE_C_FLAGS "-fsanitize=address -fno-omit-frame-pointer -g3 -O0")
set(CMAKE_EXE_LINKER_FLAGS "-fsanitize=address")
endif()
if(LINUX_X86_64)
# Our linux headers are from 2013, and do not define newer socket options.
# (b/156635589)
target_compile_options(grpc PRIVATE -DSO_REUSEPORT=15)
target_compile_options(grpc_unsecure PRIVATE -DSO_REUSEPORT=15)
endif()
# Testing
enable_testing()
include(GoogleTest)