cmake_minimum_required(VERSION 3.5) #声明编译环境 get_filename_component(MY_DIR_NAME "${CMAKE_SOURCE_DIR}" NAME) #设备类型宏定义 include($ENV{PROJECT_ROOT}/build/cmake/detect_target_product.cmake) # 定义宏 POWEROAD_COMPILED_LIB add_compile_definitions(POWEROAD_COMPILED_LIB) #指定模块/程序名称 #-- 强制使用g++ project(${MY_DIR_NAME} LANGUAGES CXX) set(SRC_DIR "./") message("--------------------------------cmake start [${PROJECT_NAME}]--------------------------------") 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) endif() # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) #配置系统名称 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_directories(${CMAKE_SOURCE_DIR}/../../../include/public ${CMAKE_SOURCE_DIR}/../../../include/open ${CMAKE_SOURCE_DIR}/../../../include/general_type ${CMAKE_SOURCE_DIR}/../../../include/dev_model ${CMAKE_SOURCE_DIR}/../../../include/utility ${CMAKE_SOURCE_DIR}/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(PARENT_DIR_NAME "${PARENT_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") # =========================设置输出路径 =============================== # #生成动态库.so文件 message(" PROJECT_NAME= ${PROJECT_NAME}") set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${LIB_SO_PATH}) else() message("=========.exc=======PARENT_DIR_NAME = ${PARENT_DIR_NAME}") message(FATAL_ERROR "sqlite directory not found in expected locations.") endif() # 在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() # 设置第二个输出路径,使用自定义命令复制文件 add_custom_command( TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ $ENV{BOARD_DIR}/lib )