# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.22.1)

# enable_language(ASM)

set(CMAKE_CXX_STANDARD 17)

# set(CMAKE_ANDROID_ARM_MODE ON) # breakpad
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections -Wformat-security ")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
# SET_TARGET_PROPERTIES(microphoto PROPERTIES LINK_FLAGS "-Wl,-s,--gc-sections")

IF (CMAKE_BUILD_TYPE STREQUAL Debug)
    ADD_DEFINITIONS(-D_DEBUG)
ELSE()
    ADD_DEFINITIONS(-DNDEBUG)
ENDIF()
# add_definitions(-DBOOST_EXCEPTION_DISABLE)
# add_definitions(-DBOOST_NO_EXCEPTIONS)
add_definitions(-DTERMINAL_CLIENT)
add_definitions(-DKEEP_FRAME_TYPE_ON_REVERSE)
add_definitions(-DBOOST_ALL_NO_LIB)
add_definitions(-DASIO_STANDALONE)
add_definitions(-DUSING_XY_EXTENSION)
# add_definitions(-DUSING_BREAK_PAD)
add_definitions(-DSQLITE_THREADSAFE=1)
add_definitions(-DHAVE_STRING_H) # for memcpy in md5.c
add_definitions(-DUSING_NRSEC)
# add_definitions(-DUSING_DOWSE)

# set(OpenCV_DIR D:/Workspace/deps/OpenCV-android-sdk/sdk/native/jni/)
set(OPENCV_EXTRA_MODULES_PATH D:/Workspace/Github/opencv_contrib/modules)

# include_directories(${OpenCV_DIR}/include)
# add_library( lib_opencv SHARED IMPORTED )
# set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${OpenCV_DIR}/../libs/${ANDROID_ABI}/libopencv_java4.so)

# Declares and names the project.

project("microphoto")

# message(FATAL_ERROR "OpenCV ${OpenCV_DIR}")

find_package(OpenCV REQUIRED core imgproc highgui)
if(OpenCV_FOUND)
    include_directories(${OpenCV_INCLUDE_DIRS})
    message(WARNING "OpenCV library status:")
    message(WARNING "    version: ${OpenCV_VERSION}")
    message(WARNING "    libraries: ${OpenCV_LIBS}")
    message(WARNING "    include path: ${OpenCV_INCLUDE_DIRS}")
else(OpenCV_FOUND)
    message(FATAL_ERROR "OpenCV library not found")
endif(OpenCV_FOUND)

# libzip
# set(libzip_DIR ${LIBZIP_ROOT}/${ANDROID_ABI}/lib/cmake/libzip)
# find_package(libzip REQUIRED)

# ncnn
set(ncnn_DIR ${NCNN_ROOT}/${ANDROID_ABI}/lib/cmake/ncnn)
find_package(ncnn REQUIRED)

# include(mars/src/CMakeUtils.txt)

SET(YAMC_INC_DIR ${CMAKE_SOURCE_DIR})

# SET(TERM_CORE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../xymp/Core)
#SET(TERM_CORE_ROOT D:/Workspace/xymp/Core)

SET(JSONCPP_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp)
SET(JSONCPP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp/include)

SET(SQLITE_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sqlite)
SET(SQLITE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sqlite)

SET(BREAKPAD_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/breakpad)

SET(CAMERA2_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/camera2)

SET(FREETYPE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/freetype)

# SET(EVPP_SRC_DIR ${EVPP_ROOT}/evpp)

include_directories(${YAMC_INC_DIR})
include_directories(${BREAKPAD_ROOT} ${BREAKPAD_ROOT}/common/android/include)
include_directories(${ASIO_ROOT}/include)

add_library( # Sets the name of the library.
        sqlite3

        # Sets the library as a shared library.
        STATIC

        # Provides a relative path to your source file(s).
        ${SQLITE_SRC_DIR}/sqlite3.c
        )

INCLUDE_DIRECTORIES(${SQLITE_INCLUDE_DIR})

file(GLOB BREAKPAD_SOURCES_COMMON
        native-lib.cpp
        ${BREAKPAD_ROOT}/client/linux/crash_generation/crash_generation_client.cc
        ${BREAKPAD_ROOT}/client/linux/dump_writer_common/thread_info.cc
        ${BREAKPAD_ROOT}/client/linux/dump_writer_common/ucontext_reader.cc
        ${BREAKPAD_ROOT}/client/linux/handler/exception_handler.cc
        ${BREAKPAD_ROOT}/client/linux/handler/minidump_descriptor.cc
        ${BREAKPAD_ROOT}/client/linux/log/log.cc
        ${BREAKPAD_ROOT}/client/linux/microdump_writer/microdump_writer.cc
        ${BREAKPAD_ROOT}/client/linux/minidump_writer/linux_dumper.cc
        ${BREAKPAD_ROOT}/client/linux/minidump_writer/linux_ptrace_dumper.cc
        ${BREAKPAD_ROOT}/client/linux/minidump_writer/minidump_writer.cc
        ${BREAKPAD_ROOT}/client/linux/minidump_writer/pe_file.cc
        ${BREAKPAD_ROOT}/client/minidump_file_writer.cc
        ${BREAKPAD_ROOT}/common/convert_UTF.cc
        ${BREAKPAD_ROOT}/common/md5.cc
        ${BREAKPAD_ROOT}/common/string_conversion.cc
        ${BREAKPAD_ROOT}/common/linux/elfutils.cc
        ${BREAKPAD_ROOT}/common/linux/file_id.cc
        ${BREAKPAD_ROOT}/common/linux/guid_creator.cc
        ${BREAKPAD_ROOT}/common/linux/linux_libc_support.cc
        ${BREAKPAD_ROOT}/common/linux/memory_mapped_file.cc
        ${BREAKPAD_ROOT}/common/linux/safe_readlink.cc
        )

file(GLOB BREAKPAD_ASM_SOURCE ${BREAKPAD_ROOT}/common/linux/breakpad_getcontext.S)
set_property(SOURCE ${BREAKPAD_ROOT}/common/linux/breakpad_getcontext.S PROPERTY LANGUAGE C)
# set_source_files_properties(${BREAKPAD_ASM_SOURCE} PROPERTIES LANGUAGE C)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
        breakpad

        # Sets the library as a shared library.
        STATIC

        # Provides a relative path to your source file(s).
        ${BREAKPAD_SOURCES_COMMON}
        ${BREAKPAD_ASM_SOURCE}
        )


INCLUDE_DIRECTORIES(${JSONCPP_INCLUDE_DIR})

SET(PUBLIC_HEADERS
        ${JSONCPP_INCLUDE_DIR}/json/config.h
        ${JSONCPP_INCLUDE_DIR}/json/forwards.h
        ${JSONCPP_INCLUDE_DIR}/json/features.h
        ${JSONCPP_INCLUDE_DIR}/json/value.h
        ${JSONCPP_INCLUDE_DIR}/json/reader.h
        ${JSONCPP_INCLUDE_DIR}/json/writer.h
        ${JSONCPP_INCLUDE_DIR}/json/assertions.h
        ${JSONCPP_INCLUDE_DIR}/json/version.h
        )

SET(JSONCPP_SOURCES
        ${JSONCPP_SRC_DIR}/src/lib_json/json_tool.h
        ${JSONCPP_SRC_DIR}/src/lib_json/json_reader.cpp
        ${JSONCPP_SRC_DIR}/src/lib_json/json_valueiterator.inl
        ${JSONCPP_SRC_DIR}/src/lib_json/json_value.cpp
        ${JSONCPP_SRC_DIR}/src/lib_json/json_writer.cpp
        ${JSONCPP_SRC_DIR}/version.in)

SET(CAMERA2_SOURCES
        # ${CAMERA2_ROOT_DIR}/android_main.cpp
        # ${CAMERA2_ROOT_DIR}/camera_engine.cpp
        # ${CAMERA2_ROOT_DIR}/camera_manager.cpp
        # ${CAMERA2_ROOT_DIR}/camera_listeners.cpp
        # ${CAMERA2_ROOT_DIR}/image_reader.cpp
        # ${CAMERA2_ROOT_DIR}/camera_ui.cpp
        # ${CAMERA2_ROOT_DIR}/utils/camera_utils.cpp
        ${CAMERA2_ROOT_DIR}/ndkcamera.cpp)

add_definitions(-DFT2_BUILD_LIBRARY=1)
SET(FREETYPE_SRC_FILES
        ${FREETYPE_ROOT}/src/autofit/autofit.c
        ${FREETYPE_ROOT}/src/base/ftbase.c
        ${FREETYPE_ROOT}/src/base/ftbbox.c
        ${FREETYPE_ROOT}/src/base/ftbdf.c
        ${FREETYPE_ROOT}/src/base/ftbitmap.c
        ${FREETYPE_ROOT}/src/base/ftcid.c
        ${FREETYPE_ROOT}/src/base/ftdebug.c
        ${FREETYPE_ROOT}/src/base/ftfstype.c
        ${FREETYPE_ROOT}/src/base/ftgasp.c
        ${FREETYPE_ROOT}/src/base/ftglyph.c
        ${FREETYPE_ROOT}/src/base/ftgxval.c
        ${FREETYPE_ROOT}/src/base/ftinit.c
        ${FREETYPE_ROOT}/src/base/ftlcdfil.c
        ${FREETYPE_ROOT}/src/base/ftmm.c
        ${FREETYPE_ROOT}/src/base/ftotval.c
        ${FREETYPE_ROOT}/src/base/ftpatent.c
        ${FREETYPE_ROOT}/src/base/ftpfr.c
        ${FREETYPE_ROOT}/src/base/ftstroke.c
        ${FREETYPE_ROOT}/src/base/ftsynth.c
        ${FREETYPE_ROOT}/src/base/ftsystem.c
        ${FREETYPE_ROOT}/src/base/fttype1.c
        ${FREETYPE_ROOT}/src/base/ftwinfnt.c
        ${FREETYPE_ROOT}/src/bdf/bdf.c
        ${FREETYPE_ROOT}/src/bzip2/ftbzip2.c
        ${FREETYPE_ROOT}/src/cache/ftcache.c
        ${FREETYPE_ROOT}/src/cff/cff.c
        ${FREETYPE_ROOT}/src/cid/type1cid.c
        ${FREETYPE_ROOT}/src/gzip/ftgzip.c
        ${FREETYPE_ROOT}/src/lzw/ftlzw.c
        ${FREETYPE_ROOT}/src/pcf/pcf.c
        ${FREETYPE_ROOT}/src/pfr/pfr.c
        ${FREETYPE_ROOT}/src/psaux/psaux.c
        ${FREETYPE_ROOT}/src/pshinter/pshinter.c
        ${FREETYPE_ROOT}/src/psnames/psmodule.c
        ${FREETYPE_ROOT}/src/raster/raster.c
        ${FREETYPE_ROOT}/src/sfnt/sfnt.c
        ${FREETYPE_ROOT}/src/smooth/smooth.c
        ${FREETYPE_ROOT}/src/tools/apinames.c
        ${FREETYPE_ROOT}/src/truetype/truetype.c
        ${FREETYPE_ROOT}/src/type1/type1.c
        ${FREETYPE_ROOT}/src/type42/type42.c
        ${FREETYPE_ROOT}/src/winfonts/winfnt.c
        ${FREETYPE_ROOT}/src/svg/svg.c
        ${FREETYPE_ROOT}/src/sdf/sdf.c
        )

include_directories(${FREETYPE_ROOT}/include)

include_directories(${TERM_CORE_ROOT})
# include_directories(${PROJECT_SOURCE_DIR}/../../../../../libs/inc/)

#[[
add_library( # Sets the name of the library.
        evpp_lite

        # Sets the library as a shared library.
        STATIC

        # Provides a relative path to your source file(s).
        ${EVPP_SOURCES} )
]]

IF (CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
    # set(BOOST_ROOT C:/ProgramData/boost_1_82_0/)
    # set(BOOST_INCLUDEDIR C:/ProgramData/boost_1_82_0/)
    include_directories(C:/ProgramData/boost_1_82_0/)
ELSE()
    # find_package(Boost 1.58.0 COMPONENTS)
    find_package(Boost 1.58.0)
    if(Boost_FOUND)
        include_directories(${Boost_INCLUDE_DIRS})
    else()
        message(FATAL_ERROR "Boost Not Found")
    endif()
endif()

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.


add_library( # Sets the name of the library.
        jsoncpp

        # Sets the library as a shared library.
        STATIC

        # Provides a relative path to your source file(s).
        ${JSONCPP_SOURCES}
        )

add_definitions(-DDARWIN_NO_CARBON)
add_definitions(-DFT2_BUILD_LIBRARY)
add_library(
        freetype
        STATIC
        ${FREETYPE_SRC_FILES}
    )

add_library( # Sets the name of the library.
        microphoto

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        GPIOControl.cpp
        MicroPhoto.cpp
        TerminalDevice.cpp
        PhoneDevice.cpp
        // PhoneDevice2.cpp
        // Camera.cpp
        // Camera2Reader.cpp
        // TextPaint.cpp
        CvText.cpp
        SerialPort.cpp

        ncnn/yolov5ncnn.cpp

        // camera2/OpenCVFont.cpp

        ${CAMERA2_SOURCES}

        ${TERM_CORE_ROOT}/Factory.cpp
        ${TERM_CORE_ROOT}/FilePoster.cpp
        ${TERM_CORE_ROOT}/LogThread.cpp
        ${TERM_CORE_ROOT}/SpecData.cpp
        ${TERM_CORE_ROOT}/SpecData_I1.cpp
        ${TERM_CORE_ROOT}/SpecData_I1_AH.cpp
        ${TERM_CORE_ROOT}/SpecData_I1_JS.cpp
        ${TERM_CORE_ROOT}/SpecData_I1_HN.cpp
        ${TERM_CORE_ROOT}/SpecData_I1_HEN.cpp
        ${TERM_CORE_ROOT}/SpecData_I1_HENZZ.cpp
        ${TERM_CORE_ROOT}/SpecData_I1_SHX.cpp
        ${TERM_CORE_ROOT}/SpecData_XY.cpp
        ${TERM_CORE_ROOT}/SpecData_ZJ.cpp
        ${TERM_CORE_ROOT}/SpecData_NW.cpp
        ${TERM_CORE_ROOT}/SpecData_Nrsec.cpp
        ${TERM_CORE_ROOT}/Timer.cpp
        ${TERM_CORE_ROOT}/TimerThread.cpp
        ${TERM_CORE_ROOT}/Template.cpp
        ${TERM_CORE_ROOT}/Utils.cpp
        ${TERM_CORE_ROOT}/md5.c
        ${TERM_CORE_ROOT}/Client/SpiPort.cpp
        ${TERM_CORE_ROOT}/Client/NrsecPort.cpp
        ${TERM_CORE_ROOT}/Client/TerminalService.cpp
        ${TERM_CORE_ROOT}/Client/Terminal.cpp
        ${TERM_CORE_ROOT}/Client/Terminal_HN.cpp
        ${TERM_CORE_ROOT}/Client/Terminal_AH.cpp
        ${TERM_CORE_ROOT}/Client/Terminal_HEN_ZZ.cpp
        ${TERM_CORE_ROOT}/Client/Terminal_HEN.cpp
        ${TERM_CORE_ROOT}/Client/Terminal_SHX.cpp
        ${TERM_CORE_ROOT}/Client/Terminal_JS.cpp
        ${TERM_CORE_ROOT}/Client/Terminal_ZJ.cpp
        ${TERM_CORE_ROOT}/Client/Terminal_NW.cpp
        ${TERM_CORE_ROOT}/Client/UpgradeReceiver.cpp
        ${TERM_CORE_ROOT}/Client/Database.cpp
        )


# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
        microphoto

        jsoncpp

        freetype
        # breakpad

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib}

        android camera2ndk mediandk z

        ncnn ${OpenCV_LIBS} sqlite3

        )

