include(GNUInstallDirs) include(CTest) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) find_package(modulus CONFIG REQUIRED COMPONENTS boost_json openssl) find_package(Threads REQUIRED) find_package(ligo CONFIG REQUIRED) find_package(noto CONFIG REQUIRED) find_package(luma CONFIG REQUIRED) find_package(sonus CONFIG REQUIRED) find_package(Python3 COMPONENTS Interpreter REQUIRED) execute_process( COMMAND git rev-parse --short=12 HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE VAMP_GIT_SHA OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) if(NOT VAMP_GIT_SHA) set(VAMP_GIT_SHA dev) endif() set(VAMP_STYLE_SOURCES src/vamp_style.cpp src/vamp_style/font.cpp ) add_library(vamp-style STATIC ${VAMP_STYLE_SOURCES}) 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 modulus::modulus ) set(VAMP_PROTOCOL_SOURCES src/vamp_protocol/page_control.cpp ) 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 modulus::modulus ) set(VAMP_CORE_SOURCES src/vamp_zero/app.cpp src/vamp_zero/audio.cpp src/vamp_zero/color.cpp src/vamp_zero/config.cpp src/vamp_zero/database.cpp src/vamp_zero/errors.cpp src/vamp_zero/library.cpp src/vamp_zero/navigation.cpp src/vamp_zero/page_control.cpp src/vamp_zero/portal.cpp src/vamp_zero/score.cpp src/vamp_zero/types.cpp src/vamp_zero/ui.cpp ) add_library(vamp-zero-core STATIC ${VAMP_CORE_SOURCES}) 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 VAMP_VERSION="${PROJECT_VERSION}" VAMP_GIT_SHA="${VAMP_GIT_SHA}" ) target_link_libraries(vamp-zero-core PUBLIC vamp-style vamp-protocol modulus::modulus modulus::boost_json modulus::openssl Threads::Threads ligo::ligo noto::noto luma::luma sonus::sonus ) 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) endif() set(VAMP_BUNDLE_DIR ${CMAKE_CURRENT_BINARY_DIR}/bundle) set(VAMP_MANIFEST ${VAMP_BUNDLE_DIR}/manifest.json) configure_file(package/manifest.json.in ${VAMP_MANIFEST} @ONLY) file(GLOB_RECURSE VAMP_GENERATOR_INPUTS CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/data/*.json ${CMAKE_CURRENT_SOURCE_DIR}/data/**/*.json ${CMAKE_CURRENT_SOURCE_DIR}/generator/*.py ${CMAKE_CURRENT_SOURCE_DIR}/generator/**/*.py ${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) add_custom_command( OUTPUT ${VAMP_GENERATED_ASSETS_STAMP} COMMAND ${Python3_EXECUTABLE} -m generator --data-dir ${CMAKE_CURRENT_SOURCE_DIR}/data --output-dir ${VAMP_GENERATED_ASSETS_DIR} --static-assets-dir ${CMAKE_CURRENT_SOURCE_DIR}/package/assets --clean --check COMMAND ${CMAKE_COMMAND} -E touch ${VAMP_GENERATED_ASSETS_STAMP} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${VAMP_GENERATOR_INPUTS} VERBATIM ) add_custom_target(vamp-generated-assets ALL DEPENDS ${VAMP_GENERATED_ASSETS_STAMP}) 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(PROGRAMS 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 DESTINATION zero/systemd ) install(FILES package/pico/wiring.md DESTINATION pico) install(FILES ${VAMP_MANIFEST} DESTINATION .) if(VAMP_BUILD_ZERO_IMAGE OR VAMP_BUILD_PICO_FIRMWARE) find_program(BASH_EXECUTABLE bash REQUIRED) 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) 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 $ ${VAMP_ZERO_IMAGE_CONTEXT}/usr/bin/vamp-zero COMMAND ${CMAKE_COMMAND} -E copy package/zero/Dockerfile ${VAMP_ZERO_IMAGE_CONTEXT}/Dockerfile COMMAND ${CMAKE_COMMAND} -E copy_directory ${VAMP_GENERATED_ASSETS_DIR} ${VAMP_ZERO_IMAGE_CONTEXT}/usr/share/product-vamp 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 package/scripts/build_zero_image.sh package/zero/Dockerfile package/config/vamp.example.json ${VAMP_GENERATED_ASSETS_STAMP} VERBATIM ) 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) 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/vamp_options.cmake ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp ${CMAKE_CURRENT_SOURCE_DIR}/include/vamp_style/*.hpp ${CMAKE_CURRENT_SOURCE_DIR}/include/vamp_pico/*.h ${CMAKE_CURRENT_SOURCE_DIR}/include/vamp_pico/capi/*.h ${CMAKE_CURRENT_SOURCE_DIR}/include/vamp_pico/*.hpp ${CMAKE_CURRENT_SOURCE_DIR}/include/vamp_protocol/*.hpp ${CMAKE_CURRENT_SOURCE_DIR}/src/vamp_style.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/vamp_style/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/vamp_pico/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/vamp_protocol/*.cpp ) add_custom_command( OUTPUT ${VAMP_PICO_UF2} COMMAND ${BASH_EXECUTABLE} package/scripts/build_pico_firmware.sh ${VAMP_PICO_BUILD_DIR} ${VAMP_PICO_UF2} ${VAMP_PICO_SDK_VERSION} "${VAMP_PICO_WIFI_SSID}" "${VAMP_PICO_WIFI_PASSPHRASE}" "${VAMP_ZERO_HOST}" "${VAMP_ZERO_PORT}" "${modulus_INCLUDE_DIR}" 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}) install(FILES ${VAMP_PICO_UF2} DESTINATION pico) endif()