CMake小结2(PICO为例)

打印 上一主题 下一主题

主题 899|帖子 899|积分 2697

1 前言

之前写过一篇cmake,不外很简单:CMake小结_cmake ${sources}-CSDN博客
构建系统现在真的太多了,完全学不外来的感觉,meson,gardle,buildroot, Maven。。。我是真的有点放弃治疗了。之前其实CMake主打过一阵,不外那时还忙着GT的事变,所以基本上是混过来的。也没有太认真去看。
最近在看FreeRTOS,用的板子是pico,首当其冲遇到的题目就是编译环境,没想到这里用的也是CMake,前两天尝试增加了一点东西,但是报错很多。看来这次这玩意是绕不开了,结合树莓派的手册,这次就详细再看看吧。有个现实的高手的项目看,也比自己瞎学强多了。。
手册来自:https://github.com/raspberrypi/pico-sdk
详细位置是:https://rptl.io/pico-get-started

2 PICO样例工程

手册里面有一章节专门说到了怎么手动配置一个工程,Manually Create your own Project。因为是官方手册,所以说的也非常详细。

 代码如下:
test.c
  1. #include <stdio.h>
  2. #include "pico/stdlib.h"
  3. #include "hardware/gpio.h"
  4. #include "pico/binary_info.h"
  5. const uint LED_PIN = 25;
  6. int main()
  7. {
  8.         bi_decl(bi_program_description("This is a test binary."));
  9.         bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED"));
  10.         stdio_init_all();
  11.         gpio_init(LED_PIN);
  12.         gpio_set_dir(LED_PIN, GPIO_OUT);
  13.         while (1) {
  14.                 gpio_put(LED_PIN, 0);
  15.                 sleep_ms(250);
  16.                 gpio_put(LED_PIN, 1);
  17.                 puts("Hello World\n");
  18.                 sleep_ms(1000);
  19.         }
  20. }
复制代码
CMakeLists.txt
  1. cmake_minimum_required(VERSION 3.13)
  2. include(pico_sdk_import.cmake)
  3. project(test_project C CXX ASM)
  4. set(CMAKE_C_STANDARD 11)
  5. set(CMAKE_CXX_STANDARD 17)
  6. pico_sdk_init()
  7. add_executable(test test.c)
  8. pico_enable_stdio_usb(test 1)
  9. pico_enable_stdio_uart(test 1)
  10. pico_add_extra_outputs(test)
  11. target_link_libraries(test pico_stdlib)
复制代码
最后要从pico的sdk中拷贝一个文件过来。
pico_sdk_import.cmake
原始位置是在/pico-sdk/external/pico_sdk_import.cmake
此时布局如下:

创建一个build,cmake..,然后make
   对了,这里说个题外话,每次编译的时间,都说找不到picotool,所以编译工具会自己去下载,但是github在国内的稳定性大家是知道的,所以尝尝编译报错都是因为这个下不下来。所以可以先安装picotool。
  1. git clone https://github.com/raspberrypi/picotool.git
  2. mkdir build
  3. cd build
  4. cmake ..
  5. make
  6. make install
复制代码
cmake ..
  1. tom@PC-20241221RKUQ:/mnt/e/test/pico/test/build$ cmake ..
  2. Using PICO_SDK_PATH from environment ('/mnt/e/test/pico/pico-sdk')
  3. PICO_SDK_PATH is /mnt/e/test/pico/pico-sdk
  4. Initializing PICO_PLATFORM from environment ('rp2040')
  5. Defaulting target board (PICO_BOARD) to 'pico' since not specified.
  6. Using board configuration from /mnt/e/test/pico/pico-sdk/src/boards/include/boards/pico.h
  7. Pico Platform (PICO_PLATFORM) is 'rp2040'.
  8. -- Defaulting build type to 'Release' since not specified.
  9. Defaulting compiler (PICO_COMPILER) to 'pico_arm_cortex_m0plus_gcc' since not specified.
  10. Configuring toolchain based on PICO_COMPILER 'pico_arm_cortex_m0plus_gcc'
  11. Defaulting PICO_GCC_TRIPLE to 'arm-none-eabi'
  12. -- The C compiler identification is GNU 13.2.1
  13. -- The CXX compiler identification is GNU 13.2.1
  14. -- The ASM compiler identification is GNU
  15. -- Found assembler: /usr/bin/arm-none-eabi-gcc
  16. -- Detecting C compiler ABI info
  17. -- Detecting C compiler ABI info - done
  18. -- Check for working C compiler: /usr/bin/arm-none-eabi-gcc - skipped
  19. -- Detecting C compile features
  20. -- Detecting C compile features - done
  21. -- Detecting CXX compiler ABI info
  22. -- Detecting CXX compiler ABI info - done
  23. -- Check for working CXX compiler: /usr/bin/arm-none-eabi-g++ - skipped
  24. -- Detecting CXX compile features
  25. -- Detecting CXX compile features - done
  26. Build type is Release
  27. -- Found Python3: /usr/bin/python3 (found version "3.12.3") found components: Interpreter
  28. TinyUSB available at /mnt/e/test/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040; enabling build support for USB.
  29. BTstack available at /mnt/e/test/pico/pico-sdk/lib/btstack
  30. cyw43-driver available at /mnt/e/test/pico/pico-sdk/lib/cyw43-driver
  31. lwIP available at /mnt/e/test/pico/pico-sdk/lib/lwip
  32. mbedtls available at /mnt/e/test/pico/pico-sdk/lib/mbedtls
  33. -- Configuring done (7.6s)
  34. -- Generating done (6.3s)
  35. -- Build files have been written to: /mnt/e/test/pico/test/build
复制代码
make
  1. tom@PC-20241221RKUQ:/mnt/e/test/pico/test/build$ make
  2. [  1%] Building ASM object pico-sdk/src/rp2040/boot_stage2/CMakeFiles/bs2_default.dir/compile_time_choice.S.o
  3. [  2%] Linking ASM executable bs2_default.elf
  4. [  2%] Built target bs2_default
  5. [  3%] Generating bs2_default.bin
  6. [  4%] Generating bs2_default_padded_checksummed.S
  7. [  5%] Building ASM object pico-sdk/src/rp2040/boot_stage2/CMakeFiles/bs2_default_library.dir/bs2_default_padded_checksummed.S.o
  8. [  5%] Built target bs2_default_library
  9. make[2]: Warning: File 'CMakeFiles/test.dir/depend.make' has modification time 0.5 s in the future
  10. [  6%] Building C object CMakeFiles/test.dir/test.c.o
  11. [  7%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.o
  12. [  9%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.o
  13. [ 10%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2040/pico_platform/platform.c.o
  14. [ 11%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_platform_panic/panic.c.o
  15. [ 12%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/hardware_claim/claim.c.o
  16. [ 13%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.o
  17. [ 14%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_sync_spin_lock/sync_spin_lock.c.o
  18. [ 15%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.o
  19. [ 17%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.o
  20. [ 18%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/sem.c.o
  21. [ 19%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/lock_core.c.o
  22. [ 20%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/mutex.c.o
  23. [ 21%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/critical_section.c.o
  24. [ 22%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_time/time.c.o
  25. [ 23%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_time/timeout_helper.c.o
  26. [ 25%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.o
  27. [ 26%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_util/datetime.c.o
  28. [ 27%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_util/pheap.c.o
  29. [ 28%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_util/queue.c.o
  30. [ 29%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.o
  31. [ 30%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.o
  32. [ 31%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.o
  33. [ 32%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.o
  34. [ 34%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.o
  35. [ 35%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_ticks/ticks.c.o
  36. [ 36%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.o
  37. [ 37%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom_lock.c.o
  38. [ 38%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_boot_lock/boot_lock.c.o
  39. [ 39%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_flash/flash.c.o
  40. [ 40%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.o
  41. [ 42%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.o
  42. [ 43%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.o
  43. [ 44%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime_init/runtime_init.c.o
  44. [ 45%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime_init/runtime_init_clocks.c.o
  45. [ 46%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime_init/runtime_init_stack_guard.c.o
  46. [ 47%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.o
  47. [ 48%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_divider/divider_hardware.S.o
  48. [ 50%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi_rp2040.S.o
  49. [ 51%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom_rp2040.c.o
  50. [ 52%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.o
  51. [ 53%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim_rp2040.S.o
  52. [ 54%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.o
  53. [ 55%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi_rp2040.S.o
  54. [ 56%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom_rp2040.c.o
  55. [ 57%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.o
  56. [ 59%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim_rp2040.S.o
  57. [ 60%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_malloc/malloc.c.o
  58. [ 61%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.o
  59. [ 62%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_atomic/atomic.c.o
  60. [ 63%] Building CXX object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_cxx_options/new_delete.cpp.o
  61. [ 64%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_standard_binary_info/standard_binary_info.c.o
  62. [ 65%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.o
  63. [ 67%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_crt0/crt0.S.o
  64. [ 68%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_clib_interface/newlib_interface.c.o
  65. [ 69%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.o
  66. [ 70%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.o
  67. [ 71%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.o
  68. [ 72%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.o
  69. [ 73%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.o
  70. [ 75%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.o
  71. [ 76%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_flash/flash.c.o
  72. [ 77%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_xip_cache/xip_cache.c.o
  73. [ 78%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.o
  74. [ 79%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.o
  75. [ 80%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/device/usbd.c.o
  76. [ 81%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/device/usbd_control.c.o
  77. [ 82%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.o
  78. [ 84%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.o
  79. [ 85%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.o
  80. [ 86%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.o
  81. [ 87%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.o
  82. [ 88%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.o
  83. [ 89%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.o
  84. [ 90%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.o
  85. [ 92%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.o
  86. [ 93%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.o
  87. [ 94%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.o
  88. [ 95%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/video/video_device.c.o
  89. [ 96%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/tusb.c.o
  90. [ 97%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.o
  91. [ 98%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.o
  92. [100%] Linking CXX executable test.elf
  93. make[2]: warning:  Clock skew detected.  Your build may be incomplete.
  94. [100%] Built target test
复制代码
好了,看来这个cmake里面干的事变还不少。

3 再看CMake

 CMake的基本原理这里就不多说了,其实就是一个构建脚本的再抽象。

官网上有一个详细的教程:
https://cmake.org/cmake/help/latest/_downloads/feee7c51d38ca0ca2395c3e89ac3d30e/cmake-4.0.0-rc2-tutorial-source.zip
CMake Tutorial — CMake 4.0.0-rc2 Documentation
他家另有一个网课,不外现在貌似是关闭了。
CMake Training

对于CMake的重点是谁人CMakeLists.txt,下面列了我以为最常用几个,完了命令行再看看大体也差不多了。
名称作用
cmake_minimum_required(VERSION <min_version>)指定项目所需的最低 CMake 版本
project(<project_name> [LANGUAGES <language>...])定义项目名称和使用的编程语言
add_executable(<target_name> <source_files>...)添加一个可实行文件目标,并指定其源文件
add_library(<target_name> [STATIC | SHARED | MODULE] <source_files>...)添加一个库目标,可以是静态库、动态库或模块库
target_link_libraries(<target_name> <libraries>...)指定目标须要链接的库
include_directories(<dir>...)添加头文件搜刮路径
target_include_directories(<target_name> <INTERFACE|PUBLIC|PRIVATE> <dir>...)为特定目标添加头文件搜刮路径
add_subdirectory(<source_dir> [binary_dir])添加子目次,子目次必须包含CMakeLists.txt 文件
set(<variable> <value> [CACHE <type> <docstring> [FORCE]])设置变量的值
add_definitions(<definitions>...)添加预处置处罚器定义
add_custom_target(<target_name> [ALL] [command]...)添加一个自定义目标,通常用于实行自定义命令
message([<mode>] "message text")打印消息,用于调试或信息输出
详细的命令阐明可以看:cmake-commands(7) — CMake 4.0.0-rc2 Documentation
另有很多内置变量须要相识一下:
PROJECT_NAME:当前项目的名称,由 project() 命令设置。
PROJECT_SOURCE_DIR:当前项目的根目次(包含顶级 CMakeLists.txt 的目次)。
PROJECT_BINARY_DIR:当前项目的构建目次(通常是 build 目次)。
CMAKE_SOURCE_DIR:顶级 CMakeLists.txt 所在的目次(与 PROJECT_SOURCE_DIR 雷同)。
CMAKE_BINARY_DIR:顶级构建目次(与 PROJECT_BINARY_DIR 雷同)。
CMAKE_CURRENT_SOURCE_DIR:当前正在处置处罚的 CMakeLists.txt 文件所在的目次。
CMAKE_CURRENT_BINARY_DIR:当前正在处置处罚的 CMakeLists.txt 文件对应的构建目次。
CMAKE_CURRENT_LIST_DIR:当前正在处置处罚的 CMake 脚本文件(如 CMakeLists.txt 或 .cmake 文件)所在的目次。
此外,CMake 还可以通过 $ENV{VAR_NAME} 访问系统的环境变量


4 PICO样例工程分析

因为这次的重心不是代码,所以这里代码就不看了。
重点照旧CMakeLists.txt,这次一行一行的过。
  1. cmake_minimum_required(VERSION 3.13)
  2. include(pico_sdk_import.cmake)
  3. project(test_project C CXX ASM)
  4. set(CMAKE_C_STANDARD 11)
  5. set(CMAKE_CXX_STANDARD 17)
  6. pico_sdk_init()
  7. add_executable(test test.c)
  8. pico_enable_stdio_usb(test 1)
  9. pico_enable_stdio_uart(test 1)
  10. pico_add_extra_outputs(test)
  11. target_link_libraries(test pico_stdlib)
复制代码
从列表来看,PICO是自己扩展了不少函数,重点要看的就是include(pico_sdk_import.cmake),pico_sdk_init(),pico_add_extra_outputs(test)。至于pico_enable_stdio_usb(test 1),pico_enable_stdio_uart(test 1)感觉就是两个宏定义。

include(pico_sdk_import.cmake)
这个主要是配置pico的路径,如果没有配置PICO_SDK_PATH,会直接从github去下载。真正的初始化,是后面include pico_sdk_init.cmake。在这里,就定义了这个宏ico_sdk_init()。
  1.     macro(pico_sdk_init)
  2.         if (NOT CMAKE_PROJECT_NAME)
  3.             message(WARNING "pico_sdk_init() should be called after the project is created (and languages added)")
  4.         endif()
  5.         add_subdirectory(${PICO_SDK_PATH} pico-sdk)
  6.     endmacro()
复制代码
这里就是包含了pico-sdk里面的第一个CMakeLists.txt。和我们一般使用库差别,一般就是只要头文件,然后静态或者动态链接。这里是相当于你编译一个小程序,现实上也是把整个pico-sdk加进来了的。

至于pico_add_extra_outputs(test)。
这个的定义是在:pico-sdk/src/cmake/on_device.cmake,这个是一个function定义,不是之前的macro。
  1. function(pico_add_extra_outputs TARGET)
  2.     # Disassembly will be nonsense for encrypted binaries,
  3.     # so disassemble before picotool processing
  4.     pico_add_dis_output(${TARGET})
  5.     # Picotool processing (signing/encrypting/etc)
  6.     # PICO_CMAKE_CONFIG: PICO_NO_PICOTOOL, Disable use/requirement for picotool meaning that UF2 output and signing/hashing and coprocoessor disassembly will all be unavailable, type=bool, default=0, group=build
  7.     if (NOT PICO_NO_PICOTOOL)
  8.         picotool_postprocess_binary(${TARGET} IS_ENCRYPTED)
  9.     endif()
  10.     if (PICO_32BIT)
  11.         pico_add_hex_output(${TARGET})
  12.     endif()
  13.     pico_add_bin_output(${TARGET})
  14.     pico_add_map_output(${TARGET})
  15.     # PICO_CMAKE_CONFIG: PICO_NO_TARGET_NAME, Don't define PICO_TARGET_NAME, type=bool, default=0, group=build
  16.     # PICO_BUILD_DEFINE: PICO_TARGET_NAME, Name of the build target being compiled (unless PICO_NO_TARGET_NAME set in build), type=string, default=target name, group=build
  17.     if (NOT PICO_NO_TARGET_NAME)
  18.         target_compile_definitions(${TARGET} PRIVATE
  19.                 PICO_TARGET_NAME="${TARGET}"
  20.                 )
  21.     endif()
  22.     if (PICO_SYMLINK_ELF_AS_FILENAME)
  23.         add_custom_target(${TARGET}_symlinked)
  24.         add_dependencies(${TARGET}_symlinked ${TARGET})
  25.         add_custom_command(TARGET ${TARGET}_symlinked POST_BUILD
  26.                 COMMAND rm -f "${PICO_SYMLINK_ELF_AS_FILENAME}"
  27.                 COMMAND ln -s -r $<TARGET_FILE:${TARGET}> "${PICO_SYMLINK_ELF_AS_FILENAME}"
  28.                 COMMENT "Symlinking from ${PICO_SYMLINK_ELF_AS_FILENAME} to ${TARGET}"
  29.                 )
  30.     endif ()
  31.     # PICO_CMAKE_CONFIG: PICO_NO_UF2, Disable UF2 output, type=bool, default=0, group=build
  32.     if (NOT (PICO_NO_UF2 OR PICO_NO_PICOTOOL))
  33.         pico_add_uf2_output(${TARGET})
  34.     endif()
  35. endfunction()
复制代码
这里还包含了很多个其它的函数,大体就是将编译的程序最后转换成可以在板子上运行的uf2格式。

5 增加FreeRTOS支持

回到之前的那一篇:RTOS基础1(FreeRTOS+树莓派PICO环境)-CSDN博客
看看里面加了什么。

 增加了自己的一个freertos,另有一个pico_sdk_import.cmake。
它的CMakeLists.txt是如许的
  1. cmake_minimum_required(VERSION 3.12)
  2. include(pico_sdk_import.cmake)
  3. project(Pico-FreeRTOS)
  4. pico_sdk_init()
  5. add_subdirectory(freertos)
  6. add_subdirectory(ProjectFiles)
复制代码
多出来的一句就是add_subdirectory(freertos)
再看看子CMakeLists.txt,也就是ProjectFiles里面的。
  1. add_executable(blink main.c)
  2. pico_sdk_init()
  3. target_link_libraries(blink pico_stdlib freertos)
  4. pico_add_extra_outputs(blink)
复制代码
其实就是一个,target_link_libraries(blink pico_stdlib freertos),增加链接freertos的库就可以了。
好吧,好像确实也不难哈。明天再继承试试。。。

6 小结

CMake的东西确实比我想的要多多了。
个人以为,现实上它有两个很大的作用。
1 就是跨平台的构建。比如说一套编译脚本,可以在linux,苹果,windows下都搞定了。这个之前都知道。
2  针对自动化构建,做了很多内容。比如创建宏或者函数,处置处罚github下载这些,这些从前的makefile确实解决这些不那么方便。这部门CMake险些是增加了半套语言。。。当然,如果能换成python语言就更好了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表