Package
ci / checks (push) Successful in 48m34s

This commit is contained in:
khodowany
2026-09-30 19:46:37 -05:00
parent 2a1aa2c67a
commit 09656a9d60
6621 changed files with 698 additions and 774 deletions
+12
View File
@@ -0,0 +1,12 @@
include_guard(GLOBAL)
if(NOT MODULUS_PYTHON_RUNNER OR NOT MODULUS_PYTHON_ROOT)
message(FATAL_ERROR "Modulus build Python is not configured. Run ./modulus.py configure first.")
endif()
find_package(Python3 COMPONENTS Interpreter REQUIRED)
set(VAMP_PYTHON_COMMAND ${Python3_EXECUTABLE} -u ${MODULUS_PYTHON_RUNNER} ${MODULUS_PYTHON_ROOT})
file(GLOB VAMP_SHARED_PYTHON_INPUTS CONFIGURE_DEPENDS
${MODULUS_PYTHON_ROOT}/modulus/*.py
${MODULUS_PYTHON_ROOT}/modulus/*_requirements.txt
)
list(APPEND VAMP_SHARED_PYTHON_INPUTS ${MODULUS_PYTHON_REQUIREMENTS})
+11 -9
View File
@@ -29,7 +29,7 @@ endif()
include(${PICO_SDK_PATH}/pico_sdk_init.cmake)
project(product-vamp-pico LANGUAGES C CXX ASM)
project(product_vamp_pico LANGUAGES C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
@@ -37,6 +37,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
pico_sdk_init()
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/pico_artwork.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/theme.cmake)
set(VAMP_MODULUS_INCLUDE_DIR "" CACHE PATH "Path to the Modulus public include directory")
set(VAMP_RESOLVED_MODULUS_INCLUDE_DIR "${VAMP_MODULUS_INCLUDE_DIR}")
@@ -74,7 +75,7 @@ if(NOT EXISTS "${VAMP_RESOLVED_MODULUS_INCLUDE_DIR}/modulus/types.hpp")
message(FATAL_ERROR "VAMP_MODULUS_INCLUDE_DIR must contain modulus/types.hpp: ${VAMP_RESOLVED_MODULUS_INCLUDE_DIR}")
endif()
add_executable(product-vamp-pico2w
add_executable(product_vamp_pico2w
src/vamp_style.cpp
src/vamp_pico/display.cpp
src/vamp_pico/http_client.cpp
@@ -86,25 +87,26 @@ add_executable(product-vamp-pico2w
src/vamp_protocol/page_control.cpp
src/vamp_protocol/gesture.cpp
)
vamp_add_pico_artwork(product-vamp-pico2w)
target_include_directories(product-vamp-pico2w PRIVATE
vamp_add_pico_artwork(product_vamp_pico2w)
vamp_add_theme(product_vamp_pico2w)
target_include_directories(product_vamp_pico2w PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
${VAMP_RESOLVED_MODULUS_INCLUDE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include/vamp_pico/capi
)
target_compile_definitions(product-vamp-pico2w PRIVATE
target_compile_definitions(product_vamp_pico2w PRIVATE
VAMP_PICO_WIFI_SSID="${VAMP_PICO_WIFI_SSID}"
VAMP_PICO_WIFI_PASSPHRASE="${VAMP_PICO_WIFI_PASSPHRASE}"
VAMP_ZERO_HOST="${VAMP_ZERO_HOST}"
VAMP_ZERO_PORT=${VAMP_ZERO_PORT}
)
target_link_libraries(product-vamp-pico2w PRIVATE
target_link_libraries(product_vamp_pico2w PRIVATE
pico_stdlib
hardware_i2c
hardware_spi
pico_cyw43_arch_lwip_threadsafe_background
)
pico_enable_stdio_usb(product-vamp-pico2w 1)
pico_enable_stdio_uart(product-vamp-pico2w 0)
pico_add_extra_outputs(product-vamp-pico2w)
pico_enable_stdio_usb(product_vamp_pico2w 1)
pico_enable_stdio_uart(product_vamp_pico2w 0)
pico_add_extra_outputs(product_vamp_pico2w)
+8 -4
View File
@@ -1,11 +1,11 @@
find_package(Python3 COMPONENTS Interpreter REQUIRED)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/build_python.cmake)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "import PIL.features; import fontTools.ttLib; assert PIL.features.check_feature('raqm')"
RESULT_VARIABLE VAMP_PILLOW_STATUS
ERROR_QUIET
)
if(NOT VAMP_PILLOW_STATUS EQUAL 0)
message(FATAL_ERROR "Pico artwork generation requires Pillow with Raqm and fontTools. Install libfribidi0 on Debian/Ubuntu, then run: ${Python3_EXECUTABLE} -m pip install -r ${CMAKE_CURRENT_SOURCE_DIR}/generator/requirements.txt")
message(FATAL_ERROR "Pico artwork requires Pillow with Raqm and fontTools. Install libfribidi0 and configure the Modulus assets Python group.")
endif()
# Zero uses packaged font files; only the Pico embeds this fixed sprite atlas.
@@ -14,11 +14,15 @@ function(vamp_add_pico_artwork target)
set(VAMP_PICO_ARTWORK_SOURCE ${CMAKE_CURRENT_BINARY_DIR}/generated/pico/artwork.S)
add_custom_command(
OUTPUT ${VAMP_PICO_ARTWORK_BINARY}
COMMAND ${Python3_EXECUTABLE} -m generator.pico_artwork --static-output ${VAMP_PICO_ARTWORK_BINARY}
COMMAND ${VAMP_PYTHON_COMMAND} -m generator.pico_artwork --static-output ${VAMP_PICO_ARTWORK_BINARY}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/generator/pico_artwork.py
${CMAKE_CURRENT_SOURCE_DIR}/generator/requirements.txt
${VAMP_SHARED_PYTHON_INPUTS}
${CMAKE_CURRENT_SOURCE_DIR}/generator/palette.json
${CMAKE_CURRENT_SOURCE_DIR}/generator/theme.py
${CMAKE_CURRENT_SOURCE_DIR}/cmake/build_python.cmake
${CMAKE_CURRENT_SOURCE_DIR}/cmake/theme.cmake
${CMAKE_CURRENT_SOURCE_DIR}/package/assets/fonts/petaluma/PetalumaScript.otf
VERBATIM
)
+14
View File
@@ -0,0 +1,14 @@
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/build_python.cmake)
function(vamp_add_theme target)
set(header ${CMAKE_CURRENT_BINARY_DIR}/generated/vamp_style/palette.hpp)
add_custom_command(
OUTPUT ${header}
COMMAND ${VAMP_PYTHON_COMMAND} -m generator.theme --header ${header}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS generator/theme.py generator/palette.json ${VAMP_SHARED_PYTHON_INPUTS}
VERBATIM
)
target_sources(${target} PRIVATE ${header})
target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/generated)
endfunction()
+1 -1
View File
@@ -7,4 +7,4 @@ set(VAMP_PICO_WIFI_SSID "Vamp Control" CACHE STRING "Default Pico Wi-Fi SSID")
set(VAMP_PICO_WIFI_PASSPHRASE "vamp-control" CACHE STRING "Default Pico Wi-Fi passphrase")
set(VAMP_ZERO_HOST "192.168.42.1" CACHE STRING "Default Zero control host for Pico firmware")
set(VAMP_ZERO_PORT "8080" CACHE STRING "Default Zero control port for Pico firmware")
set(VAMP_ZERO_IMAGE_TAG "product-vamp-zero:dev" CACHE STRING "Docker image tag embedded in package metadata")
set(VAMP_ZERO_IMAGE_TAG "product_vamp_zero:dev" CACHE STRING "Docker image tag embedded in package metadata")
+62 -50
View File
@@ -8,7 +8,8 @@ set(CMAKE_CXX_EXTENSIONS OFF)
find_package(modulus CONFIG REQUIRED COMPONENTS boost_json openssl raylib)
find_package(Threads REQUIRED)
find_package(Python3 COMPONENTS Interpreter REQUIRED)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/build_python.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/theme.cmake)
find_package(ligo CONFIG REQUIRED)
find_package(noto CONFIG REQUIRED)
find_package(luma CONFIG REQUIRED)
@@ -51,12 +52,13 @@ set(VAMP_STYLE_SOURCES
src/vamp_style.cpp
)
add_library(vamp-style STATIC ${VAMP_STYLE_SOURCES})
target_include_directories(vamp-style PUBLIC
add_library(vamp_style STATIC ${VAMP_STYLE_SOURCES})
vamp_add_theme(vamp_style)
target_include_directories(vamp_style PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_compile_features(vamp-style PUBLIC cxx_std_17)
target_link_libraries(vamp-style PUBLIC
target_compile_features(vamp_style PUBLIC cxx_std_17)
target_link_libraries(vamp_style PUBLIC
modulus::modulus
)
@@ -65,12 +67,12 @@ set(VAMP_PROTOCOL_SOURCES
src/vamp_protocol/page_control.cpp
)
add_library(vamp-protocol STATIC ${VAMP_PROTOCOL_SOURCES})
target_include_directories(vamp-protocol PUBLIC
add_library(vamp_protocol STATIC ${VAMP_PROTOCOL_SOURCES})
target_include_directories(vamp_protocol PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_compile_features(vamp-protocol PUBLIC cxx_std_17)
target_link_libraries(vamp-protocol PUBLIC
target_compile_features(vamp_protocol PUBLIC cxx_std_17)
target_link_libraries(vamp_protocol PUBLIC
modulus::modulus
)
@@ -97,18 +99,18 @@ set(VAMP_CORE_SOURCES
src/vamp_zero/ui.cpp
)
add_library(vamp-zero-core STATIC ${VAMP_CORE_SOURCES})
target_include_directories(vamp-zero-core PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated)
target_include_directories(vamp-zero-core PUBLIC
add_library(vamp_zero_core STATIC ${VAMP_CORE_SOURCES})
target_include_directories(vamp_zero_core PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated)
target_include_directories(vamp_zero_core PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_compile_features(vamp-zero-core PUBLIC cxx_std_23)
target_compile_definitions(vamp-zero-core PUBLIC
target_compile_features(vamp_zero_core PUBLIC cxx_std_23)
target_compile_definitions(vamp_zero_core PUBLIC
VAMP_GIT_SHA="${VAMP_GIT_SHA}"
)
target_link_libraries(vamp-zero-core PUBLIC
vamp-style
vamp-protocol
target_link_libraries(vamp_zero_core PUBLIC
vamp_style
vamp_protocol
modulus::modulus
modulus::boost_json
modulus::openssl
@@ -120,9 +122,9 @@ target_link_libraries(vamp-zero-core PUBLIC
PRIVATE modulus::raylib
)
add_executable(vamp-zero src/vamp_zero/main.cpp)
target_compile_features(vamp-zero PRIVATE cxx_std_23)
target_link_libraries(vamp-zero PRIVATE vamp-zero-core)
add_executable(vamp_zero src/vamp_zero/main.cpp)
target_compile_features(vamp_zero PRIVATE cxx_std_23)
target_link_libraries(vamp_zero PRIVATE vamp_zero_core)
if(BUILD_TESTING)
add_subdirectory(tests)
@@ -137,26 +139,29 @@ file(GLOB_RECURSE VAMP_GENERATOR_INPUTS CONFIGURE_DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/data/expected/*.json
${CMAKE_CURRENT_SOURCE_DIR}/generator/*.py
${CMAKE_CURRENT_SOURCE_DIR}/generator/**/*.py
${CMAKE_CURRENT_SOURCE_DIR}/generator/requirements.txt
${VAMP_SHARED_PYTHON_INPUTS}
${CMAKE_CURRENT_SOURCE_DIR}/generator/palette.json
${CMAKE_CURRENT_SOURCE_DIR}/generator/theme.py
${CMAKE_CURRENT_SOURCE_DIR}/cmake/build_python.cmake
${CMAKE_CURRENT_SOURCE_DIR}/cmake/theme.cmake
${CMAKE_CURRENT_SOURCE_DIR}/package/assets/fonts/*
${CMAKE_CURRENT_SOURCE_DIR}/package/assets/fonts/**/*
)
set(VAMP_GENERATED_ASSETS_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated-assets)
set(VAMP_GENERATED_ASSETS_STAMP ${CMAKE_CURRENT_BINARY_DIR}/generated-assets.stamp)
set(VAMP_GENERATED_ASSETS_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated_assets)
set(VAMP_GENERATED_ASSETS_STAMP ${CMAKE_CURRENT_BINARY_DIR}/generated_assets.stamp)
set(VAMP_ENGRAVING_JOBS 2 CACHE STRING "Maximum parallel Python engraving workers (1-16)")
set(VAMP_ENGRAVING_CACHE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/build/build_common/engraving-cache" CACHE PATH "Shared build-only page cache; empty disables caching")
set(VAMP_ENGRAVING_CACHE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/build/build_common/engraving_cache" CACHE PATH "Shared build-only page cache; empty disables caching")
set(VAMP_ENGRAVING_CACHE_ARGS)
if(VAMP_ENGRAVING_CACHE_DIR)
list(APPEND VAMP_ENGRAVING_CACHE_ARGS --engraving-cache "${VAMP_ENGRAVING_CACHE_DIR}")
endif()
string(JOIN "\n" VAMP_GENERATOR_INPUT_MANIFEST ${VAMP_GENERATOR_INPUTS})
file(CONFIGURE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated-assets.inputs
file(CONFIGURE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated_assets.inputs
CONTENT "@VAMP_GENERATOR_INPUT_MANIFEST@\n" @ONLY)
add_custom_command(
OUTPUT ${VAMP_GENERATED_ASSETS_STAMP}
BYPRODUCTS ${VAMP_GENERATED_ASSETS_DIR}/catalog.db
COMMAND ${Python3_EXECUTABLE}
-u
COMMAND ${VAMP_PYTHON_COMMAND}
-m generator
--data-dir ${CMAKE_CURRENT_SOURCE_DIR}/data
--output-dir ${VAMP_GENERATED_ASSETS_DIR}
@@ -167,30 +172,30 @@ add_custom_command(
${VAMP_ENGRAVING_CACHE_ARGS}
COMMAND ${CMAKE_COMMAND} -E touch ${VAMP_GENERATED_ASSETS_STAMP}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS ${VAMP_GENERATOR_INPUTS} ${CMAKE_CURRENT_BINARY_DIR}/generated-assets.inputs
DEPENDS ${VAMP_GENERATOR_INPUTS} ${CMAKE_CURRENT_BINARY_DIR}/generated_assets.inputs
USES_TERMINAL
VERBATIM
)
add_custom_target(vamp-generated-assets ALL DEPENDS ${VAMP_GENERATED_ASSETS_STAMP})
add_custom_target(vamp_generated_assets ALL DEPENDS ${VAMP_GENERATED_ASSETS_STAMP})
if(BUILD_TESTING)
add_dependencies(product-vamp-test vamp-generated-assets)
add_dependencies(product_vamp_test vamp_generated_assets)
endif()
install(TARGETS vamp-zero
install(TARGETS vamp_zero
RUNTIME DESTINATION zero/bin
)
install(FILES package/config/vamp.example.json DESTINATION zero/config)
install(DIRECTORY ${VAMP_GENERATED_ASSETS_DIR}/ DESTINATION zero/share/product-vamp
install(DIRECTORY ${VAMP_GENERATED_ASSETS_DIR}/ DESTINATION zero/share/product_vamp
PATTERN "*.json" EXCLUDE PATTERN "analysis" EXCLUDE)
install(PROGRAMS
package/zero/install-zero.sh
package/zero/start-ap.sh
package/zero/start-zero.sh
package/zero/install_zero.sh
package/zero/start_ap.sh
package/zero/start_zero.sh
DESTINATION zero
)
install(FILES
package/zero/product-vamp-ap.service
package/zero/product-vamp-zero.service
package/zero/product_vamp_ap.service
package/zero/product_vamp_zero.service
DESTINATION zero/systemd
)
install(FILES package/pico/wiring.md DESTINATION pico)
@@ -203,23 +208,23 @@ endif()
if(VAMP_BUILD_ZERO_IMAGE)
find_program(DOCKER_EXECUTABLE docker REQUIRED)
set(VAMP_ZERO_IMAGE_CONTEXT ${CMAKE_CURRENT_BINARY_DIR}/zero-image-context)
set(VAMP_ZERO_IMAGE_TAR ${CMAKE_CURRENT_BINARY_DIR}/product-vamp-zero-linux-arm64.docker.tar)
set(VAMP_ZERO_IMAGE_CONTEXT ${CMAKE_CURRENT_BINARY_DIR}/zero_image_context)
set(VAMP_ZERO_IMAGE_TAR ${CMAKE_CURRENT_BINARY_DIR}/product_vamp_zero_linux_arm64.docker.tar)
add_custom_command(
OUTPUT ${VAMP_ZERO_IMAGE_TAR}
COMMAND ${CMAKE_COMMAND} -E rm -rf ${VAMP_ZERO_IMAGE_CONTEXT}
COMMAND ${CMAKE_COMMAND} -E make_directory ${VAMP_ZERO_IMAGE_CONTEXT}/usr/bin
COMMAND ${CMAKE_COMMAND} -E make_directory ${VAMP_ZERO_IMAGE_CONTEXT}/usr/share/product-vamp
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vamp-zero> ${VAMP_ZERO_IMAGE_CONTEXT}/usr/bin/vamp-zero
COMMAND ${CMAKE_COMMAND} -E make_directory ${VAMP_ZERO_IMAGE_CONTEXT}/usr/share/product_vamp
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vamp_zero> ${VAMP_ZERO_IMAGE_CONTEXT}/usr/bin/vamp_zero
COMMAND ${CMAKE_COMMAND} -E copy package/zero/Dockerfile ${VAMP_ZERO_IMAGE_CONTEXT}/Dockerfile
COMMAND ${CMAKE_COMMAND} -DSOURCE=${VAMP_GENERATED_ASSETS_DIR} -DDESTINATION=${VAMP_ZERO_IMAGE_CONTEXT}/usr/share/product-vamp -P cmake/runtime_assets.cmake
COMMAND ${CMAKE_COMMAND} -E make_directory ${VAMP_ZERO_IMAGE_CONTEXT}/usr/share/product-vamp/config
COMMAND ${CMAKE_COMMAND} -E copy package/config/vamp.example.json ${VAMP_ZERO_IMAGE_CONTEXT}/usr/share/product-vamp/config/vamp.example.json
COMMAND ${CMAKE_COMMAND} -DSOURCE=${VAMP_GENERATED_ASSETS_DIR} -DDESTINATION=${VAMP_ZERO_IMAGE_CONTEXT}/usr/share/product_vamp -P cmake/runtime_assets.cmake
COMMAND ${CMAKE_COMMAND} -E make_directory ${VAMP_ZERO_IMAGE_CONTEXT}/usr/share/product_vamp/config
COMMAND ${CMAKE_COMMAND} -E copy package/config/vamp.example.json ${VAMP_ZERO_IMAGE_CONTEXT}/usr/share/product_vamp/config/vamp.example.json
COMMAND ${BASH_EXECUTABLE} package/scripts/build_zero_image.sh ${VAMP_ZERO_IMAGE_CONTEXT} ${VAMP_ZERO_IMAGE_TAR} ${VAMP_ZERO_IMAGE_TAG}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS
vamp-zero
vamp_zero
package/scripts/build_zero_image.sh
package/zero/Dockerfile
package/config/vamp.example.json
@@ -227,19 +232,23 @@ if(VAMP_BUILD_ZERO_IMAGE)
${VAMP_GENERATED_ASSETS_STAMP}
VERBATIM
)
add_custom_target(vamp-zero-image ALL DEPENDS ${VAMP_ZERO_IMAGE_TAR})
add_custom_target(vamp_zero_image ALL DEPENDS ${VAMP_ZERO_IMAGE_TAR})
install(FILES ${VAMP_ZERO_IMAGE_TAR} DESTINATION zero)
endif()
if(VAMP_BUILD_PICO_FIRMWARE)
set(VAMP_PICO_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/pico-build)
set(VAMP_PICO_UF2 ${CMAKE_CURRENT_BINARY_DIR}/product-vamp-pico2w.uf2)
set(VAMP_PICO_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/pico_build)
set(VAMP_PICO_UF2 ${CMAKE_CURRENT_BINARY_DIR}/product_vamp_pico2w.uf2)
file(GLOB VAMP_PICO_SOURCES CONFIGURE_DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
${CMAKE_CURRENT_SOURCE_DIR}/cmake/pico.cmake
${CMAKE_CURRENT_SOURCE_DIR}/cmake/pico_artwork.cmake
${CMAKE_CURRENT_SOURCE_DIR}/generator/pico_artwork.py
${CMAKE_CURRENT_SOURCE_DIR}/generator/requirements.txt
${VAMP_SHARED_PYTHON_INPUTS}
${CMAKE_CURRENT_SOURCE_DIR}/generator/palette.json
${CMAKE_CURRENT_SOURCE_DIR}/generator/theme.py
${CMAKE_CURRENT_SOURCE_DIR}/cmake/build_python.cmake
${CMAKE_CURRENT_SOURCE_DIR}/cmake/theme.cmake
${CMAKE_CURRENT_SOURCE_DIR}/package/assets/fonts/petaluma/PetalumaScript.otf
${CMAKE_CURRENT_SOURCE_DIR}/cmake/vamp_options.cmake
${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp
@@ -265,12 +274,15 @@ if(VAMP_BUILD_PICO_FIRMWARE)
"${VAMP_ZERO_HOST}"
"${VAMP_ZERO_PORT}"
"${modulus_INCLUDE_DIR}"
"${Python3_EXECUTABLE}"
"${MODULUS_PYTHON_RUNNER}"
"${MODULUS_PYTHON_ROOT}"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS
package/scripts/build_pico_firmware.sh
${VAMP_PICO_SOURCES}
VERBATIM
)
add_custom_target(vamp-pico-firmware ALL DEPENDS ${VAMP_PICO_UF2})
add_custom_target(vamp_pico_firmware ALL DEPENDS ${VAMP_PICO_UF2})
install(FILES ${VAMP_PICO_UF2} DESTINATION pico)
endif()