From 5453bd13dbeac2bf24642a5db37e61fa05550f29 Mon Sep 17 00:00:00 2001 From: star9029 Date: Thu, 2 May 2024 23:10:06 +0800 Subject: [PATCH] shaderc: improve deps (#3926) * shaderc: improve deps * glslang: fix old version test * glslang: fix glslang run * glslang: fix binary name * glslang: add missing define * shaderc: fix codegen, improve configs * shaderc: try to fix link order * shaderc: fix link order * shaderc: fix runenvs * glslang: improve xmake.lua * glslang: use trycp for plat == host --- packages/g/glslang/xmake.lua | 13 +++++- packages/s/shaderc/xmake.lua | 89 ++++++++++++++++++++++++++++++++---- 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/packages/g/glslang/xmake.lua b/packages/g/glslang/xmake.lua index e7c1344da..47c71f943 100644 --- a/packages/g/glslang/xmake.lua +++ b/packages/g/glslang/xmake.lua @@ -32,6 +32,8 @@ package("glslang") add_syslinks("pthread") end + add_defines("ENABLE_HLSL") + on_load(function (package) if package:config("binaryonly") then package:set("kind", "binary") @@ -78,12 +80,21 @@ package("glslang") if not package:config("binaryonly") then package:add("links", "glslang", "MachineIndependent", "GenericCodeGen", "OGLCompiler", "OSDependent", "HLSL", "SPIRV", "SPVRemapper") end + + -- https://github.com/KhronosGroup/glslang/releases/tag/12.3.0 + local bindir = package:installdir("bin") + local glslangValidator = path.join(bindir, "glslangValidator" .. (is_host("windows") and ".exe" or "")) + if not os.isfile(glslangValidator) then + local glslang = path.join(bindir, "glslang" .. (is_host("windows") and ".exe" or "")) + os.trycp(glslang, glslangValidator) + end end) on_test(function (package) if not package:is_cross() then - os.vrun("glslang --version") + os.vrun("glslangValidator --version") end + if not package:config("binaryonly") then assert(package:has_cxxfuncs("ShInitialize", {configs = {languages = "c++11"}, includes = "glslang/Public/ShaderLang.h"})) end diff --git a/packages/s/shaderc/xmake.lua b/packages/s/shaderc/xmake.lua index 4d5561706..4c95fae68 100644 --- a/packages/s/shaderc/xmake.lua +++ b/packages/s/shaderc/xmake.lua @@ -1,18 +1,19 @@ package("shaderc") - set_homepage("https://github.com/google/shaderc") set_description("A collection of tools, libraries, and tests for Vulkan shader compilation.") set_license("Apache-2.0") add_urls("https://github.com/google/shaderc/archive/refs/tags/$(version).tar.gz", "https://github.com/google/shaderc.git") + add_versions("v2022.2", "517d36937c406858164673db696dc1d9c7be7ef0960fbf2965bfef768f46b8c0") - if is_plat("windows") then + add_configs("exceptions", {description = "Enable exception handling", default = true, type = "boolean"}) + if is_plat("windows", "wasm") then add_configs("shared", {description = "Build shared library.", default = false, type = "boolean", readonly = true}) end - add_deps("cmake", "python 3.x", {kind = "binary"}) + add_deps("cmake") if is_plat("linux") then add_syslinks("pthread") @@ -21,7 +22,16 @@ package("shaderc") on_load(function (package) if package:is_binary() then package:set("kind", "binary") + else + if package:version():ge("2022.3") then + package:add("deps", "glslang") + else + -- real version: glslang <1.3.231.0 + package:add("deps", "glslang <=1.3.211") + end end + package:add("deps", "spirv-tools", "spirv-headers") + if package:config("shared") then package:add("links", "shaderc_shared") else @@ -35,22 +45,81 @@ package("shaderc") end end) - on_install("linux", "windows", "macosx", function (package) - os.execv("python3", {"./utils/git-sync-deps"}) - package:addenv("PATH", "bin") - local configs = {"-DSHADERC_ENABLE_EXAMPLES=OFF", "-DSHADERC_SKIP_TESTS=ON", "-DSHADERC_ENABLE_COPYRIGHT_CHECK=OFF"} + on_install(function (package) + local opt = {} + opt.packagedeps = {"glslang", "spirv-tools", "spirv-headers"} + io.replace("CMakeLists.txt", "add_subdirectory(third_party)", "", {plain = true}) + io.replace("libshaderc_util/src/compiler.cc", "SPIRV/GlslangToSpv.h", "glslang/SPIRV/GlslangToSpv.h", {plain = true}) + + if not package:has_tool("sh", "link") then + local links = {} + for _, dep in ipairs({"glslang", "spirv-tools"}) do + local fetchinfo = package:dep(dep):fetch() + if fetchinfo then + for _, link in ipairs(fetchinfo.links) do + table.insert(links, link) + end + end + end + io.replace("glslc/CMakeLists.txt", "glslang OSDependent OGLCompiler HLSL glslang SPIRV", "", {plain = true}) + io.replace("libshaderc_util/CMakeLists.txt", "glslang OSDependent OGLCompiler HLSL glslang SPIRV", table.concat(links, " "), {plain = true}) + links = table.join({"shaderc", "shaderc_util"}, links) + io.replace("glslc/CMakeLists.txt", "shaderc_util shaderc", table.concat(links, " "), {plain = true}) + end + -- glslc --version + local version_str = format("shaderc %s\nspirv-tools %s\nglslang %s\0", + package:version(), + package:dep("spirv-tools"):version(), + package:dep("glslang"):version() + ) + + -- const char[] = {'s', 'h' ...}; + local version_c_array = "{" + for i = 1, #version_str do + local char = version_str:sub(i, i) + if char == "\n" then + char = [[\n]] + end + if char == "\0" then + char = [[\0]] + end + version_c_array = format([[%s'%s',]], version_c_array, char) + end + version_c_array = version_c_array .. "}" + + -- remove python codegen + io.writefile("glslc/src/build-version.inc", version_c_array) + io.replace("glslc/CMakeLists.txt", "add_dependencies(glslc_exe build-version)", "", {plain = true}) + + local configs = { + "-DSHADERC_SKIP_EXAMPLES=ON", + "-DSHADERC_SKIP_TESTS=ON", + "-DSHADERC_ENABLE_COPYRIGHT_CHECK=OFF" + } table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release")) table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF")) if package:is_plat("windows") then table.insert(configs, "-DSHADERC_ENABLE_SHARED_CRT=" .. (package:config("vs_runtime"):startswith("MT") and "OFF" or "ON")) end - import("package.tools.cmake").install(package, configs) + + if package:config("exceptions") then + table.insert(configs, "-DDISABLE_EXCEPTIONS=OFF") + if package:is_plat("windows") and package:has_tool("cxx", "cl", "clang_cl") then + opt.cxflags = "/EHsc" + end + else + table.insert(configs, "-DDISABLE_EXCEPTIONS=ON") + end + import("package.tools.cmake").install(package, configs, opt) + package:addenv("PATH", "bin") end) on_test(function (package) - os.vrun("glslc --version") + if not package:is_cross() then + os.vrun("glslc --version") + end + if not package:is_binary() then assert(package:has_cfuncs("shaderc_compiler_initialize", {includes = "shaderc/shaderc.h"})) end end) -