1function(add_aidl_library NAME LANG AIDLROOT SOURCES AIDLFLAGS)
2    if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20")
3        cmake_policy(SET CMP0116 NEW)
4    endif()
5
6    # Strip trailing slash
7    get_filename_component(AIDLROOT_TRAILING "${AIDLROOT}" NAME)
8    if ("${AIDLROOT_TRAILING}" STREQUAL "")
9        get_filename_component(AIDLROOT "${AIDLROOT}foo" DIRECTORY)
10    endif()
11
12    set(GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/.intermediates/${NAME}-source")
13    set(GEN_SOURCES)
14    foreach (SOURCE ${SOURCES})
15        set(SOURCE_FULL ${AIDLROOT}/${SOURCE})
16        get_filename_component(SOURCE_WLE ${SOURCE} NAME_WLE)
17        get_filename_component(SOURCE_SUBDIR ${SOURCE} DIRECTORY)
18        set(GEN_SOURCE "${GEN_DIR}/${SOURCE_SUBDIR}/${SOURCE_WLE}.cpp")
19
20        file(READ "${SOURCE}" SOURCE_CONTENTS)
21        string(FIND "${SOURCE_CONTENTS}" "@VintfStability" VINTF_MATCH)
22        set(STABILITY_FLAG)
23        if (${VINTF_MATCH} GREATER_EQUAL 0)
24            set(STABILITY_FLAG --stability vintf)
25        endif()
26
27        set(DEPFILE_ARG)
28        if (NOT ${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
29            set(DEPFILE_ARG DEPFILE "${GEN_SOURCE}.d")
30        endif()
31
32        add_custom_command(
33            OUTPUT "${GEN_SOURCE}"
34            MAIN_DEPENDENCY "${SOURCE_FULL}"
35            ${DEPFILE_ARG}
36            COMMAND "${AIDL_BIN}"
37            ARGS
38            --lang=${LANG}
39            --include="${AIDLROOT}"
40            --dep="${GEN_SOURCE}.d"
41            --out="${GEN_DIR}"
42            --header_out="${GEN_DIR}/include"
43            --ninja
44            --structured
45            --min_sdk_version=current
46            ${STABILITY_FLAG}
47            ${AIDLFLAGS}
48            "${SOURCE_FULL}"
49        )
50        list(APPEND GEN_SOURCES "${GEN_SOURCE}")
51    endforeach()
52
53    add_library(${NAME} ${GEN_SOURCES})
54
55    target_include_directories(${NAME}
56        PUBLIC
57        "${GEN_DIR}/include"
58    )
59
60    if (${LANG} MATCHES "ndk")
61        set(BINDER_LIB_NAME "libbinder_ndk_sdk")
62    else()
63        set(BINDER_LIB_NAME "libbinder_sdk")
64    endif()
65    target_link_libraries(${NAME}
66        ${BINDER_LIB_NAME}
67    )
68endfunction()
69