CMake小结2(PICO为例)

1 前言

之前写过一篇cmake,不过很简单:[CMake小结_cmake {sources}-CSDN博客](https://blog.csdn.net/fanged/article/details/136097000 "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

cpp 复制代码
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "pico/binary_info.h"

const uint LED_PIN = 25;

int main()
{
	bi_decl(bi_program_description("This is a test binary."));
	bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED"));

	stdio_init_all();

	gpio_init(LED_PIN);
	gpio_set_dir(LED_PIN, GPIO_OUT);
	while (1) {
		gpio_put(LED_PIN, 0);
		sleep_ms(250);
		gpio_put(LED_PIN, 1);
		puts("Hello World\n");
		sleep_ms(1000);
	}
}

CMakeLists.txt

bash 复制代码
cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)

project(test_project C CXX ASM)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

pico_sdk_init()
add_executable(test test.c)

pico_enable_stdio_usb(test 1)
pico_enable_stdio_uart(test 1)
pico_add_extra_outputs(test)

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。

复制代码
git clone https://github.com/raspberrypi/picotool.git
mkdir build
cd build
cmake ..
make
make install

cmake ..

bash 复制代码
tom@PC-20241221RKUQ:/mnt/e/test/pico/test/build$ cmake ..
Using PICO_SDK_PATH from environment ('/mnt/e/test/pico/pico-sdk')
PICO_SDK_PATH is /mnt/e/test/pico/pico-sdk
Initializing PICO_PLATFORM from environment ('rp2040')
Defaulting target board (PICO_BOARD) to 'pico' since not specified.
Using board configuration from /mnt/e/test/pico/pico-sdk/src/boards/include/boards/pico.h
Pico Platform (PICO_PLATFORM) is 'rp2040'.
-- Defaulting build type to 'Release' since not specified.
Defaulting compiler (PICO_COMPILER) to 'pico_arm_cortex_m0plus_gcc' since not specified.
Configuring toolchain based on PICO_COMPILER 'pico_arm_cortex_m0plus_gcc'
Defaulting PICO_GCC_TRIPLE to 'arm-none-eabi'
-- The C compiler identification is GNU 13.2.1
-- The CXX compiler identification is GNU 13.2.1
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/arm-none-eabi-gcc
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/arm-none-eabi-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/arm-none-eabi-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Build type is Release
-- Found Python3: /usr/bin/python3 (found version "3.12.3") found components: Interpreter
TinyUSB available at /mnt/e/test/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040; enabling build support for USB.
BTstack available at /mnt/e/test/pico/pico-sdk/lib/btstack
cyw43-driver available at /mnt/e/test/pico/pico-sdk/lib/cyw43-driver
lwIP available at /mnt/e/test/pico/pico-sdk/lib/lwip
mbedtls available at /mnt/e/test/pico/pico-sdk/lib/mbedtls
-- Configuring done (7.6s)
-- Generating done (6.3s)
-- Build files have been written to: /mnt/e/test/pico/test/build

make

bash 复制代码
tom@PC-20241221RKUQ:/mnt/e/test/pico/test/build$ make
[  1%] Building ASM object pico-sdk/src/rp2040/boot_stage2/CMakeFiles/bs2_default.dir/compile_time_choice.S.o
[  2%] Linking ASM executable bs2_default.elf
[  2%] Built target bs2_default
[  3%] Generating bs2_default.bin
[  4%] Generating bs2_default_padded_checksummed.S
[  5%] Building ASM object pico-sdk/src/rp2040/boot_stage2/CMakeFiles/bs2_default_library.dir/bs2_default_padded_checksummed.S.o
[  5%] Built target bs2_default_library
make[2]: Warning: File 'CMakeFiles/test.dir/depend.make' has modification time 0.5 s in the future
[  6%] Building C object CMakeFiles/test.dir/test.c.o
[  7%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.o
[  9%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.o
[ 10%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2040/pico_platform/platform.c.o
[ 11%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_platform_panic/panic.c.o
[ 12%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/hardware_claim/claim.c.o
[ 13%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.o
[ 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
[ 15%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.o
[ 17%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.o
[ 18%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/sem.c.o
[ 19%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/lock_core.c.o
[ 20%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/mutex.c.o
[ 21%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/critical_section.c.o
[ 22%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_time/time.c.o
[ 23%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_time/timeout_helper.c.o
[ 25%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.o
[ 26%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_util/datetime.c.o
[ 27%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_util/pheap.c.o
[ 28%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_util/queue.c.o
[ 29%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.o
[ 30%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.o
[ 31%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.o
[ 32%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.o
[ 34%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.o
[ 35%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_ticks/ticks.c.o
[ 36%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.o
[ 37%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom_lock.c.o
[ 38%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_boot_lock/boot_lock.c.o
[ 39%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_flash/flash.c.o
[ 40%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.o
[ 42%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.o
[ 43%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.o
[ 44%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime_init/runtime_init.c.o
[ 45%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime_init/runtime_init_clocks.c.o
[ 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
[ 47%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.o
[ 48%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_divider/divider_hardware.S.o
[ 50%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi_rp2040.S.o
[ 51%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom_rp2040.c.o
[ 52%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.o
[ 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
[ 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
[ 55%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi_rp2040.S.o
[ 56%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom_rp2040.c.o
[ 57%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.o
[ 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
[ 60%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_malloc/malloc.c.o
[ 61%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.o
[ 62%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_atomic/atomic.c.o
[ 63%] Building CXX object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_cxx_options/new_delete.cpp.o
[ 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
[ 65%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.o
[ 67%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_crt0/crt0.S.o
[ 68%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_clib_interface/newlib_interface.c.o
[ 69%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.o
[ 70%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.o
[ 71%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.o
[ 72%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.o
[ 73%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.o
[ 75%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.o
[ 76%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_flash/flash.c.o
[ 77%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_xip_cache/xip_cache.c.o
[ 78%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.o
[ 79%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.o
[ 80%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/device/usbd.c.o
[ 81%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/device/usbd_control.c.o
[ 82%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.o
[ 84%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.o
[ 85%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.o
[ 86%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.o
[ 87%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.o
[ 88%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.o
[ 89%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.o
[ 90%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.o
[ 92%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.o
[ 93%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.o
[ 94%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.o
[ 95%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/video/video_device.c.o
[ 96%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/tusb.c.o
[ 97%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.o
[ 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
[100%] Linking CXX executable test.elf
make[2]: warning:  Clock skew detected.  Your build may be incomplete.
[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

4 PICO样例工程分析

因为这次的重心不是代码,所以这里代码就不看了。

重点还是CMakeLists.txt,这次一行一行的过。

bash 复制代码
cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)

project(test_project C CXX ASM)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

pico_sdk_init()
add_executable(test test.c)

pico_enable_stdio_usb(test 1)
pico_enable_stdio_uart(test 1)
pico_add_extra_outputs(test)

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()。

bash 复制代码
    macro(pico_sdk_init)
        if (NOT CMAKE_PROJECT_NAME)
            message(WARNING "pico_sdk_init() should be called after the project is created (and languages added)")
        endif()
        add_subdirectory(${PICO_SDK_PATH} pico-sdk)
    endmacro()

这里就是包含了pico-sdk里面的第一个CMakeLists.txt。和我们一般使用库不同,一般就是只要头文件,然后静态或者动态链接。这里是相当于你编译一个小程序,实际上也是把整个pico-sdk加进来了的。

至于pico_add_extra_outputs(test)。

这个的定义是在:pico-sdk/src/cmake/on_device.cmake,这个是一个function定义,不是之前的macro。

bash 复制代码
function(pico_add_extra_outputs TARGET)
    # Disassembly will be nonsense for encrypted binaries,
    # so disassemble before picotool processing
    pico_add_dis_output(${TARGET})

    # Picotool processing (signing/encrypting/etc)
    # 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
    if (NOT PICO_NO_PICOTOOL)
        picotool_postprocess_binary(${TARGET} IS_ENCRYPTED)
    endif()

    if (PICO_32BIT)
        pico_add_hex_output(${TARGET})
    endif()
    pico_add_bin_output(${TARGET})
    pico_add_map_output(${TARGET})

    # PICO_CMAKE_CONFIG: PICO_NO_TARGET_NAME, Don't define PICO_TARGET_NAME, type=bool, default=0, group=build
    # 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
    if (NOT PICO_NO_TARGET_NAME)
        target_compile_definitions(${TARGET} PRIVATE
                PICO_TARGET_NAME="${TARGET}"
                )
    endif()

    if (PICO_SYMLINK_ELF_AS_FILENAME)
        add_custom_target(${TARGET}_symlinked)
        add_dependencies(${TARGET}_symlinked ${TARGET})

        add_custom_command(TARGET ${TARGET}_symlinked POST_BUILD
                COMMAND rm -f "${PICO_SYMLINK_ELF_AS_FILENAME}"
                COMMAND ln -s -r $<TARGET_FILE:${TARGET}> "${PICO_SYMLINK_ELF_AS_FILENAME}"
                COMMENT "Symlinking from ${PICO_SYMLINK_ELF_AS_FILENAME} to ${TARGET}"
                )
    endif ()
    # PICO_CMAKE_CONFIG: PICO_NO_UF2, Disable UF2 output, type=bool, default=0, group=build
    if (NOT (PICO_NO_UF2 OR PICO_NO_PICOTOOL))
        pico_add_uf2_output(${TARGET})
    endif()
endfunction()

这里还包含了很多个其它的函数,大体就是将编译的程序最后转换成可以在板子上运行的uf2格式。

5 增加FreeRTOS支持

回到之前的那一篇:RTOS基础1(FreeRTOS+树莓派PICO环境)-CSDN博客

看看里面加了什么。

增加了自己的一个freertos,还有一个pico_sdk_import.cmake。

它的CMakeLists.txt是这样的

复制代码
cmake_minimum_required(VERSION 3.12)

include(pico_sdk_import.cmake)

project(Pico-FreeRTOS)

pico_sdk_init()

add_subdirectory(freertos)
add_subdirectory(ProjectFiles)

多出来的一句就是add_subdirectory(freertos)

再看看子CMakeLists.txt,也就是ProjectFiles里面的。

复制代码
add_executable(blink main.c)

pico_sdk_init()

target_link_libraries(blink pico_stdlib freertos)
pico_add_extra_outputs(blink)

其实就是一个,target_link_libraries(blink pico_stdlib freertos),增加链接freertos的库就可以了。

好吧,好像确实也不难哈。明天再继续试试。。。

6 小结

CMake的东西确实比我想的要多多了。

个人觉得,实际上它有两个很大的作用。

1 就是跨平台的构建。比如说一套编译脚本,可以在linux,苹果,windows下都搞定了。这个之前都知道。

2 针对自动化构建,做了很多内容。比如创建宏或者函数,处理github下载这些,这些以前的makefile确实解决这些不那么方便。这部分CMake几乎是增加了半套语言。。。当然,如果能换成python语言就更好了。

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习