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) #指定模块/程序名称 #-- 强制使用g++ project(${MY_DIR_NAME} ) # 设置全局编译选项 set(SRC_DIR "./") #设置编译器以及输出文件路径 message("------cmake start [${PROJECT_NAME}] ---------[${CMAKE_SOURCE_DIR}]-----------------------") set(CURRENT_VERSION "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}") # imx9 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") #通用编译选项 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} 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 #依赖头文件路径 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/public ${CMAKE_SOURCE_DIR}/../../../include/interface ${CMAKE_SOURCE_DIR}/../../../include/open ${CMAKE_SOURCE_DIR}/../../../include/utility ) #待编译源文件 aux_source_directory(${CMAKE_SOURCE_DIR}/src SELF_SRC) #设置可执行程序输出路径 set(EXECUTABLE_OUTPUT_PATH ${LIB_EXE_OUT_PATH}) #依赖库路径:cmake版本小于3.13,则利用link_directories if (${CURRENT_VERSION} STRLESS "3.13") link_directories(${LIB_A_PATH}) link_directories(${LIB_SO_PATH}) endif() #生成可执行程序:link_directories需在add_executable之前,否则不生效 add_executable(${PROJECT_NAME} ${SELF_SRC}) #依赖库路径:cmake版本大于等于3.13,则利用target_link_directories if (${CURRENT_VERSION} STRGREATER_EQUAL "3.13") target_link_directories(${PROJECT_NAME} PUBLIC ${LIB_A_PATH}) target_link_directories(${PROJECT_NAME} PUBLIC ${LIB_SO_PATH}) endif() #设置编译选项 message("-- Ready to set generic compile flags: ${generic_compile_flags}") target_compile_options(${PROJECT_NAME} PRIVATE ${generic_compile_flags}) #依赖库文件 #依赖库文件: 注意库的顺序 动态库->依赖库, 比如runtime_environ依赖version_data、cloud_command等库,则需先引用runtime_environ,再引用version_data、cloud_command等库 set(MY_LIB_FILES runtime_environ version_data cloud_command cloud_data cloud_repeater running_data upgrade_task ssl_middleware system_config prpublicmemory ssl crypto local_upgrader mutex_log tinyxml2 stdc++ dl pthread) target_link_libraries(${PROJECT_NAME} ${MY_LIB_FILES}) #如果是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})