@iStarLee
2018-11-06T13:18:45.000000Z
字数 7530
阅读 670
cmake
这是一个完整的STM32F407工程,这是一个工程第一级目录下的CMakeLists.txt
# CMake minimum versioncmake_minimum_required (VERSION 3.1)# Project Infomationproject( blinky )# 使用汇编编译enable_language(ASM)# add sub进入到这个文件夹下执行它的CMakeLists.txtadd_subdirectory(Drivers)# Reset output pathset (EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)set (LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)# STDLIBset (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)# 包含头文件路径include_directories (Drivers/CMSIS/Device/Include )# 包含源码文件aux_source_directory (User/Source/ DIR_USER_SRCS)# CC AR LD ASset (CMAKE_C_COMPILER "arm-none-eabi-gcc")set (CMAKE_C_AR "arm-none-eabi-ar")set (CMAKE_ASM_COMPILER "arm-none-eabi-gcc")# CFLAGSset (CMAKE_C_FLAGS "-g -mthumb -fno-builtin -mcpu=cortex-m4 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp -Wall -std=gnu99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "c compiler flags")set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D USE_HAL_DRIVER -D STM32F407xx")# CXXFLAGSset (CMAKE_CXX_FLAGS "-g -mthumb -fno-builtin -mcpu=cortex-m4 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp -Wall -std=c++11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "cxx compiler flags")# ASMFLAGSset (CMAKE_ASM_FLAGS "-g -mthumb -mcpu=cortex-m4 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp -x assembler-with-cpp" CACHE INTERNAL "asm compiler flags")# LDFLAGSset (CMAKE_EXE_LINKER_FLAGS "-g -Wl,--gc-sections -mthumb -mcpu=cortex-m4 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp -mabi=aapcs" CACHE INTERNAL "executable linker flags")set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${CMAKE_SOURCE_DIR}/ldscripts/STM32F407VGTx_FLASH.ld")# Load the the extern library# add_library (STM32F4xx_HAL_Driver STATIC IMPORTED)# set_property (TARGET STM32F4xx_HAL_Driver PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/Drivers/Build/lib/libSTM32F4xx_HAL_Driver.a)# 这句话和上面两句作用一样link_directories(${CMAKE_SOURCE_DIR}/Drivers/Build/lib )# Load the the extern freertos library# add_library (STM32F4xx_FreeRTOS STATIC IMPORTED)# set_property (TARGET STM32F4xx_FreeRTOS PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/FreeRTOS/Build/lib/libSTM32F4xx_FreeRTOS.a)# 这句话和上面两句作用一样link_directories(${CMAKE_SOURCE_DIR}/FreeRTOS/Build/lib )# Generate the target 生成目标文件add_executable (${CMAKE_PROJECT_NAME}.elf ${DIR_USER_SRCS} ${DIR_BSP_SRCS} ${DIR_CMSIS_SRCS} ${CMAKE_SOURCE_DIR}/Drivers/CMSIS/Device/Source/startup/startup_stm32f407xx.s)# Link the library to the target 使用库target_link_libraries (${CMAKE_PROJECT_NAME}.elf STM32F4xx_HAL_Driver STM32F4xx_FreeRTOS)# Generate the binary file 生成二进制文件add_custom_target (${CMAKE_PROJECT_NAME}.bin ALL arm-none-eabi-objcopy -Obinary "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf" "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.bin" DEPENDS ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf)# Generate the hex file 生成十六进制文件add_custom_target (${CMAKE_PROJECT_NAME}.hex ALL arm-none-eabi-objcopy -Oihex "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf" "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.hex" DEPENDS ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf)# Echo the size Infomationadd_custom_target (size ALL arm-none-eabi-size "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf" DEPENDS ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf)# Make flash to the board by st-linkadd_custom_target (flash COMMAND st-flash write ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.bin 0x8000000)# Make clean-all 添加的自定义命令add_custom_target (clean-all COMMAND rm -rf ${CMAKE_BINARY_DIR}/*)
以生成stm32 官方库为例,部分内容展示了如何生成库的流程
# Reset output pathset(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)# Set include pathinclude_directories( CMSIS/Include )# The need build source path and build all filesaux_source_directory (STM32F4xx_HAL_Driver/Src DIR_STM32F4xx_HAL_Driver_SRCS)# CC ARset(CMAKE_C_COMPILER "arm-none-eabi-gcc")set(CMAKE_C_AR "arm-none-eabi-ar")# CFLAGSset (CMAKE_C_FLAGS "-g -mthumb -fno-builtin -mcpu=cortex-m4 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp -Wall -std=gnu99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "c compiler flags")set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSTM32F407xx -DUSE_HAL_DRIVER")# Generate the target to the static libraryadd_library (STM32F4xx_HAL_Driver ${DIR_STM32F4xx_HAL_Driver_SRCS})
# configure fileconfigure_file("${PROJECT_SOURCE_DIR}/config.h.in""${PROJECT_SOURCE_DIR}/config/config.h")# use configure fileoption(USE_CMAKEDEFINE "help string describing USE_CMAKEDEFINE" ON)if(USE_CMAKEDEFINE)message(STATUS "use cmake define...")endif(USE_CMAKEDEFINE)# use cmake config file ,so include the config.h folderinclude_directories (config)
在源文件中编写以下代码
/*use cmake config file*/#include "config.h"#ifdef USE_CMAKEDEFINE#else#endif
编译过程:
cmake ..# 便于交互式的选择该变量的值,可以使用 ccmake 命令ccmake .. # 回车键选择,c配置,g生成make
安装分为以下几类
安装的cmake代码写在生成该文件的CMakeLists.txt中。
# 普通文件的安装:INSTALL(FILES COPYRIGHT READMEDESTINATION share/doc/cmake/usual-c)# 目录的安装:INSTALL(DIRECTORY doc/DESTINATION share/doc/cmake/usual-c)# 非目标文件的可执行程序安装(比如脚本之类):INSTALL(PROGRAMS runhello.shDESTINATION bin)# 目标文件的安装# ARCHIVE 特指静态库, LIBRARY 特指动态库, RUNTIME特指可执行目标二进制INSTALL(TARGETS helloRUNTIME DESTINATION bin)# 安装共享库和头文件# ARCHIVE 特指静态库, LIBRARY 特指动态库, RUNTIME特指可执行目标二进制INSTALL(TARGETS hello hello_staticLIBRARY DESTINATION libARCHIVE DESTINATION lib)INSTALL(FILES hello.hDESTINATION include/hello)
# 启用测试enable_testing()# 测试程序是否成功运行add_test (test_run Demo 5 2)# 测试帮助信息是否可以正常提示add_test (test_usage Demo)set_tests_properties (test_usagePROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")# 测试 5 的平方add_test (test_5_2 Demo 5 2)set_tests_properties (test_5_2PROPERTIES PASS_REGULAR_EXPRESSION "is 25")
# 定义一个宏,用来简化测试工作macro (do_test arg1 arg2 result)add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})set_tests_properties (test_${arg1}_${arg2}PROPERTIES PASS_REGULAR_EXPRESSION ${result})endmacro (do_test)# 利用 do_test 宏,测试一系列数据do_test (5 2 "is 25")do_test (10 5 "is 100000")do_test (2 10 "is 1024")
指定 Debug 模式下开启 -g 选项
set(CMAKE_BUILD_TYPE "Debug")set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
在config.h.in 文件中,预定义相关的宏变量。
#cmakedefine HAVE_POW
在CMakeLists.txt中
# 检查系统是否支持 pow 函数,放在 configure_file 命令前include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)check_function_exists (pow HAVE_POW)# 加入一个配置头文件,用于处理 CMake 对源码的设置configure_file ("${PROJECT_SOURCE_DIR}/config.h.in""${PROJECT_BINARY_DIR}/config.h")# 是否加入 MathFunctions 库if (NOT HAVE_POW)include_directories ("${PROJECT_SOURCE_DIR}/math")add_subdirectory (math)set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)endif (NOT HAVE_POW)
在config.h.in中
// the configured options and settings for Tutorial#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@
在CMakeLists.txt中,放在 configure_file 命令前
set (Demo_VERSION_MAJOR 1)set (Demo_VERSION_MINOR 0)
在主程序中直接使用该宏
printf("%s Version %d.%d\n",argv[0],Demo_VERSION_MAJOR,Demo_VERSION_MINOR);
首先在顶层的 CMakeLists.txt 文件尾部添加下面几行:
# 构建一个 CPack 安装包include (InstallRequiredSystemLibraries)set (CPACK_RESOURCE_FILE_LICENSE"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")include (CPack)
上面的代码做了以下几个工作:
接下来的工作是像往常一样构建工程,并执行 cpack 命令。
# 生成二进制安装包:cpack -C CPackConfig.cmake# 或者生成源码安装包cpack -C CPackSourceConfig.cmake
生成安装包的本质是把需要安装的文件打包成一个压缩包,最后解压到某个文件夹下。