From 31ac2138d5493c5d9af64b7b8e74dc11f355dec7 Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Wed, 5 Jun 2024 22:43:47 +0800 Subject: [PATCH] Backup doc. --- doc/cmake_guide.md | 184 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 183 insertions(+), 1 deletion(-) diff --git a/doc/cmake_guide.md b/doc/cmake_guide.md index b754d9c..3de9df5 100644 --- a/doc/cmake_guide.md +++ b/doc/cmake_guide.md @@ -32,7 +32,7 @@ build/ ```code all: - @mkdir -p ../../cmake-shell;\ + @mkdir -p ../../cmake-shell;\ // 创建cmake输出目录,这一步很关键,所有cmake的中间文件都将会存放在此目录。 cd ../../cmake-shell;\ pwd;\ # 调用cmake命令,并指定工具链配置文件,生成Makefile文件。 @@ -42,6 +42,8 @@ clean: rm -rf ../../cmake-shell ``` +在根目录执行:make cmake 的时候,即是调用上述Makefile生成Makefile文件。 + ### 1.2.2. //build/cmake/toolchain/linux.toolchain.cmake   工具链配置文件或者一些跨平台差异化的配置文件。该文件在//build/cmake/Makefile中被指定,当需要交叉编译时,此文件的变量需要被重新配置。 @@ -115,3 +117,183 @@ set(HAL_SOURCE_PATH "${CMAKE_SOURCE_DIR_IPCSDK}/hal") # 硬 set(TEST_SOURCE_PATH "${CMAKE_SOURCE_DIR_IPCSDK}/test") # 自动化测试代码/example目录 set(EXTERNAL_SOURCE_PATH "${CMAKE_SOURCE_DIR_IPCSDK}/external") # 外部依赖库目录 ``` + +## 1.4. CMakeLists.txt基本语法 + +### 1.4.1. 概述 + +  概括性描述就是,只需要告诉CMakeLists.txt文件,构建时包含哪些配置文件,依赖的头文件目录,需要编译的源码文件,依赖的目标目录(如有),输出的目标,依赖的目标(一般是库),CMakeLists.txt即可生成一个Makefile代码来构建这个目标。 + +  整个SDK由很多的CMakeLists.txt文件组成,绝大多数的CMakeLists.txt文件负责把该目录的源码编译成一个库,SDK通过链接不同功能的库来构建不同的应用程序。 + +```code +./application/CMakeLists.txt +./application/HuntingCamera/CMakeLists.txt +./CMakeLists.txt +./hal/CMakeLists.txt +./middleware/AppManager/CMakeLists.txt +./middleware/CMakeLists.txt +./test/all/CMakeLists.txt +./test/application/CMakeLists.txt +./test/application/HuntingCamera/CMakeLists.txt +./test/application/MissionManager/CMakeLists.txt +./test/application/MissionManager/tool/CMakeLists.txt +./test/application/VersionReleaseTool/CMakeLists.txt +./test/CMakeLists.txt +./test/hal/CMakeLists.txt +./test/hal/tool/CMakeLists.txt +./test/middleware/AppManager/CMakeLists.txt +./tools/clang-tidy/CMakeLists.txt +./utils/CMakeLists.txt +./utils/Config/CMakeLists.txt +./utils/ConfigBase/CMakeLists.txt +``` + +### 1.4.2. 一个CMakeLists.txt示例 + +  CMakeLists.txt可以通过调用一些shell脚本来完成除编译之外的其它工具,例如:格式化代码。 + +```code + +include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake) +set(EXECUTABLE_OUTPUT_PATH ${EXEC_OUTPUT_PATH}) // 设置可执行文件的输出目录 +set(LIBRARY_OUTPUT_PATH ${LIBS_OUTPUT_PATH}) // 设置库文件的输出目录 + +include_directories( // 该目标需要依赖的头文件的目录 + ./src + ./include + ${UTILS_SOURCE_PATH}/StatusCode/include + ${UTILS_SOURCE_PATH}/Log/include +) + +#do not rely on any other library +#link_directories( // 该目标需要链接依赖的库的目录,因为是目标是库,无需链接,此设置无 +#) + +aux_source_directory(./src SRC_FILES) // 需要编译的源码文件,此处是src目录下的所有文件 + +set(TARGET_NAME StatusCode) // 设置输出目标名称 +add_library(${TARGET_NAME} STATIC ${SRC_FILES}) +target_link_libraries(${TARGET_NAME} Log) // 该目标需要依赖的库,这一步很关键,cmake将会根据依赖关系自动去编译需要的依赖库; + +if ("${COMPILE_IMPROVE_SUPPORT}" MATCHES "true") +add_custom_target( // 静态检测代码 + StatusCode_code_check + COMMAND ${CLANG_TIDY_EXE} + -checks='${CLANG_TIDY_CHECKS}' + --header-filter=.* + --system-headers=false + ${SRC_FILES} + ${CLANG_TIDY_CONFIG} + -p ${PLATFORM_PATH}/cmake-shell + WORKING_DIRECTORY ${UTILS_SOURCE_PATH}/StatusCode +) +file(GLOB_RECURSE HEADER_FILES *.h) +add_custom_target( // 格式化代码 + StatusCode_code_format + COMMAND ${CLANG_FORMAT_EXE} + -style=file + -i ${SRC_FILES} ${HEADER_FILES} + WORKING_DIRECTORY ${UTILS_SOURCE_PATH}/StatusCode +) +add_custom_command( + TARGET ${TARGET_NAME} + PRE_BUILD + COMMAND make StatusCode_code_check + COMMAND make StatusCode_code_format + WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/ +) +endif() + +define_file_name(${TARGET_NAME}) // 该函数实现log库打印时,可打印文件名 + +file(GLOB_RECURSE INSTALL_HEADER_FILES include/*.h) +install(FILES ${INSTALL_HEADER_FILES} DESTINATION include) // 拷贝头文件到安装目录 +``` + +### 1.4.3. 通过CMakeLists.txt构建开源库 + +  通过CMakeLists.txt构建开源库,可以自动关联第三方的依赖库,编译的时候自动按需编译对应的开源库。 + +```code + +include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake) +include(build/config_base.cmake) +set(EXECUTABLE_OUTPUT_PATH ${EXEC_OUTPUT_PATH}) +set(LIBRARY_OUTPUT_PATH ${LIBS_OUTPUT_PATH}) + +include_directories( + ./src + ./include + ${UTILS_SOURCE_PATH}/StatusCode/include + ${UTILS_SOURCE_PATH}/Log/include + ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib +) +# link_directories( +# ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs +# ) + +aux_source_directory(./src SRC_FILES) + +set(TARGET_NAME ConfigBase) +add_library(${TARGET_NAME} STATIC ${SRC_FILES}) +target_link_libraries(${TARGET_NAME} StatusCode Log libconfig.a) + +if ("${COMPILE_IMPROVE_SUPPORT}" MATCHES "true") +add_custom_target( + ConfigBase_code_check + COMMAND ${CLANG_TIDY_EXE} + -checks='${CLANG_TIDY_CHECKS}' + --header-filter=.* + --system-headers=false + ${SRC_FILES} + ${CLANG_TIDY_CONFIG} + -p ${PLATFORM_PATH}/cmake-shell + WORKING_DIRECTORY ${UTILS_SOURCE_PATH}/ConfigBase +) +add_custom_command( + TARGET ${TARGET_NAME} + PRE_BUILD + COMMAND make ConfigBase_code_check + WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/ +) +file(GLOB_RECURSE HEADER_FILES *.h) +add_custom_target( + ConfigBase_code_format + COMMAND ${CLANG_FORMAT_EXE} + -style=file + -i ${SRC_FILES} ${HEADER_FILES} + WORKING_DIRECTORY ${UTILS_SOURCE_PATH}/ConfigBase +) +add_custom_command( + TARGET ${TARGET_NAME} + PRE_BUILD + COMMAND make ConfigBase_code_check + COMMAND make ConfigBase_code_format + WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/ +) +endif() + +# build libconfig before make libConfigBase.a +add_custom_command( + # OUTPUT ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs/libconfig.a + OUTPUT ${EXTERNAL_LIBS_OUTPUT_PATH}/libconfig.a // 创建这个开源库输出文件的生成方法 + COMMAND echo "Build libconfig-1.7.3. COMPILE_HOST = ${COMPILE_HOST}" + # COMMAND tar zxvf libconfig-1.7.3.tar.gz + COMMAND sh build_libconfig.sh ${TARGET_PLATFORM} ${COMPILE_HOST} + # 把生成的开源库拷贝到输出目录 + COMMAND mv ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs/libconfig.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libconfig.a + WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/libconfig/ +) +add_custom_target( + libconfig.a // 创建一个库目标 + # DEPENDS ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs/libconfig.a + DEPENDS ${EXTERNAL_LIBS_OUTPUT_PATH}/libconfig.a // 这个目标依赖开源库的编译输出文件 +) + +define_file_name(${TARGET_NAME}) +config_owner(${TARGET_NAME}) + +file(GLOB_RECURSE INSTALL_HEADER_FILES include/*.h) +install(FILES ${INSTALL_HEADER_FILES} DESTINATION include) +```