apple/swift-embedded-examples

`pico-blink-sdk` can't find Pico W headers

MaxDesiatov opened this issue · 3 comments

When I add #include "pico/cyw43_arch.h" (header used in picow_blink.c in upstream pico-examples) to BridgingHeader.h and reconfigure with cmake -DPICO_BOARD=pico_w -B build -G Ninja . that runs fine, I see this output from CMake:

PICO platform is rp2040.
Build type is Release
Using PICO_BOARD from environment ('pico_w')
Using CMake board configuration from pico-sdk/src/boards/pico_w.cmake
Using board configuration from pico-sdk/src/boards/include/boards/pico_w.h
TinyUSB available at pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040; enabling build support for USB.
BTstack available at pico-sdk/lib/btstack
cyw43-driver available at pico-sdk/lib/cyw43-driver
Pico W Bluetooth build support available.
lwIP available at pico-sdk/lib/lwip
Pico W Wi-Fi build support available.

But when I try to build with cmake --build build it can't find any of the headers specific to Pico W:

BridgingHeader.h:15:10: error: 'pico/cyw43_arch.h' file not found
13 | 
14 | #include "pico/stdlib.h"
15 | #include "pico/cyw43_arch.h"
   |          `- error: 'pico/cyw43_arch.h' file not found

I tried adding include paths manually:

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o
    COMMAND
        ${SWIFTC}
        -target armv6m-none-none-eabi -Xcc -mfloat-abi=soft -Xcc -fshort-enums
        -Xfrontend -function-sections -enable-experimental-feature Embedded -wmo -parse-as-library
        $$\( echo '$<TARGET_PROPERTY:swift-blinky,INCLUDE_DIRECTORIES>' | tr '\;' '\\n' | sed -e 's/\\\(.*\\\)/-Xcc -I\\1/g' \)
        $$\( echo '${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}'             | tr ' '  '\\n' | sed -e 's/\\\(.*\\\)/-Xcc -I\\1/g' \)
        -I$ENV{PICO_SDK_PATH}/src/rp2_common/pico_cyw43_arch/include
        -I$ENV{PICO_SDK_PATH}/src/rp2_common/pico_cyw43_driver/include
        -I$ENV{PICO_SDK_PATH}/src/rp2_common/pico_async_context/include/
        -I$ENV{PICO_SDK_PATH}/lib/cyw43-driver/src
        -I$ENV{PICO_SDK_PATH}/lib/lwip/src/include
        -I$ENV{PICO_SDK_PATH}/lib/lwip/contrib/ports/unix/lib
        -I$ENV{PICO_SDK_PATH}/lib/lwip/contrib/ports/unix/port/include
        -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h
        ${CMAKE_CURRENT_LIST_DIR}/Main.swift
        -c -o ${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o
    DEPENDS
        ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h
        ${CMAKE_CURRENT_LIST_DIR}/Main.swift
)

but this seems wrong, as picow_blink from pico-examples doesn't seem to be doing this and gets its include paths seemingly automatically.

It also doesn't help anyway as in the end I get this error:

pico-sdk/src/rp2_common/pico_cyw43_arch/include/pico/cyw43_arch.h:30:2: error: must specify support pico_cyw43_arch architecture type or set PICO_CYW43_ARCH_HEADER
 28 | #include "pico/cyw43_arch/arch_freertos.h"
 29 | #else
 30 | #error must specify support pico_cyw43_arch architecture type or set PICO_CYW43_ARCH_HEADER
    |  `- error: must specify support pico_cyw43_arch architecture type or set PICO_CYW43_ARCH_HEADER
 31 | #endif
 32 | #endif

Have you verified that your target_link_libraries include the proper libs?

# Link the Swift object file with the executable target
target_link_libraries(swift-pico
    pico_stdlib
    hardware_uart
    hardware_gpio
    pico_lwip_arch
    pico_cyw43_arch_none
    ${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o
)

Have you set the PICO_SDK_PATH environment variable?

I have created a Docker container (https://github.com/shivarajd/swift-embedded-pico-docker) and everything works fine.

As contributed by @yochidros in #11, we need a slightly different setup for Pico W compared to Pico. Making this even more explicit in the docs in #31. With that I think this should be resolved.