cmake_minimum_required(VERSION 3.5)
#声明编译环境

get_filename_component(MY_DIR_NAME "${CMAKE_SOURCE_DIR}" NAME)

# 定义宏 POWEROAD_COMPILED_LIB
add_compile_definitions(POWEROAD_COMPILED_LIB)

#指定模块/程序名称 #-- 强制使用g++
project(${MY_DIR_NAME})

set(SRC_DIR "./")

message("--------------------------------cmake start [${PROJECT_NAME}]--------------------------------")

set(CURRENT_VERSION "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}")

#通用编译选项
list(APPEND generic_compile_flags "-Wno-psabi" "-Wno-unused-result" "-Wno-narrowing")

#根据环境变量配置编译参数
if ($ENV{pd_complier_name} STREQUAL "complier_arm")
    #配置处理器
    set(CMAKE_SYSTEM_PROCESSOR arm)
else()
    #配置处理器
    set(CMAKE_SYSTEM_PROCESSOR arm64)

    # 设置 C++ 标准
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()

#配置系统名称
set(CMAKE_SYSTEM_NAME Linux)#配置编译器
message("-- Ready to set ${TARGET_PRODUCT} compile flags: $ENV{arm_compile_flags}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{arm_compile_flags}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $ENV{arm_compile_flags}")

#配置sysroot路径
set(CMAKE_SYSROOT $ENV{arm_sysroot_path})
message("-- Ready to set ${TARGET_PRODUCT} sysroot path: $ENV{arm_sysroot_path}")

#根据编译器类型，声明导出库路径
set(LIB_A_PATH "$ENV{PROJECT_ROOT}/out/$ENV{TARGET_PRODUCT}/lib/lib_a")
set(LIB_SO_PATH "$ENV{PROJECT_ROOT}/out/$ENV{TARGET_PRODUCT}/lib/lib_so")

#配置输出目录
set(LIB_EXE_OUT_PATH "$ENV{PROJECT_ROOT}/out/$ENV{TARGET_PRODUCT}/bin")
message("-- Ready to set ${TARGET_PRODUCT} LIB_EXE_OUT_PATH: $ENV{LIB_EXE_OUT_PATH}")

#配置查找路径
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)



#设置debug模式，断点有用
set(CMAKE_BUILD_TYPE "Release")   #Debug/Release

#依赖头文件路径
#设置所有include 相关路径
include_directories(${CMAKE_SOURCE_DIR}/../../../../include/general_type   #公共include
                    ${CMAKE_SOURCE_DIR}/../../../../include/alarm_code
                    ${CMAKE_SOURCE_DIR}/../../../../include/dev_model
                    ${CMAKE_SOURCE_DIR}/../../../include/sys_model
                    ${CMAKE_SOURCE_DIR}/../../prpublicmemory/inc
                    ${CMAKE_SOURCE_DIR}/../../prxml/inc
                    ${CMAKE_SOURCE_DIR}/../../../../include/public
                    ${CMAKE_SOURCE_DIR}/inc             #自有include
                    )

# 查找src目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量
# 递归地查找所有.cpp文件
file(GLOB_RECURSE CPP_SOURCES ${CMAKE_SOURCE_DIR}/${SRC_DIR}/*.cpp )
# 递归地查找所有.c文件  #实测没用，只能编cpp
file(GLOB_RECURSE C_SOURCES ${CMAKE_SOURCE_DIR}/${SRC_DIR}/*.c)

# 将两者合并到SRC_LIST列表中
set(SRC_LIST ${C_SOURCES} ${CPP_SOURCES} )


# 排除 demo/ 目录下的所有文件
foreach(SOURCE IN LISTS SRC_LIST)
    if("${SOURCE}" MATCHES ".*/demo/.*" OR "${SOURCE}" MATCHES ".*/build/.*")
        list(REMOVE_ITEM SRC_LIST ${SOURCE})
    endif()
endforeach()

#message("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n ${SRC_LIST} \n################################################")


# 提取 current 目录的父级目录的父级目录名称
get_filename_component(PARENT_DIR "${CMAKE_SOURCE_DIR}" PATH)
get_filename_component(GRANDPARENT_DIR "${PARENT_DIR}" PATH)
get_filename_component(PARENT_DIR_NAME "${GRANDPARENT_DIR}" NAME)

# 根据父目录名称决定编译为静态库还是动态库
if("${PARENT_DIR_NAME}" STREQUAL "a_src")
    message("=========.a=======PARENT_DIR_NAME = ${PARENT_DIR_NAME}")
	#--------------------设置输出静态库-----------------------------------
	#设置生成目录
	set(LIBRARY_OUTPUT_PATH ${LIB_A_PATH})

	#生成静态库.a文件
	add_library(${PROJECT_NAME} STATIC ${SRC_LIST})

	#设置编译选项
	message("-- Ready to set generic compile flags: ${generic_compile_flags}")
	target_compile_options(${PROJECT_NAME} PRIVATE ${generic_compile_flags})

elseif("${PARENT_DIR_NAME}" STREQUAL "so_src")
    message("=========.so=======PARENT_DIR_NAME = ${PARENT_DIR_NAME}")

    # 动态库输出路径
    set(LIBRARY_OUTPUT_PATH ${LIB_SO_PATH})
    add_library(${PROJECT_NAME} SHARED ${SRC_LIST})

    # 设置编译选项
    message("-- Ready to set generic compile flags: ${generic_compile_flags}")
    target_compile_options(${PROJECT_NAME} PRIVATE ${generic_compile_flags} "-fPIC")

    # 设置输出路径
    message("   PROJECT_NAME= ${PROJECT_NAME}")
    set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${LIB_SO_PATH})

    # ========== 依赖库配置（优化版）==========
    set(PRXML_LIB "${LIB_SO_PATH}/libprxml.so")
    set(PRPUBLICMEMORY_LIB "${LIB_SO_PATH}/libprpublicmemory.so")

    # 如果动态库不存在，尝试静态库
    if(NOT EXISTS "${PRXML_LIB}")
        set(PRXML_LIB "${LIB_A_PATH}/libprxml.a")
    endif()
    if(NOT EXISTS "${PRPUBLICMEMORY_LIB}")
        set(PRPUBLICMEMORY_LIB "${LIB_A_PATH}/libprpublicmemory.a")
    endif()

    # 验证库文件存在
    if(NOT EXISTS "${PRXML_LIB}")
        message(FATAL_ERROR "libprxml not found in ${LIB_SO_PATH} or ${LIB_A_PATH}")
    endif()
    if(NOT EXISTS "${PRPUBLICMEMORY_LIB}")
        message(FATAL_ERROR "libprpublicmemory not found in ${LIB_SO_PATH} or ${LIB_A_PATH}")
    endif()

    message("-- Linking libraries: ${PRXML_LIB}, ${PRPUBLICMEMORY_LIB}")

    # 链接库（使用完整路径）
    target_link_libraries(${PROJECT_NAME}
        ${PRXML_LIB}
        ${PRPUBLICMEMORY_LIB}
    )
    # ========================================

    # Release 模式下 strip 动态库
    set(TARGET_PATH ${LIBRARY_OUTPUT_PATH}/lib${PROJECT_NAME}.so)
    if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
            COMMAND $ENV{STRIP} -s ${TARGET_PATH}
            COMMENT "Stripping symbols from ${TARGET_PATH}"
        )
    endif()

    # 复制到 BOARD_DIR
    add_custom_command(
        TARGET ${PROJECT_NAME}
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E make_directory $ENV{BOARD_DIR}/lib/
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${PROJECT_NAME}> $ENV{BOARD_DIR}/lib
    )
else()
    message("=========.exc=======PARENT_DIR_NAME = ${PARENT_DIR_NAME}")
    message(FATAL_ERROR "${PARENT_DIR_NAME} directory not found in expected locations.")
endif()

