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") #根据环境变量配置编译参数 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} CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") 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/general_type #外部头文件 ${CMAKE_SOURCE_DIR}/../../include/dev_model ${CMAKE_SOURCE_DIR}/app/inc ${CMAKE_SOURCE_DIR}/reuse/devlibrary/bms/inc ${CMAKE_SOURCE_DIR}/reuse/devlibrary/pcs/inc ${CMAKE_SOURCE_DIR}/reuse/devlibrary/ess/inc ${CMAKE_SOURCE_DIR}/reuse/devlibrary/common/inc ${CMAKE_SOURCE_DIR}/reuse/protocolStation/inc ${CMAKE_SOURCE_DIR}/../../lib_src/a_src/modbus/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/prgeneral/inc ${CMAKE_SOURCE_DIR}/../../lib_src/so_src/prxml/inc ${CMAKE_SOURCE_DIR}/../../lib_src/so_src/premsfun/simpleconfig/inc ${CMAKE_SOURCE_DIR}/../../include/alarm_code ${CMAKE_SOURCE_DIR}/../../include/sys_model #扩展头文件 ${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} -lmodbus -lprpublicmemory -lpthread -lprgeneral -lprlog -lprxml -lsimpleconfig ) #如果是Release版本,删除调试符号减少文件大小 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 $ $ENV{BOARD_DIR}/bin ) message(${PROJECT_NAME})