Skip to content

Commit

Permalink
Make FindSlint even more generic
Browse files Browse the repository at this point in the history
 - by downloading the latest release if no version is specified
 - by allowing to select the nightly snapshot

Also remove the from-source build as that's just too target specific (in terms of expected features).
  • Loading branch information
tronical committed Aug 30, 2024
1 parent 065ea6b commit bb53678
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 102 deletions.
6 changes: 3 additions & 3 deletions stm32h735g-dk/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ set(SLINT_STYLE "fluent-light")

list(PREPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

# Remove this when 1.8.0 is out
set(SLINT_GITHUB_RELEASE "nightly" CACHE STRING "")
set(SLINT_TARGET_ARCHITECTURE thumbv7em-none-eabihf)
find_package(Slint 1.8.0)
# Remove once 1.8.0 is out
set(SLINT_USE_NIGHTLY TRUE)
find_package(Slint)

set(DEFAULT_SLINT_EMBED_RESOURCES embed-for-software-renderer)

Expand Down
139 changes: 96 additions & 43 deletions stm32h735g-dk/cmake/FindSlint.cmake
Original file line number Diff line number Diff line change
@@ -1,9 +1,68 @@
# FindSlint
# ---------
#
# This modules attempts to locate an installation of Slint as if you called `find_package(Slint ... CONFIG ...)`,
# searching in `CMAKE_PREFIX_PATH`, etc. If that fails, this module will attempt to download pre-built Slint binaries
# from https://github.com/slint-ui/slint/releases, extract them into `${CMAKE_BINARY_DIR}/slint-prebuilt`, and it available.
#
# Set the VERSION argument passed to `find_package` to `night` to build against current Slint development snapshots.
#
# The following variables may be set to affect the behaviour:
#
# `SLINT_TARGET_ARCHITECTURE`: Set this to the desired target architecture. The format of this string is matched against
# the `Slint-cpp-*-$SLINT_TARGET_ARCHITECTURE.tar.gz` pre-built assets on the GitHub releases. For example, if you're targeting
# STM32 ARM architectures, you'd set this to `thumbv7em-none-eabihf`. If not set, this module will attempt to detect if compilation
# is happening in an ESP-IDF cross-compilation environment and detect the architecture accordingly, otherwise
# `${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}` is used.
#
# `SLINT_USE_NIGHTLY`: When `find_package(Slint)` is called without a version, the latest release is selected. Set this variable
# to true, to pick the nightly snapshot of Slint instead.

function(find_nightly_version out_version)
set(nightly_release_json "${CMAKE_BINARY_DIR}/slint-prebuilt/nightly.json")
file(DOWNLOAD "https://api.github.com/repos/slint-ui/slint/releases/tags/nightly" "${nightly_release_json}"
STATUS download_status
HTTPHEADER "Accept: application/vnd.github+json"
HTTPHEADER "X-GitHub-Api-Version: 2022-11-28"
)
list(GET download_status 0 download_code)
if (NOT download_code EQUAL 0)
return()
endif()
file(READ "${nightly_release_json}" nightly_json)
string(JSON asset_count LENGTH "${nightly_json}" assets)
math(EXPR asset_count "${asset_count} - 1")
foreach (idx RANGE ${asset_count})
string(JSON asset_name GET "${nightly_json}" assets ${idx} name)
if (asset_name MATCHES "[Ss]lint-cpp-([0-9]+\.[0-9]+\.[0-9]+)-.+\.tar\.gz")
set("${out_version}" "${CMAKE_MATCH_1}" PARENT_SCOPE)
endif()
endforeach()
endfunction()

function(get_latest_slint_release out_version)
set(release_json "${CMAKE_BINARY_DIR}/slint-prebuilt/latest.json")
file(DOWNLOAD "https://api.github.com/repos/slint-ui/slint/releases/latest" "${release_json}"
STATUS download_status
HTTPHEADER "Accept: application/vnd.github+json"
HTTPHEADER "X-GitHub-Api-Version: 2022-11-28"
)
list(GET download_status 0 download_code)
if (NOT download_code EQUAL 0)
return()
endif()
file(READ "${release_json}" json)
string(JSON name GET "${json}" name)
set("${out_version}" "${name}" PARENT_SCOPE)
endfunction()

function(try_download_prebuilt_slint_binary slint_version rust_target)

if (DEFINED CACHE{SLINT_GITHUB_RELEASE})
set(github_release $CACHE{SLINT_GITHUB_RELEASE})
else()
set(github_release slint_version)
set(github_release "${slint_version}")
if (slint_version STREQUAL "nightly")
# Set this to instruct the slint-compiler download to use the same release
set(SLINT_GITHUB_RELEASE "nightly" CACHE STRING "")
find_nightly_version(slint_version)
endif()

set(prebuilt_archive_filename "Slint-cpp-${slint_version}-${rust_target}.tar.gz")
Expand All @@ -25,49 +84,43 @@ function(try_download_prebuilt_slint_binary slint_version rust_target)
find_package(Slint CONFIG)
endfunction()

function(build_slint_from_source slint_version rust_target)
set(SLINT_FEATURE_FREESTANDING ON)
set(SLINT_FEATURE_RENDERER_SOFTWARE ON)
set(DEFAULT_SLINT_EMBED_RESOURCES "embed-for-software-renderer" CACHE STRING "")
set(CMAKE_BUILD_TYPE Release)
set(BUILD_SHARED_LIBS OFF)
set(Rust_CARGO_TARGET ${rust_target})

if ($CACHE{SLINT_GITHUB_RELEASE} STREQUAL "nightly")
set(git_tag "master")
else()
set(git_tag "v${slint_version}")
find_package(Slint ${Slint_FIND_VERSION} QUIET CONFIG)
if (NOT TARGET Slint::Slint)
if (NOT SLINT_TARGET_ARCHITECTURE)
if(WIN32)
if(MSVC)
set(compiler_suffix "-MSVC")
elseif(MINGW)
set(compiler_suffix "-MinGW")
endif()
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(CPACK_SYSTEM_NAME win64)
else()
set(CPACK_SYSTEM_NAME win32)
endif()
set(SLINT_TARGET_ARCHITECTURE "${CPACK_SYSTEM_NAME}${compiler_suffix}")
elseif (CONFIG_IDF_TARGET_ARCH_XTENSA)
set(SLINT_TARGET_ARCHITECTURE "xtensa-${IDF_TARGET}-none-elf")
elseif(CONFIG_IDF_TARGET_ARCH_RISCV)
if (CONFIG_IDF_TARGET_ESP32C6 OR CONFIG_IDF_TARGET_ESP32C5 OR CONFIG_IDF_TARGET_ESP32H2)
set(SLINT_TARGET_ARCHITECTURE "riscv32imac-esp-espidf")
elseif (CONFIG_IDF_TARGET_ESP32P4)
set(SLINT_TARGET_ARCHITECTURE "riscv32imafc-esp-espidf")
else ()
set(SLINT_TARGET_ARCHITECTURE "riscv32imc-esp-espidf")
endif()
else()
set(SLINT_TARGET_ARCHITECTURE "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
endif()
endif()

include(FetchContent)
FetchContent_Declare(
Slint
GIT_REPOSITORY https://github.com/slint-ui/slint
GIT_TAG ${git_tag}
SOURCE_SUBDIR api/cpp
)
FetchContent_MakeAvailable(Slint)
endfunction()

if (NOT SLINT_TARGET_ARCHITECTURE)
if(WIN32)
if(MSVC)
set(compiler_suffix "-MSVC")
elseif(MINGW)
set(compiler_suffix "-MinGW")
endif()
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(CPACK_SYSTEM_NAME win64)
if (NOT DEFINED Slint_FIND_VERSION)
if (SLINT_USE_NIGHTLY)
set(Slint_FIND_VERSION "nightly")
else()
set(CPACK_SYSTEM_NAME win32)
get_latest_slint_release(Slint_FIND_VERSION)
endif()
set(SLINT_TARGET_ARCHITECTURE "${CPACK_SYSTEM_NAME}${compiler_suffix}")
else()
set(SLINT_TARGET_ARCHITECTURE "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
endif()
endif()

try_download_prebuilt_slint_binary(${Slint_FIND_VERSION} ${SLINT_TARGET_ARCHITECTURE})
if (NOT TARGET Slint::Slint)
build_slint_from_source(${Slint_FIND_VERSION} ${SLINT_TARGET_ARCHITECTURE})
try_download_prebuilt_slint_binary(${Slint_FIND_VERSION} ${SLINT_TARGET_ARCHITECTURE})
endif()
6 changes: 3 additions & 3 deletions stm32h747i-disco/CM7/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ set(SLINT_STYLE "fluent-light")

list(PREPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../cmake")

# Remove this when 1.8.0 is out
set(SLINT_GITHUB_RELEASE "nightly" CACHE STRING "")
set(SLINT_TARGET_ARCHITECTURE thumbv7em-none-eabihf)
find_package(Slint 1.8.0)
# Remove once 1.8.0 is out
set(SLINT_USE_NIGHTLY TRUE)
find_package(Slint)

set(DEFAULT_SLINT_EMBED_RESOURCES embed-for-software-renderer)

Expand Down
149 changes: 96 additions & 53 deletions stm32h747i-disco/cmake/FindSlint.cmake
Original file line number Diff line number Diff line change
@@ -1,9 +1,68 @@
# FindSlint
# ---------
#
# This modules attempts to locate an installation of Slint as if you called `find_package(Slint ... CONFIG ...)`,
# searching in `CMAKE_PREFIX_PATH`, etc. If that fails, this module will attempt to download pre-built Slint binaries
# from https://github.com/slint-ui/slint/releases, extract them into `${CMAKE_BINARY_DIR}/slint-prebuilt`, and it available.
#
# Set the VERSION argument passed to `find_package` to `night` to build against current Slint development snapshots.
#
# The following variables may be set to affect the behaviour:
#
# `SLINT_TARGET_ARCHITECTURE`: Set this to the desired target architecture. The format of this string is matched against
# the `Slint-cpp-*-$SLINT_TARGET_ARCHITECTURE.tar.gz` pre-built assets on the GitHub releases. For example, if you're targeting
# STM32 ARM architectures, you'd set this to `thumbv7em-none-eabihf`. If not set, this module will attempt to detect if compilation
# is happening in an ESP-IDF cross-compilation environment and detect the architecture accordingly, otherwise
# `${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}` is used.
#
# `SLINT_USE_NIGHTLY`: When `find_package(Slint)` is called without a version, the latest release is selected. Set this variable
# to true, to pick the nightly snapshot of Slint instead.

function(find_nightly_version out_version)
set(nightly_release_json "${CMAKE_BINARY_DIR}/slint-prebuilt/nightly.json")
file(DOWNLOAD "https://api.github.com/repos/slint-ui/slint/releases/tags/nightly" "${nightly_release_json}"
STATUS download_status
HTTPHEADER "Accept: application/vnd.github+json"
HTTPHEADER "X-GitHub-Api-Version: 2022-11-28"
)
list(GET download_status 0 download_code)
if (NOT download_code EQUAL 0)
return()
endif()
file(READ "${nightly_release_json}" nightly_json)
string(JSON asset_count LENGTH "${nightly_json}" assets)
math(EXPR asset_count "${asset_count} - 1")
foreach (idx RANGE ${asset_count})
string(JSON asset_name GET "${nightly_json}" assets ${idx} name)
if (asset_name MATCHES "[Ss]lint-cpp-([0-9]+\.[0-9]+\.[0-9]+)-.+\.tar\.gz")
set("${out_version}" "${CMAKE_MATCH_1}" PARENT_SCOPE)
endif()
endforeach()
endfunction()

function(get_latest_slint_release out_version)
set(release_json "${CMAKE_BINARY_DIR}/slint-prebuilt/latest.json")
file(DOWNLOAD "https://api.github.com/repos/slint-ui/slint/releases/latest" "${release_json}"
STATUS download_status
HTTPHEADER "Accept: application/vnd.github+json"
HTTPHEADER "X-GitHub-Api-Version: 2022-11-28"
)
list(GET download_status 0 download_code)
if (NOT download_code EQUAL 0)
return()
endif()
file(READ "${release_json}" json)
string(JSON name GET "${json}" name)
set("${out_version}" "${name}" PARENT_SCOPE)
endfunction()

function(try_download_prebuilt_slint_binary slint_version rust_target)

if (DEFINED CACHE{SLINT_GITHUB_RELEASE})
set(github_release $CACHE{SLINT_GITHUB_RELEASE})
else()
set(github_release slint_version)
set(github_release "${slint_version}")
if (slint_version STREQUAL "nightly")
# Set this to instruct the slint-compiler download to use the same release
set(SLINT_GITHUB_RELEASE "nightly" CACHE STRING "")
find_nightly_version(slint_version)
endif()

set(prebuilt_archive_filename "Slint-cpp-${slint_version}-${rust_target}.tar.gz")
Expand All @@ -25,59 +84,43 @@ function(try_download_prebuilt_slint_binary slint_version rust_target)
find_package(Slint CONFIG)
endfunction()

function(build_slint_from_source slint_version rust_target)
set(SLINT_FEATURE_FREESTANDING ON)
set(SLINT_FEATURE_RENDERER_SOFTWARE ON)
set(DEFAULT_SLINT_EMBED_RESOURCES "embed-for-software-renderer" CACHE STRING "")
set(CMAKE_BUILD_TYPE Release)
set(BUILD_SHARED_LIBS OFF)
set(Rust_CARGO_TARGET ${rust_target})

if ($CACHE{SLINT_GITHUB_RELEASE} STREQUAL "nightly")
set(git_tag "master")
else()
set(git_tag "v${slint_version}")
find_package(Slint ${Slint_FIND_VERSION} QUIET CONFIG)
if (NOT TARGET Slint::Slint)
if (NOT SLINT_TARGET_ARCHITECTURE)
if(WIN32)
if(MSVC)
set(compiler_suffix "-MSVC")
elseif(MINGW)
set(compiler_suffix "-MinGW")
endif()
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(CPACK_SYSTEM_NAME win64)
else()
set(CPACK_SYSTEM_NAME win32)
endif()
set(SLINT_TARGET_ARCHITECTURE "${CPACK_SYSTEM_NAME}${compiler_suffix}")
elseif (CONFIG_IDF_TARGET_ARCH_XTENSA)
set(SLINT_TARGET_ARCHITECTURE "xtensa-${IDF_TARGET}-none-elf")
elseif(CONFIG_IDF_TARGET_ARCH_RISCV)
if (CONFIG_IDF_TARGET_ESP32C6 OR CONFIG_IDF_TARGET_ESP32C5 OR CONFIG_IDF_TARGET_ESP32H2)
set(SLINT_TARGET_ARCHITECTURE "riscv32imac-esp-espidf")
elseif (CONFIG_IDF_TARGET_ESP32P4)
set(SLINT_TARGET_ARCHITECTURE "riscv32imafc-esp-espidf")
else ()
set(SLINT_TARGET_ARCHITECTURE "riscv32imc-esp-espidf")
endif()
else()
set(SLINT_TARGET_ARCHITECTURE "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
endif()
endif()

include(FetchContent)
FetchContent_Declare(
Slint
GIT_REPOSITORY https://github.com/slint-ui/slint
GIT_TAG ${git_tag}
SOURCE_SUBDIR api/cpp
)
FetchContent_MakeAvailable(Slint)
endfunction()

if (NOT SLINT_TARGET_ARCHITECTURE)
if(WIN32)
if(MSVC)
set(compiler_suffix "-MSVC")
elseif(MINGW)
set(compiler_suffix "-MinGW")
endif()
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(CPACK_SYSTEM_NAME win64)
if (NOT DEFINED Slint_FIND_VERSION)
if (SLINT_USE_NIGHTLY)
set(Slint_FIND_VERSION "nightly")
else()
set(CPACK_SYSTEM_NAME win32)
endif()
set(SLINT_TARGET_ARCHITECTURE "${CPACK_SYSTEM_NAME}${compiler_suffix}")
elseif (CONFIG_IDF_TARGET_ARCH_XTENSA)
set(SLINT_TARGET_ARCHITECTURE "xtensa-${IDF_TARGET}-none-elf")
elseif(CONFIG_IDF_TARGET_ARCH_RISCV)
if (CONFIG_IDF_TARGET_ESP32C6 OR CONFIG_IDF_TARGET_ESP32C5 OR CONFIG_IDF_TARGET_ESP32H2)
set(SLINT_TARGET_ARCHITECTURE "riscv32imac-esp-espidf")
elseif (CONFIG_IDF_TARGET_ESP32P4)
set(SLINT_TARGET_ARCHITECTURE "riscv32imafc-esp-espidf")
else ()
set(SLINT_TARGET_ARCHITECTURE "riscv32imc-esp-espidf")
get_latest_slint_release(Slint_FIND_VERSION)
endif()
else()
set(SLINT_TARGET_ARCHITECTURE "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
endif()
endif()

try_download_prebuilt_slint_binary(${Slint_FIND_VERSION} ${SLINT_TARGET_ARCHITECTURE})
if (NOT TARGET Slint::Slint)
build_slint_from_source(${Slint_FIND_VERSION} ${SLINT_TARGET_ARCHITECTURE})
try_download_prebuilt_slint_binary(${Slint_FIND_VERSION} ${SLINT_TARGET_ARCHITECTURE})
endif()

0 comments on commit bb53678

Please sign in to comment.