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


### 这是一个特殊处理的配置文件，同时生存so和可执行程序sqlite3



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 "./")

# 设置可执行文件名称
set(EXEC_NAME sqlite3)

# 设置编译器以及输出文件路径
# 输出消息
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)

#--------------------设置.h与.c文件路径-----------------------------------
# 设置所有include相关路径
# 添加头文件目录
include_directories(${CMAKE_SOURCE_DIR}/inc
                    ${CMAKE_SOURCE_DIR}/../../../include/general_type)

# 查找${SRC_DIR}目录下的所有*.cpp,*.c源文件,并将文件列表保存到SRC_LIST变量
file(GLOB_RECURSE SRC_LIST "${SRC_DIR}/sqlite3*.cpp" "${SRC_DIR}/pr*.c" "${SRC_DIR}/sqlite3*.c" "${SRC_DIR}/pd_sqlite.c")	#遍历获取src/路径下所有的*.cpp和*.c文件列表



# 打印SRC_LIST以验证结果（可选）
message("########### ${SRC_LIST}")

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


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

# 根据父目录名称决定编译为静态库还是动态库
if("${PARENT_DIR_NAME}" STREQUAL "a_src")
    message("=========.a=======PARENT_DIR_NAME = ${PARENT_DIR_NAME}")
	# 设置输出静态库
	add_library(sqlite3_static STATIC ${SRC_LIST})
	set_target_properties(sqlite3_static PROPERTIES OUTPUT_NAME ${PROJECT_NAME})

	#--------------------设置可执行文件-----------------------------------
	# 设置输出可执行文件
	add_executable(${EXEC_NAME} ${SRC_DIR}/shell.c)
	target_link_libraries(${PROJECT_NAME} sqlite3_static pthread dl)

	# =========================设置输出路径 ===============================
	# 	#生成静态库.a文件
	set_target_properties(sqlite3_static ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${LIB_A_PATH})

	#生成可执行文件
	set_target_properties(sqlite3_static ${EXEC_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${LIB_EXE_OUT_PATH})
elseif("${PARENT_DIR_NAME}" STREQUAL "so_src")
	message("=========.so=======PARENT_DIR_NAME = ${PARENT_DIR_NAME}")

	# 设置输出动态库
	add_library(sqlite3_shared SHARED ${SRC_LIST})
	#set_target_properties(sqlite3_shared PROPERTIES OUTPUT_NAME "sqlite3" VERSION 1.0 SOVERSION 1)
	set_target_properties(sqlite3_shared PROPERTIES OUTPUT_NAME ${PROJECT_NAME})





	#--------------------设置可执行文件-----------------------------------
	# 设置输出可执行文件
	add_executable(${EXEC_NAME} ${SRC_DIR}/shell.c)

	# 链接动态库和其他依赖库
	target_link_libraries(${EXEC_NAME} sqlite3_shared pthread dl)

	# =========================设置输出路径 ===============================
	# 生成动态库.so文件
	set_target_properties(sqlite3_shared PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${LIB_SO_PATH})


	# 在Release模式下，添加自定义命令来strip动态库
	if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
		set(TARGET_PATH ${LIBRARY_OUTPUT_PATH}/lib${PROJECT_NAME}.so)
	    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
	        COMMAND $ENV{STRIP} -s ${TARGET_PATH}
	        COMMENT "Stripping symbols from ${TARGET_PATH}"
	    )
	endif()
    
      # 设置第二个输出路径，使用自定义命令复制文件

	# 生成可执行文件
	set_target_properties(${EXEC_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${LIB_EXE_OUT_PATH})

	# strip
	if (CMAKE_BUILD_TYPE)
	    if (${CMAKE_BUILD_TYPE} STREQUAL "Release")
	        set(TARGET_PATH "${EXECUTABLE_OUTPUT_PATH}/${EXEC_NAME}")
	        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND $ENV{STRIP} -s ${TARGET_PATH})
	    endif()
	endif()
       
       
    # 拷贝动态库到第二个输出路径  
    add_custom_command(  
        TARGET sqlite3_shared  
        POST_BUILD  
        COMMAND ${CMAKE_COMMAND} -E make_directory $ENV{BOARD_DIR}/lib/
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:sqlite3_shared> $ENV{BOARD_DIR}/lib
        COMMENT "Copying sqlite3_shared to $ENV{BOARD_DIR}/lib"  
    )  
    # 设置第二个输出路径，使用自定义命令复制文件
    add_custom_command(
        TARGET ${EXEC_NAME}
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E make_directory $ENV{BOARD_DIR}/bin/
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${EXEC_NAME}> $ENV{BOARD_DIR}/bin
    )


else()
    message("=========e=======PARENT_DIR_NAME = ${PARENT_DIR_NAME}")
    message(FATAL_ERROR "sqlite directory not found in expected locations.")
endif()







