182 lines
6.4 KiB
CMake
182 lines
6.4 KiB
CMake
|
|
cmake_minimum_required(VERSION 3.10)
|
||
|
|
#声明编译环境
|
||
|
|
|
||
|
|
get_filename_component(MY_DIR_NAME "${CMAKE_SOURCE_DIR}" NAME)
|
||
|
|
|
||
|
|
#指定模块/程序名称 #-- 强制使用g++
|
||
|
|
project(${MY_DIR_NAME} LANGUAGES CXX)
|
||
|
|
# 设置全局编译选项
|
||
|
|
set(SRC_DIR "./")
|
||
|
|
|
||
|
|
#设置编译器以及输出文件路径
|
||
|
|
message("------cmake start [${PROJECT_NAME}] ---------[${CMAKE_SOURCE_DIR}]-----------------------")
|
||
|
|
|
||
|
|
set(CURRENT_VERSION "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}")
|
||
|
|
|
||
|
|
#通用编译选项
|
||
|
|
list(APPEND generic_compile_flags "-fPIC" "-rdynamic" "-Wno-psabi" "-Wno-unused-result" "-Wno-narrowing")
|
||
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
||
|
|
|
||
|
|
#根据环境变量配置编译参数
|
||
|
|
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")
|
||
|
|
message("-- Ready to set LIB_A_PATH: ${LIB_A_PATH}")
|
||
|
|
message("-- Ready to set LIB_SO_PATH: ${LIB_SO_PATH}")
|
||
|
|
|
||
|
|
#配置输出目录
|
||
|
|
set(LIB_EXE_OUT_PATH "$ENV{PROJECT_ROOT}/out/$ENV{TARGET_PRODUCT}/bin")
|
||
|
|
message("-- Ready to set LIB_EXE_OUT_PATH: ${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
|
||
|
|
|
||
|
|
#--------------------设置库函数路径--静态库+动态库-----------------------------------
|
||
|
|
set(LIB ${LIB_A_PATH} #静态库
|
||
|
|
${LIB_SO_PATH} #动态库
|
||
|
|
)
|
||
|
|
link_directories(${LIB})
|
||
|
|
|
||
|
|
#--------------------设置.h与.c文件路径-----------------------------------
|
||
|
|
#依赖头文件路径
|
||
|
|
#设置所有include 相关路径
|
||
|
|
include_directories(${CMAKE_SOURCE_DIR}/../../include #外部头文件
|
||
|
|
${CMAKE_SOURCE_DIR}/../../include/dev_model
|
||
|
|
${CMAKE_SOURCE_DIR}/../../include/sys_model
|
||
|
|
${CMAKE_SOURCE_DIR}/../../include/general_type
|
||
|
|
${CMAKE_SOURCE_DIR}/../../include/alarm_code
|
||
|
|
#库文件
|
||
|
|
${CMAKE_SOURCE_DIR}/../../lib_src/so_src/prfce/inc
|
||
|
|
${CMAKE_SOURCE_DIR}/../../lib_src/so_src/prpublicmemory/inc
|
||
|
|
${CMAKE_SOURCE_DIR}/../../lib_src/so_src/prlog/inc
|
||
|
|
${CMAKE_SOURCE_DIR}/../../lib_src/so_src/prxml/inc
|
||
|
|
${CMAKE_SOURCE_DIR}/../../lib_src/so_src/prgeneral/inc
|
||
|
|
${CMAKE_SOURCE_DIR}/../../lib_src/so_src/prnotice/inc
|
||
|
|
${CMAKE_SOURCE_DIR}/../../lib_src/so_src/prsqlite/inc
|
||
|
|
#扩展头文件
|
||
|
|
# ${CMAKE_SOURCE_DIR}/../../include/open
|
||
|
|
${CMAKE_SOURCE_DIR}/../../include/public
|
||
|
|
)
|
||
|
|
|
||
|
|
# 递归获取所有子目录 本地头文件
|
||
|
|
|
||
|
|
# 用于存储唯一的头文件目录
|
||
|
|
set(UNIQUE_INCLUDE_DIRS)
|
||
|
|
|
||
|
|
# 递归查找所有 .h 文件
|
||
|
|
file(GLOB_RECURSE all_headers RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h")
|
||
|
|
|
||
|
|
# 遍历所有找到的头文件
|
||
|
|
foreach(header IN LISTS all_headers)
|
||
|
|
# 提取头文件的目录部分
|
||
|
|
get_filename_component(header_dir ${header} DIRECTORY)
|
||
|
|
|
||
|
|
# 如果这个目录还没有被添加到 UNIQUE_INCLUDE_DIRS 中,则添加它
|
||
|
|
# 使用 list(FIND ...) 命令来检查目录是否已存在
|
||
|
|
list(FIND UNIQUE_INCLUDE_DIRS "${header_dir}" index)
|
||
|
|
if(${index} EQUAL -1)
|
||
|
|
list(APPEND UNIQUE_INCLUDE_DIRS ${header_dir})
|
||
|
|
# 打印这个新添加的目录
|
||
|
|
message("Adding include directory: ${header_dir}")
|
||
|
|
endif()
|
||
|
|
endforeach()
|
||
|
|
|
||
|
|
# 将唯一的头文件目录添加到包含路径中
|
||
|
|
# 注意:这里使用的是 UNIQUE_INCLUDE_DIRS 变量,它包含了去重后的目录列表
|
||
|
|
include_directories(${UNIQUE_INCLUDE_DIRS})
|
||
|
|
|
||
|
|
|
||
|
|
# 查找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})
|
||
|
|
|
||
|
|
#message("________________________________________________")
|
||
|
|
#message("${SRC_LIST}")
|
||
|
|
#message("________________________________________________")
|
||
|
|
|
||
|
|
# 排除 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################################################")
|
||
|
|
|
||
|
|
#--------------------设置可执行文件-----------------------------------
|
||
|
|
#设置可执行文件路径
|
||
|
|
set(EXECUTABLE_OUTPUT_PATH ${LIB_EXE_OUT_PATH})
|
||
|
|
|
||
|
|
|
||
|
|
#生成可执行文件
|
||
|
|
add_executable(${PROJECT_NAME} ${SRC_LIST})
|
||
|
|
|
||
|
|
#链接的库
|
||
|
|
target_link_libraries(${PROJECT_NAME}
|
||
|
|
-lprfce
|
||
|
|
-lprpublicmemory
|
||
|
|
-lprlog
|
||
|
|
-lprxml
|
||
|
|
-lprsqlite
|
||
|
|
-ldl
|
||
|
|
-lprgeneral
|
||
|
|
-lprnotice
|
||
|
|
-lpthread
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
#如果是Release版本,删除调试符号减少文件大小
|
||
|
|
# strip
|
||
|
|
if (CMAKE_BUILD_TYPE)
|
||
|
|
if (${CMAKE_BUILD_TYPE} STREQUAL "Release")
|
||
|
|
set(TARGET_PATH "${EXECUTABLE_OUTPUT_PATH}/${PROJECT_NAME}")
|
||
|
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND $ENV{STRIP} -s ${TARGET_PATH})
|
||
|
|
endif()
|
||
|
|
endif()
|
||
|
|
|
||
|
|
# 设置第二个输出路径,使用自定义命令复制文件
|
||
|
|
add_custom_command(
|
||
|
|
TARGET ${PROJECT_NAME}
|
||
|
|
POST_BUILD
|
||
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${PROJECT_NAME}> $ENV{BOARD_DIR}/bin
|
||
|
|
)
|
||
|
|
|
||
|
|
message(${PROJECT_NAME})
|
||
|
|
|