1cmake_minimum_required(VERSION 3.18)
2
3include(CMake/Version.cmake)
4
5include(GoogleTest)
6enable_testing()
7# Disable test discovery after build.
8# By default, `gtest_discover_tests()` add a post-build step to run test executables in order to
9# discover the test targets. This is problematic in some build environments. (for example: if
10# cross-compiling)
11set(CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE "PRE_TEST")
12
13option(BUILD_SHARED_LIBS "Build using shared libraries" OFF)
14
15if (AEMU_COMMON_GEN_PKGCONFIG)
16   set(LOGGING_LIB_NAME aemu-logging)
17   set(SNAPSHOT_LIB_NAME aemu-snapshot)
18else()
19   set(LOGGING_LIB_NAME logging-base)
20   set(SNAPSHOT_LIB_NAME gfxstream-snapshot)
21endif()
22
23project(AEMUCommon
24        DESCRIPTION "Android emulation utilities library"
25        VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
26        LANGUAGES CXX C)
27
28set(AEMU_COMMON_REPO_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
29
30if(NOT ANGLE_REPO_ROOT)
31    set(ANGLE_REPO_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../../external/angle)
32endif()
33
34option(AEMU_COMMON_GEN_PKGCONFIG
35       "Generate install files used by pkg-config."
36       OFF)
37option(ENABLE_CLANG_THREAD_SAFETY_CHECKS
38       "Enable clang thread-safety checks (-Wthread-safety)."
39       OFF)
40option(AEMU_COMMON_USE_PERFETTO "Use perfotto for tracing." OFF)
41option(AEMU_BASE_USE_LZ4 "The lz4 dependency is provided, and compile the compressing stream." OFF)
42
43if (WIN32)
44    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
45else()
46    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3 -O3")
47endif()
48set(CMAKE_POSITION_INDEPENDENT_CODE ON)
49set(CMAKE_CXX_STANDARD 17)
50set(CMAKE_C_STANDARD 11)
51
52if (MSVC)
53    # ask msvc not to warn not secure C ISO functions
54    add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
55    # ask msvc not to warn non C ISO POSIX functions
56    add_compile_definitions(_CRT_NONSTDC_NO_DEPRECATE)
57
58    add_subdirectory(windows)
59endif()
60
61# Set AEMU_BUILD_CONFIG_NAME to use a custom cmake build script located in
62# build-config/$AEMU_BUILD_CONFIG_NAME. If AEMU_BUILD_CONFIG_NAME is unset,
63# it will default to building everything. See build-config/gfxstream/CMakeLists.txt
64# for an example.
65if (NOT ${AEMU_COMMON_BUILD_CONFIG} STREQUAL "")
66    if (NOT EXISTS "${AEMU_COMMON_REPO_ROOT}/build-config/${AEMU_COMMON_BUILD_CONFIG}")
67        message(FATAL_ERROR "build-config/${AEMU_COMMON_BUILD_CONFIG} does not exist")
68    endif()
69    message(STATUS "aemu-common: Using custom build script in \
70${AEMU_COMMON_REPO_ROOT}/build-config/${AEMU_COMMON_BUILD_CONFIG}")
71    add_subdirectory(build-config/${AEMU_COMMON_BUILD_CONFIG})
72endif()
73
74set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-extern-c-compat -Wno-return-type-c-linkage -D_FILE_OFFSET_BITS=64")
75
76add_subdirectory(base)
77add_subdirectory(snapshot)
78add_subdirectory(host-common)
79add_subdirectory(third-party)
80
81
82add_library(aemu_common INTERFACE)
83target_link_libraries(
84    aemu_common
85    INTERFACE
86    aemu-base
87    aemu-base.headers
88    aemu-host-common
89    aemu-host-common.headers)
90
91if(AEMU_COMMON_GEN_PKGCONFIG)
92    include(GNUInstallDirs)
93    set(INSTALL_PC_FILES
94        aemu_base
95        aemu_logging
96        aemu_host_common
97        aemu_snapshot)
98    if(ENABLE_VKCEREAL_TESTS)
99        list(APPEND INSTALL_PC_FILES aemu_base_testing_support aemu_host_common_testing_support)
100    endif()
101    foreach(PC_FILE IN LISTS INSTALL_PC_FILES)
102        configure_file(CMake/${PC_FILE}.pc.in ${PC_FILE}.pc @ONLY)
103        install(
104            FILES "${CMAKE_CURRENT_BINARY_DIR}/${PC_FILE}.pc"
105            DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
106    endforeach()
107
108    install(DIRECTORY base/include/aemu DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
109    install(DIRECTORY snapshot/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/aemu/snapshot)
110    install(DIRECTORY host-common/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/aemu/host-common)
111    install(DIRECTORY third-party/cuda/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/aemu/host-common)
112    set(INSTALL_TARGETS
113        aemu-base
114        aemu-host-common
115        ${SNAPSHOT_LIB_NAME}
116        ${LOGGING_LIB_NAME})
117    if(ENABLE_VKCEREAL_TESTS)
118        list(APPEND INSTALL_TARGETS aemu-base-testing-support aemu-host-common-testing-support)
119    endif()
120    install(TARGETS ${INSTALL_TARGETS}
121            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
122            INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
123endif()
124