cmake_minimum_required(VERSION 3.16)
set(PROJNAME encoder)
include(config.cmake)
include(FetchContent)

project(${PROJNAME})

set(ARCH arm)

if (USING_HISIMPP5)
    add_compile_definitions(
        -DUSING_HISIMPP5
    )
endif()

add_compile_definitions(
    -DFIRMWARE_UPGRADE_FROM_BACKUP_PARTITION
)

execute_process(
    COMMAND git log -1 --format=%h
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_COMMIT_HASH
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

add_compile_definitions(-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\")

# 未定义或为空
if (NOT DEFINED CMAKE_BUILD_TYPE OR NOT CMAKE_BUILD_TYPE)
    set (CMAKE_BUILD_TYPE Debug)
endif()

message("Project \"${GIT_COMMIT_HASH}\" build type: " ${CMAKE_BUILD_TYPE})

if (CMAKE_BUILD_TYPE MATCHES Debug)
    add_compile_definitions(-DDEBUG)
endif()

if (CMAKE_SYSTEM_NAME MATCHES "Linux")
    set(Poco_DIR $ENV{POCO_PATH}/lib/cmake/Poco)
    link_libraries(
        pthread
        dl
        m
        atomic
    )
    if (CMAKE_BUILD_TYPE MATCHES Debug)
        # 定义Debug编译参数
        SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -Og -Wall -g3 -Wno-psabi -std=c++1z -mfpu=neon -mfloat-abi=softfp") # GDB调试
        # SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -Og -Wall -g3 -Wno-psabi -std=c++1z -mfpu=neon -mfloat-abi=softfp -fsanitize=address -fno-eliminate-unused-debug-types -fno-omit-frame-pointer") # 内存检测
        # SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -Wno-psabi")
        # SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -Wno-psabi -rdynamic -funwind-tables -ffunction-sections") # 可以在应用里捕获SIGSEGV信号，然后用backtrace()函数把堆栈信息打印出来
    else()
        # 定义Release编译参数
        SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -Wno-psabi -mfpu=neon -mfloat-abi=softfp")
    endif()
    add_compile_definitions(-DOS_LINUX)
elseif (CMAKE_SYSTEM_NAME MATCHES "Windows")
    set(Poco_DIR $ENV{POCO_PATH}/cmake)
    # 强制Visual Studio使用UTF-8编码
    add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
    add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
    # 忽略部分警告
    add_compile_definitions(/wd"4828")
    # 使用Unicode字符集
    add_compile_definitions(-DUNICODE -D_UNICODE)
    if (USING_LVGL_PLATFORM OR USING_SOUI_PLATFORM)
        # 设置为窗口程序
        set(GUI_EXECUTABLE WIN32)
        add_compile_definitions(-DWINDOWS_GUI_APPLICATION)
    endif()
    link_directories($ENV{POCO_PATH}/lib)
endif()

find_package(Poco REQUIRED COMPONENTS Foundation Net XML Encodings Util Zip Crypto)
include_directories(
    .
    ${Poco_LIBRARIES}
    $ENV{JSONC_PATH}/include
    $ENV{CRYPTOAUTHLIB_PATH}/include/cryptoauthlib
    $ENV{OPENSSL_PATH}/include
    $ENV{PAHO_MQTTC_PATH}/include
)
link_libraries(
    ${Poco_LIBRARIES}
    $ENV{CRYPTOAUTHLIB_PATH}/lib/libcryptoauth.a
    $ENV{OPENSSL_PATH}/lib/libssl.a
    $ENV{OPENSSL_PATH}/lib/libcrypto.a
    #$ENV{PAHO_MQTTC_PATH}/lib/libpaho-mqtt3a.a
    #$ENV{PAHO_MQTTC_PATH}/lib/libpaho-mqtt3as.a
    $ENV{PAHO_MQTTC_PATH}/lib/libpaho-mqtt3c.a
    #$ENV{PAHO_MQTTC_PATH}/lib/libpaho-mqtt3cs.a
)

if (USING_HISIMPP5)
    include_directories(
        $ENV{MPP_PATH}/include
    )

    link_libraries(
        $ENV{MPP_PATH}/lib/libmpi.a
        $ENV{MPP_PATH}/lib/libdnvqe.a
        $ENV{MPP_PATH}/lib/libupvqe.a
        $ENV{MPP_PATH}/lib/libvqe_res.a
        $ENV{MPP_PATH}/lib/libVoiceEngine.a
        $ENV{MPP_PATH}/lib/libsecurec.so
        $ENV{MPP_PATH}/lib/libhdmi.a
        $ENV{MPP_PATH}/lib/libtde.a
    )
endif()


aux_source_directory(. MAIN_SOURCES)
add_executable(${PROJNAME} ${GUI_EXECUTABLE} ${MAIN_SOURCES})

# target_compile_options(${PROJNAME} PRIVATE
#     -fsanitize=address,undefined
#     -fsanitize=float-divide-by-zero
#     -fsanitize=null
#     -fsanitize=bounds-strict
# )

# target_link_options(${PROJNAME} PRIVATE
#     -fsanitize=address,undefined
# )

if (CMAKE_SYSTEM_NAME MATCHES "Windows")
    SET_PROPERTY (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${PROJNAME} )
endif()

if (USING_VIDEO_SUBSYSTEM)
    add_compile_definitions(-DUSING_VIDEO_SUBSYSTEM)
endif()

# 网络
if (USING_NETWORK_SUBSYSTEM)
    add_compile_definitions(-DUSING_NETWORK_SUBSYSTEM)
endif()
 
# 板级设备
if (USING_HARDWARE_SUBSYSTEM)
    add_compile_definitions(-DUSING_HARDWARE_SUBSYSTEM)
endif()

if (USING_VIDEO_SUBSYSTEM)
    include(video/video.cmake)
endif()

# 网络
if (USING_NETWORK_SUBSYSTEM)
    include(network/network.cmake)
endif()

# 板级设备
if (USING_HARDWARE_SUBSYSTEM)
    include(hardware/hardware.cmake)
endif()

# Util
include(util/util.cmake) 
 
