Skip to content

Commit ec33a94

Browse files
authored
Switch the CMake in pico-blink-sdk+pico-w-blink-sdk to use CMake native Swift support (#99)
1 parent d94c950 commit ec33a94

File tree

5 files changed

+97
-82
lines changed

5 files changed

+97
-82
lines changed

harmony/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ The firmware for Harmony is built using CMake and requires the Raspberry Pi Pico
5858

5959
4. Generate the build files using CMake:
6060
```bash
61-
cmake -B build -G Ninja .
61+
cmake -B build -G Ninja . -DCMAKE_EXPORT_COMPILE_COMMANDS=On
6262
```
6363

6464
5. Build the firmware:

pico-blink-sdk/CMakeLists.txt

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,45 @@
1-
cmake_minimum_required(VERSION 3.13)
1+
cmake_minimum_required(VERSION 3.29)
22
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
33

4+
set(CMAKE_Swift_COMPILATION_MODE wholemodule)
5+
set(CMAKE_Swift_COMPILER_WORKS YES)
6+
47
project(swift-blinky)
58
pico_sdk_init()
6-
7-
if(APPLE)
8-
execute_process(COMMAND xcrun -f swiftc OUTPUT_VARIABLE SWIFTC OUTPUT_STRIP_TRAILING_WHITESPACE)
9-
else()
10-
execute_process(COMMAND which swiftc OUTPUT_VARIABLE SWIFTC OUTPUT_STRIP_TRAILING_WHITESPACE)
11-
endif()
9+
enable_language(Swift)
1210

1311
set(SWIFT_TARGET "armv6m-none-none-eabi") # default for rp2040
1412

1513
if(PICO_PLATFORM STREQUAL "rp2350-arm-s")
1614
message(STATUS "PICO_PLATFORM is set to rp2350-arm-s, using armv7em")
1715
set(SWIFT_TARGET "armv7em-none-none-eabi")
18-
list(APPEND CLANG_ARCH_ABI_FLAGS "-Xcc" "-mfloat-abi=soft")
16+
list(APPEND CLANG_ARCH_ABI_FLAGS "-Xcc -mfloat-abi=soft")
1917
elseif(PICO_PLATFORM STREQUAL "rp2040")
2018
message(STATUS "PICO_PLATFORM is set to RP2040, using armv6m")
21-
list(APPEND CLANG_ARCH_ABI_FLAGS "-Xcc" "-mfloat-abi=soft")
19+
list(APPEND CLANG_ARCH_ABI_FLAGS "-Xcc -mfloat-abi=soft")
2220
elseif(PICO_PLATFORM STREQUAL "rp2350-riscv")
2321
message(STATUS "PICO_PLATFORM is set to rp2350-riscv, using riscv32.")
2422
set(SWIFT_TARGET "riscv32-none-none-eabi")
25-
list(APPEND CLANG_ARCH_ABI_FLAGS "-Xcc" "-march=rv32imac_zicsr_zifencei_zba_zbb_zbs_zbkb" "-Xcc" "-mabi=ilp32")
23+
list(APPEND CLANG_ARCH_ABI_FLAGS "-Xcc -march=rv32imac_zicsr_zifencei_zba_zbb_zbs_zbkb -Xcc -mabi=ilp32")
2624
endif()
2725

28-
add_executable(swift-blinky)
26+
add_executable(swift-blinky
27+
# Source files:
28+
Main.swift
29+
)
30+
31+
set_target_properties(swift-blinky PROPERTIES LINKER_LANGUAGE CXX)
2932

3033
target_link_libraries(swift-blinky
3134
pico_stdlib hardware_uart hardware_gpio
3235
)
3336

34-
# Gather compile definitions from all dependencies
37+
# Clear the default COMPILE_OPTIONS which include C specific compiler flags that the Swift compiler will not accept
38+
# Instead, set those options to only apply when compiling C code.
39+
set_target_properties(pico_standard_link PROPERTIES INTERFACE_COMPILE_OPTIONS "")
40+
target_compile_options(pico_standard_link INTERFACE "$<$<COMPILE_LANGUAGE:C>:SHELL: -ffunction-sections -fdata-sections>")
3541

42+
# Gather C compile definitions from all dependencies
3643
set_property(GLOBAL PROPERTY visited_targets "")
3744
set_property(GLOBAL PROPERTY compilerdefs_list "")
3845

@@ -42,20 +49,18 @@ function(gather_compile_definitions_recursive target)
4249

4350
# make sure we don't visit the same target twice
4451
# and that we don't visit the special generator expressions
45-
if (${target} MATCHES "\\$<" OR ${target} MATCHES "::@" OR ${target} IN_LIST visited_targets)
52+
if (${target} MATCHES "\\\$<" OR ${target} MATCHES "::@" OR ${target} IN_LIST visited_targets)
4653
return()
4754
endif()
4855

4956
# Append the target to visited_targets
5057
list(APPEND visited_targets ${target})
5158
set_property(GLOBAL PROPERTY visited_targets "${visited_targets}")
5259

53-
# Get the current value of compilerdefs_list
54-
get_property(compilerdefs_list GLOBAL PROPERTY compilerdefs_list)
55-
5660
get_target_property(target_definitions ${target} INTERFACE_COMPILE_DEFINITIONS)
5761
if (target_definitions)
5862
# Append the target definitions to compilerdefs_list
63+
get_property(compilerdefs_list GLOBAL PROPERTY compilerdefs_list)
5964
list(APPEND compilerdefs_list ${target_definitions})
6065
set_property(GLOBAL PROPERTY compilerdefs_list "${compilerdefs_list}")
6166
endif()
@@ -71,35 +76,38 @@ endfunction()
7176

7277
gather_compile_definitions_recursive(swift-blinky)
7378
get_property(COMPILE_DEFINITIONS GLOBAL PROPERTY compilerdefs_list)
79+
get_property(INCLUDES GLOBAL PROPERTY includes_list)
7480

75-
# Parse compiler definitions into a format that swiftc can understand
81+
# Convert compiler definitions into a format that swiftc can understand
7682
list(REMOVE_DUPLICATES COMPILE_DEFINITIONS)
77-
list(PREPEND COMPILE_DEFINITIONS "")
83+
list(PREPEND COMPILE_DEFINITIONS "") # adds a semicolon at the beginning
7884
string(REPLACE "$<TARGET_PROPERTY:PICO_TARGET_BINARY_TYPE>" "$<TARGET_PROPERTY:swift-blinky,PICO_TARGET_BINARY_TYPE>" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}")
79-
string(REPLACE ";" ";-Xcc;-D" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}")
80-
81-
add_custom_command(
82-
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o
83-
COMMAND
84-
${SWIFTC}
85-
-target ${SWIFT_TARGET} -Xcc -fshort-enums
86-
${COMPILE_DEFINITIONS}
85+
string(REPLACE ";" " -Xcc -D" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}")
86+
87+
# Compute -Xcc flags to set up the C and C++ header search paths for Swift (for bridging header).
88+
set(IMPLICIT_INCLUDES)
89+
foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES})
90+
string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-Xcc ")
91+
string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-I${dir} ")
92+
endforeach()
93+
foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
94+
string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-Xcc ")
95+
string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-I${dir} ")
96+
endforeach()
97+
98+
target_compile_options(swift-blinky PUBLIC
99+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:
100+
-target ${SWIFT_TARGET}
101+
-enable-experimental-feature Embedded
102+
-parse-as-library
103+
-module-name swift_blinky
104+
87105
${CLANG_ARCH_ABI_FLAGS}
88-
-Xfrontend -function-sections -enable-experimental-feature Embedded -wmo -parse-as-library
89-
$$\( echo '$<TARGET_PROPERTY:swift-blinky,INCLUDE_DIRECTORIES>' | tr '\;' '\\n' | sed -e 's/\\\(.*\\\)/-Xcc -I\\1/g' \)
90-
$$\( echo '${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}' | tr ' ' '\\n' | sed -e 's/\\\(.*\\\)/-Xcc -I\\1/g' \)
106+
-Xcc -fshort-enums
107+
-Xfrontend -function-sections
91108
-import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h
92-
${CMAKE_CURRENT_LIST_DIR}/Main.swift
93-
-c -o ${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o
94-
DEPENDS
95-
${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h
96-
${CMAKE_CURRENT_LIST_DIR}/Main.swift
97-
)
98-
add_custom_target(swift-blinky-swiftcode DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o)
99-
109+
${COMPILE_DEFINITIONS}
110+
${IMPLICIT_INCLUDES}
111+
>")
100112

101-
target_link_libraries(swift-blinky
102-
${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o
103-
)
104-
add_dependencies(swift-blinky swift-blinky-swiftcode)
105113
pico_add_extra_outputs(swift-blinky)

pico-blink-sdk/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ $ export PICO_BOARD='<board-name>' # Examples: pico, pico2
2828
$ export PICO_PLATFORM='<optional-platform-name>' # Optional; useful if you'd like to compile for RISC-V. Examples: rp2040, rp2350-arm-s, rp2350-riscv
2929
$ export PICO_SDK_PATH='<path-to-your-pico-sdk>'
3030
$ export PICO_TOOLCHAIN_PATH='<path-to-the-compiler-toolchain>' # A default `brew` install will be located at `/Applications/ArmGNUToolchain/[version]/arm-none-eabi`. This can also be a RISC-V toolchain for the RP2350.
31-
$ cmake -B build -G Ninja .
31+
$ cmake -B build -G Ninja . -DCMAKE_EXPORT_COMPILE_COMMANDS=On
3232
$ cmake --build build
3333
```
3434

pico-w-blink-sdk/CMakeLists.txt

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,30 @@
1-
cmake_minimum_required(VERSION 3.13)
1+
cmake_minimum_required(VERSION 3.29)
22
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
33

4+
set(CMAKE_Swift_COMPILATION_MODE wholemodule)
5+
set(CMAKE_Swift_COMPILER_WORKS YES)
6+
47
project(swift-blinky)
58
pico_sdk_init()
9+
enable_language(Swift)
10+
11+
add_executable(swift-blinky
12+
# Source files:
13+
Main.swift
14+
)
615

7-
if(APPLE)
8-
execute_process(COMMAND xcrun -f swiftc OUTPUT_VARIABLE SWIFTC OUTPUT_STRIP_TRAILING_WHITESPACE)
9-
else()
10-
execute_process(COMMAND which swiftc OUTPUT_VARIABLE SWIFTC OUTPUT_STRIP_TRAILING_WHITESPACE)
11-
endif()
16+
set_target_properties(swift-blinky PROPERTIES LINKER_LANGUAGE CXX)
1217

13-
add_executable(swift-blinky)
1418
target_link_libraries(swift-blinky
1519
pico_stdlib hardware_uart hardware_gpio pico_lwip_arch pico_cyw43_arch_none
1620
)
1721

18-
# Gather compile definitions from all dependencies
22+
# Clear the default COMPILE_OPTIONS which include C specific compiler flags that the Swift compiler will not accept
23+
# Instead, set those options to only apply when compiling C code.
24+
set_target_properties(pico_standard_link PROPERTIES INTERFACE_COMPILE_OPTIONS "")
25+
target_compile_options(pico_standard_link INTERFACE "$<$<COMPILE_LANGUAGE:C>:SHELL: -ffunction-sections -fdata-sections>")
26+
27+
# Gather C compile definitions from all dependencies
1928
set_property(GLOBAL PROPERTY visited_targets "")
2029
set_property(GLOBAL PROPERTY compilerdefs_list "")
2130

@@ -25,20 +34,18 @@ function(gather_compile_definitions_recursive target)
2534

2635
# make sure we don't visit the same target twice
2736
# and that we don't visit the special generator expressions
28-
if (${target} MATCHES "\\$<" OR ${target} MATCHES "::@" OR ${target} IN_LIST visited_targets)
37+
if (${target} MATCHES "\\\$<" OR ${target} MATCHES "::@" OR ${target} IN_LIST visited_targets)
2938
return()
3039
endif()
3140

3241
# Append the target to visited_targets
3342
list(APPEND visited_targets ${target})
3443
set_property(GLOBAL PROPERTY visited_targets "${visited_targets}")
3544

36-
# Get the current value of compilerdefs_list
37-
get_property(compilerdefs_list GLOBAL PROPERTY compilerdefs_list)
38-
3945
get_target_property(target_definitions ${target} INTERFACE_COMPILE_DEFINITIONS)
4046
if (target_definitions)
4147
# Append the target definitions to compilerdefs_list
48+
get_property(compilerdefs_list GLOBAL PROPERTY compilerdefs_list)
4249
list(APPEND compilerdefs_list ${target_definitions})
4350
set_property(GLOBAL PROPERTY compilerdefs_list "${compilerdefs_list}")
4451
endif()
@@ -54,37 +61,37 @@ endfunction()
5461

5562
gather_compile_definitions_recursive(swift-blinky)
5663
get_property(COMPILE_DEFINITIONS GLOBAL PROPERTY compilerdefs_list)
64+
get_property(INCLUDES GLOBAL PROPERTY includes_list)
5765

58-
# Parse compiler definitions into a format that swiftc can understand
66+
# Convert compiler definitions into a format that swiftc can understand
5967
list(REMOVE_DUPLICATES COMPILE_DEFINITIONS)
6068
list(PREPEND COMPILE_DEFINITIONS "") # adds a semicolon at the beginning
6169
string(REPLACE "$<TARGET_PROPERTY:PICO_TARGET_BINARY_TYPE>" "$<TARGET_PROPERTY:swift-blinky,PICO_TARGET_BINARY_TYPE>" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}")
62-
string(REPLACE ";" ";-Xcc;-D" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}")
70+
string(REPLACE ";" " -Xcc -D" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}")
6371

64-
add_custom_command(
65-
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o
66-
COMMAND
67-
${SWIFTC}
68-
-target armv6m-none-none-eabi -Xcc -mfloat-abi=soft -Xcc -fshort-enums
69-
${COMPILE_DEFINITIONS}
70-
-Xcc -DCYW43_LWIP
71-
-Xcc -DPICO_CYW43_ARCH_THREADSAFE_BACKGROUND
72-
-Xcc -I$ENV{PICO_SDK_PATH}/lib/lwip/src/include
73-
-Xcc -I${CMAKE_CURRENT_LIST_DIR}/include
74-
-Xfrontend -function-sections -enable-experimental-feature Embedded -wmo -parse-as-library
75-
$$\( echo '$<TARGET_PROPERTY:swift-blinky,INCLUDE_DIRECTORIES>' | tr '\;' '\\n' | sed -e 's/\\\(.*\\\)/-Xcc -I\\1/g' \)
76-
$$\( echo '${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}' | tr ' ' '\\n' | sed -e 's/\\\(.*\\\)/-Xcc -I\\1/g' \)
72+
# Compute -Xcc flags to set up the C and C++ header search paths for Swift (for bridging header).
73+
set(IMPLICIT_INCLUDES)
74+
foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES})
75+
string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-Xcc ")
76+
string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-I${dir} ")
77+
endforeach()
78+
foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
79+
string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-Xcc ")
80+
string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-I${dir} ")
81+
endforeach()
82+
83+
target_compile_options(swift-blinky PUBLIC
84+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:
85+
-target armv6m-none-none-eabi
86+
-enable-experimental-feature Embedded
87+
-parse-as-library
88+
-module-name swift_blinky
89+
90+
-Xcc -fshort-enums
91+
-Xfrontend -function-sections
7792
-import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h
78-
${CMAKE_CURRENT_LIST_DIR}/Main.swift
79-
-c -o ${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o
80-
DEPENDS
81-
${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h
82-
${CMAKE_CURRENT_LIST_DIR}/Main.swift
83-
)
84-
add_custom_target(swift-blinky-swiftcode DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o)
93+
${COMPILE_DEFINITIONS}
94+
${IMPLICIT_INCLUDES}
95+
>")
8596

86-
target_link_libraries(swift-blinky
87-
${CMAKE_CURRENT_BINARY_DIR}/_swiftcode.o
88-
)
89-
add_dependencies(swift-blinky swift-blinky-swiftcode)
9097
pico_add_extra_outputs(swift-blinky)

pico-w-blink-sdk/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ $ export TOOLCHAINS='<toolchain-identifier>'
2626
$ export PICO_BOARD=pico_w
2727
$ export PICO_SDK_PATH='<path-to-your-pico-sdk>'
2828
$ export PICO_TOOLCHAIN_PATH='<path-to-the-arm-toolchain>'
29-
$ cmake -B build -G Ninja .
29+
$ cmake -B build -G Ninja . -DCMAKE_EXPORT_COMPILE_COMMANDS=On
3030
$ cmake --build build
3131
```
3232

0 commit comments

Comments
 (0)