vulkan-loader: 1.0.39.1 -> 1.0.42.2

This commit is contained in:
Benjamin Saunders 2017-04-01 12:28:59 -07:00
parent d9b36c36c5
commit 201960922c
6 changed files with 15 additions and 425 deletions

View File

@ -2,19 +2,17 @@
stdenv.mkDerivation rec {
name = "glslang-git-${version}";
version = "2016-12-21";
version = "2017-03-29";
# `vulkan-loader` requires a specific version of `glslang` as specified in
# `<vulkan-loader-repo>/glslang_revision`.
# `<vulkan-loader-repo>/external_revisions/glslang_revision`.
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "glslang";
rev = "807a0d9e2f4e176f75d62ac3c179c81800ec2608";
sha256 = "02jckgihqhagm73glipb4c6ri5fr3pnbxb5vrznn2vppyfdfghbj";
rev = "714e58b2fc5a45714596e6aa2f6ac8f64260365c";
sha256 = "0ihnd0c4mr6ppbv9g7z1abrn8vx66simfzx5q48nqcpnywn35jxv";
};
patches = [ ./install-headers.patch ];
buildInputs = [ cmake bison ];
enableParallelBuilding = true;
@ -23,5 +21,6 @@ stdenv.mkDerivation rec {
description = "Khronos reference front-end for GLSL and ESSL";
license = licenses.asl20;
platforms = platforms.linux;
maintainers = [ maintainers.ralith ];
};
}

View File

@ -1,35 +0,0 @@
diff --git a/SPIRV/CMakeLists.txt b/SPIRV/CMakeLists.txt
index c538e84..6ece1ab 100755
--- a/SPIRV/CMakeLists.txt
+++ b/SPIRV/CMakeLists.txt
@@ -34,8 +34,9 @@ if(ENABLE_AMD_EXTENSIONS)
endif(ENABLE_AMD_EXTENSIONS)
if(ENABLE_NV_EXTENSIONS)
- set(HEADERS
- GLSL.ext.NV.h)
+ list(APPEND
+ HEADERS
+ GLSL.ext.NV.h)
endif(ENABLE_NV_EXTENSIONS)
add_library(SPIRV STATIC ${SOURCES} ${HEADERS})
@@ -51,3 +52,5 @@ endif(WIN32)
install(TARGETS SPIRV SPVRemapper
ARCHIVE DESTINATION lib)
+
+install(FILES ${HEADERS} ${SPVREMAP_HEADERS} DESTINATION include/SPIRV/)
diff --git a/glslang/CMakeLists.txt b/glslang/CMakeLists.txt
index 95d4bdd..e7fda90 100644
--- a/glslang/CMakeLists.txt
+++ b/glslang/CMakeLists.txt
@@ -93,3 +93,8 @@ endif(WIN32)
install(TARGETS glslang
ARCHIVE DESTINATION lib)
+
+foreach(file ${HEADERS})
+ get_filename_component(dir ${file} DIRECTORY)
+ install(FILES ${file} DESTINATION include/glslang/${dir})
+endforeach()

View File

@ -3,12 +3,12 @@
libXext, wayland, mesa_noglu }:
let
version = "1.0.39.1";
version = "1.0.42.2";
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "Vulkan-LoaderAndValidationLayers";
rev = "sdk-${version}";
sha256 = "0y9zzrnjjjza2kkf5jfsdqhn98md6rsq0hb7jg62z2dipzky7zdp";
sha256 = "0na1ax2cgv6w29213mby56mndfsj3iizj3n5pbpy4s4p7ij9kdgn";
};
in
@ -26,8 +26,6 @@ stdenv.mkDerivation rec {
"-DFALLBACK_DATA_DIRS=${mesa_noglu.driverLink}/share:/usr/local/share:/usr/share"
];
patches = [ ./use-xdg-paths.patch ./fallback-paths.patch ];
outputs = [ "out" "dev" "demos" ];
preConfigure = ''
@ -59,5 +57,6 @@ stdenv.mkDerivation rec {
homepage = "http://www.lunarg.com";
platforms = platforms.linux;
license = licenses.asl20;
maintainers = [ maintainers.ralith ];
};
}

View File

@ -1,52 +0,0 @@
commit a59b141559a8c1813da438b97e5f79eeb6cc7642
Author: Benjamin Saunders <ben.e.saunders@gmail.com>
Date: Sun Feb 19 11:14:24 2017 -0800
loader: Configurable fallback search paths
This makes it easier for non-FHS distributions to behave well when the loader
is used by a SUID process or in an otherwise unusual environment.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a43d264..d28b3f5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,6 +16,11 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package(PythonInterp 3 REQUIRED)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ set(FALLBACK_CONFIG_DIRS "/etc/xdg" CACHE STRING
+ "Search path to use when XDG_CONFIG_DIRS is unset or empty or the current process is SUID/SGID. Default is freedesktop compliant.")
+ set(FALLBACK_DATA_DIRS "/usr/local/share:/usr/share" CACHE STRING
+ "Search path to use when XDG_DATA_DIRS is unset or empty or the current process is SUID/SGID. Default is freedesktop compliant.")
+
include(FindPkgConfig)
option(BUILD_WSI_XCB_SUPPORT "Build XCB WSI support" ON)
option(BUILD_WSI_XLIB_SUPPORT "Build Xlib WSI support" ON)
@@ -285,7 +290,10 @@ run_vk_xml_generate(dispatch_table_generator.py vk_dispatch_table_helper.h)
if(NOT WIN32)
include(GNUInstallDirs)
+ add_definitions(-DFALLBACK_CONFIG_DIRS="${FALLBACK_CONFIG_DIRS}")
+ add_definitions(-DFALLBACK_DATA_DIRS="${FALLBACK_DATA_DIRS}")
add_definitions(-DSYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}")
+
# Make sure /etc is searched by the loader
if(NOT (CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/etc"))
add_definitions(-DEXTRASYSCONFDIR="/etc")
diff --git a/loader/loader.c b/loader/loader.c
index 81c37c4..83378eb 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -2644,9 +2644,9 @@ static VkResult loader_get_manifest_files(const struct loader_instance *inst, co
const char *xdgconfdirs = secure_getenv("XDG_CONFIG_DIRS");
const char *xdgdatadirs = secure_getenv("XDG_DATA_DIRS");
if (xdgconfdirs == NULL || xdgconfdirs[0] == '\0')
- xdgconfdirs = "/etc/xdg";
+ xdgconfdirs = FALLBACK_CONFIG_DIRS;
if (xdgdatadirs == NULL || xdgdatadirs[0] == '\0')
- xdgdatadirs = "/usr/local/share:/usr/share";
+ xdgdatadirs = FALLBACK_DATA_DIRS;
const size_t rel_size = strlen(relative_location);
// Leave space for trailing separators
loc_size += strlen(xdgconfdirs) + strlen(xdgdatadirs) + 2*rel_size + 2;

View File

@ -1,322 +0,0 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 27ab6e5..e59256e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -256,17 +256,10 @@ if(NOT WIN32)
include(GNUInstallDirs)
add_definitions(-DSYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}")
- add_definitions(-DDATADIR="${CMAKE_INSTALL_FULL_DATADIR}")
-
# Make sure /etc is searched by the loader
- if (NOT (CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/etc"))
+ if(NOT (CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/etc"))
add_definitions(-DEXTRASYSCONFDIR="/etc")
endif()
-
- # Make sure /usr/share is searched by the loader
- if (NOT (CMAKE_INSTALL_FULL_DATADIR STREQUAL "/usr/share"))
- add_definitions(-DEXTRADATADIR="/usr/share")
- endif()
endif()
if(UNIX)
diff --git a/loader/loader.c b/loader/loader.c
index 24758f4..af7cc85 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -2909,7 +2909,7 @@ static VkResult
loader_get_manifest_files(const struct loader_instance *inst,
const char *env_override, const char *source_override,
bool is_layer, bool warn_if_not_present,
- const char *location, const char *home_location,
+ const char *location, const char *relative_location,
struct loader_manifest_files *out_files) {
const char * override = NULL;
char *override_getenv = NULL;
@@ -2941,9 +2941,9 @@ loader_get_manifest_files(const struct loader_instance *inst,
}
#if !defined(_WIN32)
- if (location == NULL && home_location == NULL) {
+ if (location == NULL && relative_location == NULL) {
#else
- home_location = NULL;
+ relative_location = NULL;
if (location == NULL) {
#endif
loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
@@ -2962,16 +2962,89 @@ loader_get_manifest_files(const struct loader_instance *inst,
// Make a copy of the input we are using so it is not modified
// Also handle getting the location(s) from registry on Windows
if (override == NULL) {
- loc = loader_stack_alloc(strlen(location) + 1);
+ size_t loc_size = strlen(location) + 1;
+#if !defined(_WIN32)
+ const char *xdgconfdirs = secure_getenv("XDG_CONFIG_DIRS");
+ const char *xdgdatadirs = secure_getenv("XDG_DATA_DIRS");
+ if (xdgconfdirs == NULL || xdgconfdirs[0] == '\0')
+ xdgconfdirs = "/etc/xdg";
+ if (xdgdatadirs == NULL || xdgdatadirs[0] == '\0')
+ xdgdatadirs = "/usr/local/share:/usr/share";
+ const size_t rel_size = strlen(relative_location);
+ // Leave space for trailing separators
+ loc_size += strlen(xdgconfdirs) + strlen(xdgdatadirs) + 2*rel_size + 2;
+ for (const char *x = xdgconfdirs; *x; ++x)
+ if (*x == PATH_SEPARATOR) loc_size += rel_size;
+ for (const char *x = xdgdatadirs; *x; ++x)
+ if (*x == PATH_SEPARATOR) loc_size += rel_size;
+ loc_size += strlen(SYSCONFDIR) + rel_size + 1;
+#ifdef EXTRASYSCONFDIR
+ loc_size += strlen(EXTRASYSCONFDIR) + rel_size + 1;
+#endif
+#endif
+ loc = loader_stack_alloc(loc_size);
if (loc == NULL) {
loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
"loader_get_manifest_files: Failed to allocate "
"%d bytes for manifest file location.",
- strlen(location));
+ loc_size);
res = VK_ERROR_OUT_OF_HOST_MEMORY;
goto out;
}
- strcpy(loc, location);
+ char *loc_write = loc;
+#if !defined(_WIN32)
+ const char *loc_read;
+
+ loc_read = &xdgconfdirs[0];
+ for (const char *x = loc_read;; ++x) {
+ if (*x == PATH_SEPARATOR || *x == '\0') {
+ const size_t s = x - loc_read;
+ memcpy(loc_write, loc_read, s);
+ loc_write += s;
+ memcpy(loc_write, relative_location, rel_size);
+ loc_write += rel_size;
+ *loc_write++ = PATH_SEPARATOR;
+ if (*x == 0)
+ break;
+ loc_read = ++x;
+ }
+ }
+
+ memcpy(loc_write, SYSCONFDIR, strlen(SYSCONFDIR));
+ loc_write += strlen(SYSCONFDIR);
+ memcpy(loc_write, relative_location, rel_size);
+ loc_write += rel_size;
+ *loc_write++ = PATH_SEPARATOR;
+
+#ifdef EXTRASYSCONFDIR
+ memcpy(loc_write, EXTRASYSCONFDIR, strlen(EXTRASYSCONFDIR));
+ loc_write += strlen(EXTRASYSCONFDIR);
+ memcpy(loc_write, relative_location, rel_size);
+ loc_write += rel_size;
+ *loc_write++ = PATH_SEPARATOR;
+#endif
+
+ loc_read = &xdgdatadirs[0];
+ for (const char *x = loc_read;; ++x) {
+ if (*x == PATH_SEPARATOR || *x == '\0') {
+ const size_t s = x - loc_read;
+ memcpy(loc_write, loc_read, s);
+ loc_write += s;
+ memcpy(loc_write, relative_location, rel_size);
+ loc_write += rel_size;
+ *loc_write++ = PATH_SEPARATOR;
+ if (*x == 0)
+ break;
+ loc_read = ++x;
+ }
+ }
+ --loc_write;
+ *loc_write = '\0';
+#else
+ memcpy(loc_write, location, loc_size);
+ loc[loc_size-1] = '\0';
+#endif
+
#if defined(_WIN32)
VkResult reg_result = loaderGetRegistryFiles(inst, loc, &reg);
if (VK_SUCCESS != reg_result || NULL == reg) {
@@ -3122,14 +3195,14 @@ loader_get_manifest_files(const struct loader_instance *inst,
}
file = next_file;
#if !defined(_WIN32)
- if (home_location != NULL &&
+ if (relative_location != NULL &&
(next_file == NULL || *next_file == '\0') && override == NULL) {
char *xdgdatahome = secure_getenv("XDG_DATA_HOME");
size_t len;
if (xdgdatahome != NULL) {
char *home_loc = loader_stack_alloc(strlen(xdgdatahome) + 2 +
- strlen(home_location));
+ strlen(relative_location));
if (home_loc == NULL) {
loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
"loader_get_manifest_files: Failed to allocate "
@@ -3139,15 +3212,15 @@ loader_get_manifest_files(const struct loader_instance *inst,
}
strcpy(home_loc, xdgdatahome);
// Add directory separator if needed
- if (home_location[0] != DIRECTORY_SYMBOL) {
+ if (relative_location[0] != DIRECTORY_SYMBOL) {
len = strlen(home_loc);
home_loc[len] = DIRECTORY_SYMBOL;
home_loc[len + 1] = '\0';
}
- strcat(home_loc, home_location);
+ strcat(home_loc, relative_location);
file = home_loc;
next_file = loader_get_next_path(file);
- home_location = NULL;
+ relative_location = NULL;
loader_log(
inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
@@ -3160,7 +3233,7 @@ loader_get_manifest_files(const struct loader_instance *inst,
char *home = secure_getenv("HOME");
if (home != NULL) {
char *home_loc = loader_stack_alloc(strlen(home) + 16 +
- strlen(home_location));
+ strlen(relative_location));
if (home_loc == NULL) {
loader_log(
inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
@@ -3178,15 +3251,15 @@ loader_get_manifest_files(const struct loader_instance *inst,
}
strcat(home_loc, ".local/share");
- if (home_location[0] != DIRECTORY_SYMBOL) {
+ if (relative_location[0] != DIRECTORY_SYMBOL) {
len = strlen(home_loc);
home_loc[len] = DIRECTORY_SYMBOL;
home_loc[len + 1] = '\0';
}
- strcat(home_loc, home_location);
+ strcat(home_loc, relative_location);
file = home_loc;
next_file = loader_get_next_path(file);
- home_location = NULL;
+ relative_location = NULL;
loader_log(
inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
@@ -3263,7 +3336,7 @@ VkResult loader_icd_scan(const struct loader_instance *inst,
// Get a list of manifest files for ICDs
res = loader_get_manifest_files(inst, "VK_ICD_FILENAMES", NULL, false, true,
DEFAULT_VK_DRIVERS_INFO,
- HOME_VK_DRIVERS_INFO, &manifest_files);
+ RELATIVE_VK_DRIVERS_INFO, &manifest_files);
if (VK_SUCCESS != res || manifest_files.count == 0) {
goto out;
}
@@ -3490,7 +3563,7 @@ void loader_layer_scan(const struct loader_instance *inst,
if (VK_SUCCESS !=
loader_get_manifest_files(inst, LAYERS_PATH_ENV, LAYERS_SOURCE_PATH,
true, true, DEFAULT_VK_ELAYERS_INFO,
- HOME_VK_ELAYERS_INFO, &manifest_files[0])) {
+ RELATIVE_VK_ELAYERS_INFO, &manifest_files[0])) {
goto out;
}
@@ -3499,7 +3572,7 @@ void loader_layer_scan(const struct loader_instance *inst,
// overridden by LAYERS_PATH_ENV
if (VK_SUCCESS != loader_get_manifest_files(inst, NULL, NULL, true, false,
DEFAULT_VK_ILAYERS_INFO,
- HOME_VK_ILAYERS_INFO,
+ RELATIVE_VK_ILAYERS_INFO,
&manifest_files[1])) {
goto out;
}
@@ -3569,7 +3642,7 @@ void loader_implicit_layer_scan(const struct loader_instance *inst,
// overridden by LAYERS_PATH_ENV
VkResult res = loader_get_manifest_files(
inst, NULL, NULL, true, false, DEFAULT_VK_ILAYERS_INFO,
- HOME_VK_ILAYERS_INFO, &manifest_files);
+ RELATIVE_VK_ILAYERS_INFO, &manifest_files);
if (VK_SUCCESS != res || manifest_files.count == 0) {
return;
}
diff --git a/loader/vk_loader_platform.h b/loader/vk_loader_platform.h
index dc4ac10..50a7966 100644
--- a/loader/vk_loader_platform.h
+++ b/loader/vk_loader_platform.h
@@ -57,47 +57,9 @@
#define VULKAN_ILAYERCONF_DIR "implicit_layer.d"
#define VULKAN_LAYER_DIR "layer"
-#if defined(EXTRASYSCONFDIR)
-#define EXTRA_DRIVERS_SYSCONFDIR_INFO ":" \
- EXTRASYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR
-#define EXTRA_ELAYERS_SYSCONFDIR_INFO ":" \
- EXTRASYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR
-#define EXTRA_ILAYERS_SYSCONFDIR_INFO ":" \
- EXTRASYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR
-#else
-#define EXTRA_DRIVERS_SYSCONFDIR_INFO
-#define EXTRA_ELAYERS_SYSCONFDIR_INFO
-#define EXTRA_ILAYERS_SYSCONFDIR_INFO
-#endif
-
-#if defined(EXTRADATADIR)
-#define EXTRA_DRIVERS_DATADIR_INFO ":" \
- EXTRADATADIR VULKAN_DIR VULKAN_ICDCONF_DIR
-#define EXTRA_ELAYERS_DATADIR_INFO ":" \
- EXTRADATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR
-#define EXTRA_ILAYERS_DATADIR_INFO ":" \
- EXTRADATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR
-#else
-#define EXTRA_DRIVERS_DATADIR_INFO
-#define EXTRA_ELAYERS_DATADIR_INFO
-#define EXTRA_ILAYERS_DATADIR_INFO
-#endif
-
-#define DEFAULT_VK_DRIVERS_INFO \
- SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":" \
- DATADIR VULKAN_DIR VULKAN_ICDCONF_DIR \
- EXTRA_DRIVERS_SYSCONFDIR_INFO \
- EXTRA_DRIVERS_DATADIR_INFO
-#define DEFAULT_VK_ELAYERS_INFO \
- SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":" \
- DATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR \
- EXTRA_ELAYERS_SYSCONFDIR_INFO \
- EXTRA_ELAYERS_DATADIR_INFO
-#define DEFAULT_VK_ILAYERS_INFO \
- SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":" \
- DATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR \
- EXTRA_ILAYERS_SYSCONFDIR_INFO \
- EXTRA_ILAYERS_DATADIR_INFO
+#define DEFAULT_VK_DRIVERS_INFO ""
+#define DEFAULT_VK_ELAYERS_INFO ""
+#define DEFAULT_VK_ILAYERS_INFO ""
#define DEFAULT_VK_DRIVERS_PATH ""
#if !defined(DEFAULT_VK_LAYERS_PATH)
@@ -109,9 +71,9 @@
#endif
#define LAYERS_PATH_ENV "VK_LAYER_PATH"
-#define HOME_VK_DRIVERS_INFO VULKAN_DIR VULKAN_ICDCONF_DIR
-#define HOME_VK_ELAYERS_INFO VULKAN_DIR VULKAN_ELAYERCONF_DIR
-#define HOME_VK_ILAYERS_INFO VULKAN_DIR VULKAN_ILAYERCONF_DIR
+#define RELATIVE_VK_DRIVERS_INFO VULKAN_DIR VULKAN_ICDCONF_DIR
+#define RELATIVE_VK_ELAYERS_INFO VULKAN_DIR VULKAN_ELAYERCONF_DIR
+#define RELATIVE_VK_ILAYERS_INFO VULKAN_DIR VULKAN_ILAYERCONF_DIR
// C99:
#define PRINTF_SIZE_T_SPECIFIER "%zu"
@@ -251,9 +213,9 @@ loader_platform_thread_cond_broadcast(loader_platform_thread_cond *pCond) {
#define LAYERS_SOURCE_PATH NULL
#endif
#define LAYERS_PATH_ENV "VK_LAYER_PATH"
-#define HOME_VK_DRIVERS_INFO ""
-#define HOME_VK_ELAYERS_INFO ""
-#define HOME_VK_ILAYERS_INFO ""
+#define RELATIVE_VK_DRIVERS_INFO ""
+#define RELATIVE_VK_ELAYERS_INFO ""
+#define RELATIVE_VK_ILAYERS_INFO ""
#define PRINTF_SIZE_T_SPECIFIER "%Iu"
// File IO

View File

@ -4,18 +4,18 @@ let
spirv_sources = {
# `vulkan-loader` requires a specific version of `spirv-tools` and `spirv-headers` as specified in
# `<vulkan-loader-repo>/spirv-tools_revision`.
# `<vulkan-loader-repo>/external_revisions/spirv-tools_revision`.
tools = fetchFromGitHub {
owner = "KhronosGroup";
repo = "SPIRV-Tools";
rev = "37422e9dba1a3a8cb8028b779dd546d43add6ef8";
sha256 = "0sp2p4wg902clq0fr94vj19vyv43cq333jjxr0mjzay8dw2h4yzk";
rev = "7fe8a57a5bd72094e91f9f93e51dac2f2461dcb4";
sha256 = "0rh25y1k3m3f1nqs032lh3mng5qfw9kqn6xv9yzzm47i1i0b6hmr";
};
headers = fetchFromGitHub {
owner = "KhronosGroup";
repo = "SPIRV-Headers";
rev = "c470b68225a04965bf87d35e143ae92f831e8110";
sha256 = "18jgcpmm0ixp6314r5w144l3wayxjkmwqgx8dk5jgyw36dammkwd";
rev = "6c08995e6e7b94129e6086c78198c77111f2f262";
sha256 = "07m12wm9prib7hldj7pbc8vwnj0x6llgx4shzgy8x4xbhbafawws";
};
};
@ -23,7 +23,7 @@ in
stdenv.mkDerivation rec {
name = "spirv-tools-${version}";
version = "2016-12-19";
version = "2017-03-23";
src = spirv_sources.tools;
patchPhase = ''ln -sv ${spirv_sources.headers} external/spirv-headers'';
@ -40,5 +40,6 @@ stdenv.mkDerivation rec {
description = "The SPIR-V Tools project provides an API and commands for processing SPIR-V modules";
license = licenses.asl20;
platforms = platforms.linux;
maintainers = [ maintainers.ralith ];
};
}