Skip to content

Commit

Permalink
Fetch slang-llvm.so from correct release
Browse files Browse the repository at this point in the history
  • Loading branch information
expipiplus1 committed Aug 14, 2024
1 parent f4ff423 commit 92f7221
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 11 deletions.
24 changes: 13 additions & 11 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ include(Glob)
include(LLVM)
include(SlangTarget)
include(AutoOption)
include(GitHubRelease)

#
# Options
Expand Down Expand Up @@ -127,23 +128,24 @@ enum_option(
FETCH_BINARY
"Use a binary distribution of the slang-llvm library instead of building or using LLVM (default for Windows)"
USE_SYSTEM_LLVM
"Build slang-llvm using system-provided LLVM and Clang binaries (default for non-Windows hosts)"
"Build slang-llvm using system-provided LLVM and Clang binaries"
DISABLE
"Do not build llvm or fetch slang-llvm"
)
macro(slang_llvm_binary_url_option version filename)

if(SLANG_SLANG_LLVM_FLAVOR MATCHES FETCH_BINARY)
# If the user didn't specify a URL, find the best one now
if(NOT SLANG_SLANG_LLVM_BINARY_URL)
get_best_slang_binary_release_url(url)
if(NOT url)
message(FATAL_ERROR "Unable to find binary release for slang-llvm, please set a different SLANG_SLANG_LLVM_FLAVOR or set SLANG_SLANG_LLVM_BINARY_URL manually")
endif()
endif()
set(SLANG_SLANG_LLVM_BINARY_URL
"https://github.com/shader-slang/slang-llvm/releases/download/${version}/${filename}"
${url}
CACHE STRING
"URL specifying the location of the slang-llvm prebuilt library"
)
endmacro()
if(CMAKE_SYSTEM_NAME MATCHES "Windows")
slang_llvm_binary_url_option("v13.x-43" "slang-llvm-13.x-43-win64.zip")
elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
slang_llvm_binary_url_option("v13.x-43" "slang-llvm-v13.x-43-macosx-x86_64-release.zip")
else()
slang_llvm_binary_url_option("v13.x-43" "slang-llvm-v13.x-43-linux-x86_64-release.zip")
endif()

#
Expand Down Expand Up @@ -392,7 +394,7 @@ if(SLANG_SLANG_LLVM_FLAVOR STREQUAL "FETCH_BINARY")
endif()

set(slang_llvm_dest_object
${CMAKE_BINARY_DIR}/$<CONFIG>/${runtime_subdir}/${slang_llvm_filename}
${CMAKE_BINARY_DIR}/$<CONFIG>/${module_subdir}/${slang_llvm_filename}
)
add_custom_command(
OUTPUT ${slang_llvm_dest_object}
Expand Down
113 changes: 113 additions & 0 deletions cmake/GitHubRelease.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
function(check_release_and_get_latest owner repo version os arch out_var)
# Construct the URL for the specified version's release API endpoint
set(version_url "https://api.github.com/repos/${owner}/${repo}/releases/tags/v${version}")

# Path to save the JSON response
set(json_output_file "${CMAKE_BINARY_DIR}/release_info.json")

# Function to check if the file exists in the assets
function(check_assets_for_file json_content expected_zip found_var)
# Parse the JSON array of assets
string(JSON asset_count LENGTH "${json_content}" "assets")
set(found "FALSE")
foreach(i RANGE 0 ${asset_count})
string(JSON asset_name GET "${json_content}" "assets" ${i} "name")
if("${asset_name}" STREQUAL "${expected_zip}")
set(found "TRUE")
break()
endif()
endforeach()
set(${found_var} "${found}" PARENT_SCOPE)
endfunction()

# Download the specified release info from GitHub
file(DOWNLOAD "${version_url}" "${json_output_file}" STATUS download_status)

# Check if the download was successful
list(GET download_status 0 status_code)
if(status_code EQUAL 0)
# Read the downloaded JSON file
file(READ "${json_output_file}" json_content)

# Construct the expected zip file name
set(expected_zip "slang-${version}-${os}-${arch}.zip")

# Check if the specified version contains the expected ZIP file
check_assets_for_file("${json_content}" "${expected_zip}" file_found)

if(file_found)
set(${out_var} "${version}" PARENT_SCOPE)
endif()
return()
endif()

message(WARNING "Failed to download release info for version ${version} from ${version_url}.\nFalling back to latest version if it differs")

# If not found, get the latest release
set(latest_release_url "https://api.github.com/repos/${owner}/${repo}/releases/latest")

# Download the latest release info
file(DOWNLOAD "${latest_release_url}" "${json_output_file}" STATUS download_status)

# Check if the download was successful
list(GET download_status 0 status_code)
if(NOT status_code EQUAL 0)
message(WARNING "Failed to download latest release info from ${latest_release_url}")
return()
endif()

# Read the latest release JSON
file(READ "${json_output_file}" latest_json_content)

string(JSON latest_release_tag GET "${latest_json_content}" "tag_name")
string(REGEX REPLACE "^v" "" latest_version "${latest_release_tag}")

if(latest_version EQUAL version)
# The versions are the same
message(WARNING "No release binary for ${os}-${arch} exists for ${version}")
return()
endif()

# Construct the expected zip file name
set(expected_zip "slang-${latest_version}-${os}-${arch}.zip")

# Check if the expected ZIP file is in the latest release
check_assets_for_file("${latest_json_content}" "${expected_zip}" file_found_latest)

if(file_found_latest)
# Extract the latest release tag name and set it as the output variable
set(${out_var} "${latest_version}" PARENT_SCOPE)
else()
message(WARNING "No release binary for ${os}-${arch} exists for ${version} or the latest version ${latest_version}")
return()
endif()
endfunction()

function(get_best_slang_binary_release_url out_var)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64")
set(arch "x86_64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
set(arch "aarch64")
else()
message(WARNING "Unsupported architecture for slang binary releases: ${CMAKE_SYSTEM_PROCESSOR}")
return()
endif()

if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(os "windows")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(os "macos")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(os "linux")
else()
message(WARNING "Unsupported operating system for slang binary releases: ${CMAKE_SYSTEM_NAME}")
return()
endif()

set(owner "shader-slang")
set(repo "slang")

check_release_and_get_latest(${owner} ${repo} ${SLANG_VERSION_NUMERIC} ${os} ${arch} release_version)

set(${out_var} "https://github.com/${owner}/${repo}/releases/download/v${release_version}/slang-${release_version}-${os}-${arch}.zip" PARENT_SCOPE)
endfunction()

0 comments on commit 92f7221

Please sign in to comment.