# Copyright 2005 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

LOCAL_PATH:= $(call my-dir)

minadbd_cflags := \
    -Wall -Werror \
    -DADB_HOST=0 \
    -DPLATFORM_SDK_VERSION=$(PLATFORM_SDK_VERSION)

# libminadbd (static library)
# ===============================
include $(CLEAR_VARS)
    # ../fuse_sideload.cpp \

LOCAL_SRC_FILES := \
    fuse_adb_provider.cpp \
    minadbd.cpp \
    minadbd_services.cpp \

LOCAL_MODULE := libminadbd
LOCAL_CFLAGS := $(minadbd_cflags) -Wno-unused-parameter
LOCAL_CONLY_FLAGS := -Wimplicit-function-declaration
LOCAL_CFLAGS +=  -std=gnu++2a
LOCAL_C_INCLUDES := $(LOCAL_PATH)/.. system/core/adb
#LOCAL_WHOLE_STATIC_LIBRARIES := libadbd
LOCAL_SHARED_LIBRARIES := libadbd libbase liblog libcutils libc

ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
    LOCAL_C_INCLUDES += $(LOCAL_PATH)/libmincrypt/includes
    LOCAL_SHARED_LIBRARIES += libmincrypttwrp
    LOCAL_CFLAGS += -DUSE_MINCRYPT
else
    LOCAL_SHARED_LIBRARIES += libcrypto \
    $(if $(WITH_CRYPTO_UTILS),libcrypto_utils)
    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0)
        # Needed in Android 9.0
        LOCAL_WHOLE_STATIC_LIBRARIES += libasyncio
    endif
endif

ifeq ($shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
    LOCAL_C_INCLUDES += $(LOCAL_PATH)/../fuse_sideload28/
else
    LOCAL_C_INCLUDES += $(LOCAL_PATH)/../fuse_sideload/include 
    LOCAL_SHARED_LIBRARIES += libfusesideload
endif

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
    fuse_adb_provider.cpp \
    ../fuse_sideload.cpp \
    minadbd.cpp \
    minadbd_services.cpp \

LOCAL_CLANG := true
LOCAL_MODULE := libminadbd
LOCAL_CFLAGS := $(minadbd_cflags) -Wno-unused-parameter
LOCAL_CONLY_FLAGS := -Wimplicit-function-declaration
LOCAL_CFLAGS +=  -std=gnu++2a
LOCAL_C_INCLUDES := $(LOCAL_PATH)/.. system/core/adb $(LOCAL_PATH)/otautil/include
LOCAL_SHARED_LIBRARIES := libadbd libbase liblog libcutils libc
#LOCAL_STATIC_LIBRARIES := libbase liblog libcutils libc
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../fuse_sideload/include

ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
    LOCAL_C_INCLUDES += $(LOCAL_PATH)/libmincrypt/includes
    LOCAL_SHARED_LIBRARIES += libmincrypttwrp
    LOCAL_CFLAGS += -DUSE_MINCRYPT
else
    LOCAL_SHARED_LIBRARIES += libcrypto \
    $(if $(WITH_CRYPTO_UTILS),libcrypto_utils)
    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0)
        # Needed in Android 9.0
        LOCAL_WHOLE_STATIC_LIBRARIES += libasyncio
    endif
endif

include $(BUILD_STATIC_LIBRARY)

# minadbd_test (native test)
# ===============================
# include $(CLEAR_VARS)

# LOCAL_MODULE := minadbd_test
# LOCAL_COMPATIBILITY_SUITE := device-tests
# LOCAL_SRC_FILES := fuse_adb_provider_test.cpp
# LOCAL_CFLAGS := $(minadbd_cflags)
# LOCAL_C_INCLUDES := $(LOCAL_PATH) system/core/adb
# LOCAL_STATIC_LIBRARIES := \
#     libBionicGtestMain \
#     libminadbd
# LOCAL_SHARED_LIBRARIES := \
#     liblog \
#     libbase \
#     libcutils

# include $(BUILD_NATIVE_TEST)
