Skip to content

Commit

Permalink
(#19980) glslang: update versions, simplify patching
Browse files Browse the repository at this point in the history
* glslang: simplify patching

* glslang: add new versions, remove old ones

Removed versions that are more than a year old.

* glslang: update versions to match spirv-tools

* glslang: drop self._is_v1

* glslang: the license is much more complicated than just BSD-3-Clause + NVIDIA

* glslang: fix fPIC handling

* glslang: add newer CMake

* glslang: fix fPIC handling
  • Loading branch information
valgur authored Jun 6, 2024
1 parent e109ccd commit 6c80379
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 154 deletions.
61 changes: 13 additions & 48 deletions recipes/glslang/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -1,55 +1,20 @@
# Add only the SDK release versions from https://github.com/KhronosGroup/glslang/tags for consistency
sources:
"1.3.268.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/vulkan-sdk-1.3.268.0.tar.gz"
sha256: "8cfb4824f185bc246cd41cceedbfcdf14abd3d2fa861512baf81df8a263b9283"
"1.3.261.1":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.3.261.1.tar.gz"
sha256: "eb1f9c2ff0a1409151d7749fb37bc1988dc1fd908444c1e4f43d4190c90befcd"
"1.3.243.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.3.243.0.tar.gz"
sha256: "18b8f296874ac19d034bfb9060238c87b6d67a39af0dfd305d3252762c265f9f"
"1.3.239.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.3.239.0.tar.gz"
sha256: "8b040328c18399b7bbf5bef84fac3d7b7376b39ec6833b7e19b7961bf7a72017"
"1.3.236.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.3.236.0.tar.gz"
sha256: "fb6f323a36efcd98766bb72f598008f73c4c92bce69c79fc98ad2b3cdca0c263"
"1.3.231.1":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.3.231.1.tar.gz"
sha256: "df3857f01c1aa9ee1927d2feaaa431406d243958e07791e9aed4cb5ab22a5f2b"
"1.3.224.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.3.224.0.tar.gz"
sha256: "c43c6aa149fa1165e01b375b4d95cbc23b4fc72bd9972a89c55dd1eaa8a360ca"
"1.3.216.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.3.216.0.tar.gz"
sha256: "3f80a926390faedd33e6ed17ec68340abace83913b285174e2dee87156577be5"
"1.3.211.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.3.211.0.tar.gz"
sha256: "4335eec84b87d64130e860dad5d6dc1f722277d4e0ff5027153e2743628cb221"
"1.3.204.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.3.204.0.tar.gz"
sha256: "c6bec993194377944fb8d6d585a90e1288994660782d709e30fa1d91810d6820"
"11.7.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/11.7.0.tar.gz"
sha256: "b6c83864c3606678d11675114fa5f358c519fe1dad9a781802bcc87fb8fa32d5"
"11.6.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/11.6.0.tar.gz"
sha256: "99ecd3a0c2c2219293d76723846f762a9f3e7dd0dc2a4f346d0fc3a05a0ce000"
"11.5.0":
url: "https://github.com/KhronosGroup/glslang/archive/11.5.0.tar.gz"
sha256: "fd0b5e3bda591bb08bd3049655a99a0a55f0de4059b9c8f7b397e4b19cf5d51f"
"8.13.3559":
url: "https://github.com/KhronosGroup/glslang/archive/8.13.3559.tar.gz"
sha256: "c58fdcf7e00943ba10f9ae565b2725ec9d5be7dab7c8e82cac72fcaa83c652ca"
patches:
"1.3.239.0":
- patch_file: "patches/1.3.236.0-0001-no-force-glslang-pic.patch"
"1.3.236.0":
- patch_file: "patches/1.3.236.0-0001-no-force-glslang-pic.patch"
"1.3.231.1":
- patch_file: "patches/0001-no-force-glslang-pic.patch"
"1.3.224.0":
- patch_file: "patches/0001-no-force-glslang-pic.patch"
"1.3.216.0":
- patch_file: "patches/0001-no-force-glslang-pic.patch"
"1.3.211.0":
- patch_file: "patches/0001-no-force-glslang-pic.patch"
"1.3.204.0":
- patch_file: "patches/0001-no-force-glslang-pic.patch"
"11.7.0":
- patch_file: "patches/0001-no-force-glslang-pic.patch"
"11.6.0":
- patch_file: "patches/0001-no-force-glslang-pic.patch"
"11.5.0":
- patch_file: "patches/0001-no-force-glslang-pic.patch"
"1.2.198.0":
url: "https://github.com/KhronosGroup/glslang/archive/refs/tags/sdk-1.2.198.0.tar.gz"
sha256: "b2a0541caf01de4fc411cbb32c805a3bd0f6578432e532c5fa6336d187a4a1b1"
114 changes: 44 additions & 70 deletions recipes/glslang/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import os
import re

from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.apple import is_apple_os
from conan.errors import ConanInvalidConfiguration, ConanException
from conan.tools.build import check_min_cppstd
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout
from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, replace_in_file, rmdir
from conan.tools.env import VirtualBuildEnv
from conan.tools.files import copy, get, rmdir
from conan.tools.scm import Version
import os

required_conan_version = ">=1.54.0"

Expand All @@ -14,7 +16,7 @@ class GlslangConan(ConanFile):
name = "glslang"
description = "Khronos-reference front end for GLSL/ESSL, partial front " \
"end for HLSL, and a SPIR-V generator."
license = ["BSD-3-Clause", "NVIDIA"]
license = "DocumentRef-LICENSE.txt:LicenseRef-glslang"
topics = ("glsl", "hlsl", "spirv", "spir-v", "validation", "translation")
homepage = "https://github.com/KhronosGroup/glslang"
url = "https://github.com/conan-io/conan-center-index"
Expand Down Expand Up @@ -42,7 +44,6 @@ class GlslangConan(ConanFile):

def export_sources(self):
copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder)
export_conandata_patches(self)

def config_options(self):
if self.settings.os == "Windows":
Expand All @@ -55,101 +56,75 @@ def configure(self):
def layout(self):
cmake_layout(self, src_folder="src")

@property
def _get_compatible_spirv_tools_version(self):
return {
"11.7.0": "2021.4",
"11.6.0": "2021.3",
"11.5.0": "2021.2",
"8.13.3559": "2020.5",
}.get(str(self.version), self.version)

def requirements(self):
if self.options.enable_optimizer:
self.requires(f"spirv-tools/{self._get_compatible_spirv_tools_version}")
self.requires(f"spirv-tools/{self.version}")

def validate(self):
if self.settings.compiler.get_safe("cppstd"):
check_min_cppstd(self, 11)

# see https://github.com/KhronosGroup/glslang/issues/2283
glslang_version = Version(self.version)
if (self.options.shared and
(self.settings.os == "Windows" or \
(glslang_version >= "7.0.0" and glslang_version < "11.0.0" and is_apple_os(self)))
):
raise ConanInvalidConfiguration(f"{self.ref} shared library build is broken on {self.settings.os}")
if self.options.shared:
if self.settings.os == "Windows":
raise ConanInvalidConfiguration(f"{self.ref} shared library build is broken on {self.settings.os}")

if self.options.enable_optimizer and self.dependencies["spirv-tools"].options.shared:
raise ConanInvalidConfiguration(
f"{self.ref} with enable_optimizer requires static spirv-tools, "
"because SPIRV-Tools-opt is not built if shared"
)

def build_requirements(self):
if Version(self.version) >= "1.3.261":
self.tool_requires("cmake/[>=3.17.2 <4]")

def source(self):
get(self, **self.conan_data["sources"][self.version], strip_root=True)

def generate(self):
venv = VirtualBuildEnv(self)
venv.generate()

tc = CMakeToolchain(self)
tc.variables["BUILD_EXTERNAL"] = False
tc.variables["SKIP_GLSLANG_INSTALL"] = False
tc.variables["ENABLE_SPVREMAPPER"] = self.options.spv_remapper
tc.variables["ENABLE_GLSLANG_BINARIES"] = self.options.build_executables
glslang_version = Version(self.version)
if glslang_version < "7.0.0" or glslang_version >= "8.13.3743":
tc.variables["ENABLE_GLSLANG_JS"] = False
tc.variables["ENABLE_GLSLANG_WEBMIN"] = False
tc.variables["ENABLE_GLSLANG_WEBMIN_DEVEL"] = False
else:
tc.variables["ENABLE_GLSLANG_WEB"] = False
tc.variables["ENABLE_GLSLANG_WEB_DEVEL"] = False
tc.variables["ENABLE_GLSLANG_JS"] = False
tc.variables["ENABLE_GLSLANG_WEBMIN"] = False
tc.variables["ENABLE_GLSLANG_WEBMIN_DEVEL"] = False
tc.variables["ENABLE_EMSCRIPTEN_SINGLE_FILE"] = False
tc.variables["ENABLE_EMSCRIPTEN_ENVIRONMENT_NODE"] = False
tc.variables["ENABLE_HLSL"] = self.options.hlsl
if glslang_version < "7.0.0" or glslang_version >= "8.13.3743":
tc.variables["ENABLE_RTTI"] = True
tc.variables["ENABLE_RTTI"] = True
tc.variables["ENABLE_OPT"] = self.options.enable_optimizer
if self.options.enable_optimizer:
tc.variables["spirv-tools_SOURCE_DIR"] = self.dependencies["spirv-tools"].package_folder.replace("\\", "/")
tc.variables["ENABLE_PCH"] = False
tc.variables["ENABLE_CTEST"] = False
tc.variables["USE_CCACHE"] = False
if (glslang_version < "7.0.0" or glslang_version >= "11.6.0") and self.settings.os == "Windows":
tc.variables["OVERRIDE_MSVCCRT"] = False
if is_apple_os(self):
tc.variables["CMAKE_MACOSX_BUNDLE"] = False
if glslang_version < "1.3.231" or glslang_version >= "7.0.0":
# Generate a relocatable shared lib on Macos
tc.cache_variables["CMAKE_POLICY_DEFAULT_CMP0042"] = "NEW"
tc.variables["OVERRIDE_MSVCCRT"] = False
tc.variables["CMAKE_MACOSX_BUNDLE"] = False
# Generate a relocatable shared lib on Macos
tc.cache_variables["CMAKE_POLICY_DEFAULT_CMP0042"] = "NEW"
# glslang builds intermediate static libs, but Conan does not set -fPIC for shared builds
tc.variables["CMAKE_POSITION_INDEPENDENT_CODE"] = self.options.get_safe("fPIC", True)
tc.generate()

deps = CMakeDeps(self)
deps.generate()

def _patch_sources(self):
apply_conandata_patches(self)
# Do not force PIC if static (but keep it if shared, because OGLCompiler, OSDependent,
# GenericCodeGen and MachineIndependent are still static and linked to glslang shared)
if not self.options.shared:
cmake_files_to_fix = [
{"target": "OGLCompiler", "relpath": os.path.join("OGLCompilersDLL", "CMakeLists.txt")},
{"target": "SPIRV" , "relpath": os.path.join("SPIRV", "CMakeLists.txt")},
{"target": "SPVRemapper", "relpath": os.path.join("SPIRV", "CMakeLists.txt")},
{"target": "OSDependent", "relpath": os.path.join("glslang", "OSDependent", "Unix","CMakeLists.txt")},
{"target": "OSDependent", "relpath": os.path.join("glslang", "OSDependent", "Windows","CMakeLists.txt")},
{"target": "HLSL" , "relpath": os.path.join("hlsl", "CMakeLists.txt")},
]
glslang_version = Version(self.version)
if glslang_version >= "7.0.0" and glslang_version < "11.0.0":
cmake_files_to_fix.append({"target": "glslang", "relpath": os.path.join("glslang", "CMakeLists.txt")})
else:
cmake_files_to_fix.append({"target": "glslang-default-resource-limits", "relpath": os.path.join("StandAlone" , "CMakeLists.txt")})
cmake_files_to_fix.append({"target": "MachineIndependent", "relpath": os.path.join("glslang", "CMakeLists.txt")})
cmake_files_to_fix.append({"target": "GenericCodeGen", "relpath": os.path.join("glslang", "CMakeLists.txt")})
for cmake_file in cmake_files_to_fix:
replace_in_file(self, os.path.join(self.source_folder, cmake_file["relpath"]),
"set_property(TARGET {} PROPERTY POSITION_INDEPENDENT_CODE ON)".format(cmake_file["target"]),
"")
for cmake_file in sorted(self.source_path.rglob("CMakeLists.txt")):
content = cmake_file.read_text(encoding="utf8")
if "POSITION_INDEPENDENT_CODE ON" in content:
content = re.sub(r"set_property\(TARGET \S+ PROPERTY POSITION_INDEPENDENT_CODE ON\)\n", "", content)
content = content.replace("POSITION_INDEPENDENT_CODE ON", "")
cmake_file.write_text(content, encoding="utf8")
self.output.info(f"Patched fPIC handling in {cmake_file.relative_to(self.source_path)}")
if "POSITION_INDEPENDENT_CODE" in content:
raise ConanException(f"POSITION_INDEPENDENT_CODE found in {cmake_file}, please update the recipe")

def build(self):
self._patch_sources()
Expand All @@ -158,30 +133,29 @@ def build(self):
cmake.build()

def package(self):
copy(self, "LICENSE.txt", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
copy(self, "LICENSE.txt", self.source_folder, os.path.join(self.package_folder, "licenses"))
cmake = CMake(self)
cmake.install()
rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
rmdir(self, os.path.join(self.package_folder, "share"))

def package_info(self):
self.cpp_info.set_property("cmake_file_name", "glslang")
self.cpp_info.set_property("cmake_target_name", "glslang::glslang-do-not-use") # because glslang-core target is glslang::glslang
self.cpp_info.set_property("cmake_target_name", "glslang::_glslang-do-not-use") # because glslang-core target is glslang::glslang

lib_suffix = "d" if self.settings.os == "Windows" and self.settings.build_type == "Debug" else ""

glslang_version = Version(self.version)
has_machineindependent = (glslang_version < "7.0.0" or glslang_version >= "11.0.0") and not self.options.shared
has_genericcodegen = (glslang_version < "7.0.0" or glslang_version >= "11.0.0") and not self.options.shared
has_osdependent = glslang_version < "1.3.231" or glslang_version >= "7.0.0" or not self.options.shared
has_oglcompiler = glslang_version < "1.3.231" or glslang_version >= "7.0.0" or not self.options.shared
has_machineindependent = not self.options.shared
has_genericcodegen = not self.options.shared
has_osdependent = not self.options.shared
has_oglcompiler = not self.options.shared

# glslang
self.cpp_info.components["glslang-core"].set_property("cmake_target_name", "glslang::glslang")
self.cpp_info.components["glslang-core"].names["cmake_find_package"] = "glslang"
self.cpp_info.components["glslang-core"].names["cmake_find_package_multi"] = "glslang"
self.cpp_info.components["glslang-core"].libs = [f"glslang{lib_suffix}"]
if (glslang_version < "7.0.0" or glslang_version >= "11.0.0") and self.options.shared:
if self.options.shared:
self.cpp_info.components["glslang-core"].defines.append("GLSLANG_IS_SHARED_LIBRARY")
if self.settings.os in ["Linux", "FreeBSD"]:
self.cpp_info.components["glslang-core"].system_libs.extend(["m", "pthread"])
Expand Down
10 changes: 0 additions & 10 deletions recipes/glslang/all/patches/0001-no-force-glslang-pic.patch

This file was deleted.

This file was deleted.

22 changes: 6 additions & 16 deletions recipes/glslang/config.yml
Original file line number Diff line number Diff line change
@@ -1,23 +1,13 @@
versions:
"1.3.239.0":
folder: all
"1.3.236.0":
folder: all
"1.3.231.1":
folder: all
"1.3.224.0":
"1.3.268.0":
folder: all
"1.3.216.0":
"1.3.261.1":
folder: all
"1.3.211.0":
"1.3.243.0":
folder: all
"1.3.204.0":
folder: all
"11.7.0":
folder: all
"11.6.0":
"1.3.239.0":
folder: all
"11.5.0":
"1.3.236.0":
folder: all
"8.13.3559":
"1.2.198.0":
folder: all

0 comments on commit 6c80379

Please sign in to comment.