Files
ConanPackages/glslang/all/conanfile.py
Romain BOULLARD 17eea3fe02
Some checks failed
Conan Packaging / Package assimp/6.0.4 (push) Successful in 3m13s
Conan Packaging / Package unordered_dense/4.8.1 (push) Successful in 16s
Conan Packaging / Package vulkan-memory-allocator/3.3.0 (push) Successful in 20s
Conan Packaging / Package glslang/1.4.341.0 (push) Successful in 2m56s
Conan Packaging / Package pixelmatch-cpp17/1.0.3 (push) Successful in 21s
Conan Packaging / Package rapidhash/3.0 (push) Successful in 14s
Conan Packaging / Package spirv-headers/1.4.341.0 (push) Successful in 13s
Conan Packaging / Package stduuid/1.2.3 (push) Successful in 15s
Conan Packaging / Package sqlite3/3.51.2 (push) Successful in 38s
Conan Packaging / Package vulkan-headers/1.4.341.0 (push) Successful in 15s
Conan Packaging / Package eastl/3.27.01 (push) Successful in 17s
Conan Packaging / Package spirv-tools/1.4.341.0 (push) Successful in 2m17s
Conan Packaging / Package shaderc/2026.1 (push) Failing after 8s
Conan Packaging / Package vulkan-validationlayers/1.4.341.0 (push) Failing after 11s
Conan Packaging / Package cli11/2.6.1 (push) Successful in 19s
Conan Packaging / Package eabase/01082025 (push) Successful in 14s
Conan Packaging / Package flatbuffers/25.12.19 (push) Successful in 1m13s
Conan Packaging / Package lodepng/cci.20260210 (push) Successful in 23s
Conan Packaging / Package meshoptimizer/1.0 (push) Successful in 22s
Conan Packaging / Package mimalloc/3.2.8 (push) Successful in 24s
Fix version
2026-04-12 19:52:05 +02:00

232 lines
11 KiB
Python

import os
import re
from conan import ConanFile
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.env import VirtualBuildEnv
from conan.tools.files import copy, get, rmdir
from conan.tools.scm import Version
required_conan_version = ">=2.1"
class GlslangConan(ConanFile):
name = "glslang"
description = "Khronos-reference front end for GLSL/ESSL, partial front " \
"end for HLSL, and a SPIR-V generator."
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"
package_type = "library"
settings = "os", "arch", "compiler", "build_type"
options = {
"shared": [True, False],
"fPIC": [True, False],
"build_executables": [True, False],
"spv_remapper": [True, False],
"hlsl": [True, False],
"enable_optimizer": [True, False],
}
default_options = {
"shared": False,
"fPIC": True,
"build_executables": True,
"spv_remapper": True,
"hlsl": True,
"enable_optimizer": True,
}
short_paths = True
def export_sources(self):
copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder)
def config_options(self):
if self.settings.os == "Windows":
del self.options.fPIC
if Version(self.version) >= "1.4.341.0":
del self.options.spv_remapper
def configure(self):
if self.options.shared:
self.options.rm_safe("fPIC")
def layout(self):
cmake_layout(self, src_folder="src")
def requirements(self):
if self.options.enable_optimizer:
if Version(self.version) >= "1.4.341.0":
self.requires(f"spirv-tools/{self.version}@{self.user}/{self.channel}")
else:
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
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.cache_variables["GLSLANG_ENABLE_INSTALL"] = True
tc.variables["ENABLE_SPVREMAPPER"] = self.options.get_safe("spv_remapper", False)
tc.variables["ENABLE_GLSLANG_BINARIES"] = self.options.build_executables
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
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
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)
if Version(self.version) < "1.3.224.1":
tc.cache_variables["CMAKE_POLICY_VERSION_MINIMUM"] = "3.5" # CMake 4 support
tc.generate()
deps = CMakeDeps(self)
deps.generate()
def _patch_sources(self):
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()
cmake = CMake(self)
cmake.configure(build_script_folder=os.path.join(self.source_folder, os.pardir))
cmake.build()
def package(self):
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
lib_suffix = "d" if self.settings.os == "Windows" and self.settings.build_type == "Debug" else ""
has_machineindependent = not self.options.shared
has_genericcodegen = not self.options.shared
has_osdependent = not self.options.shared
# removed - see CHANGES.md
has_oglcompiler = not self.options.shared and Version(self.version) <= "1.3.243"
has_hlsl = self.options.hlsl and Version(self.version) <= "1.3.243"
# glslang
self.cpp_info.components["glslang-core"].set_property("cmake_target_name", "glslang::glslang")
self.cpp_info.components["glslang-core"].libs = [f"glslang{lib_suffix}"]
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"])
if has_machineindependent:
self.cpp_info.components["glslang-core"].requires.append("machineindependent")
if has_genericcodegen:
self.cpp_info.components["glslang-core"].requires.append("genericcodegen")
if has_osdependent:
self.cpp_info.components["glslang-core"].requires.append("osdependent")
if has_oglcompiler:
self.cpp_info.components["glslang-core"].requires.append("oglcompiler")
if has_hlsl:
self.cpp_info.components["glslang-core"].defines.append("ENABLE_HLSL")
if has_machineindependent:
# MachineIndependent
self.cpp_info.components["machineindependent"].set_property("cmake_target_name", "glslang::MachineIndependent")
self.cpp_info.components["machineindependent"].libs = [f"MachineIndependent{lib_suffix}"]
if has_genericcodegen:
self.cpp_info.components["machineindependent"].requires.append("genericcodegen")
if has_osdependent:
self.cpp_info.components["machineindependent"].requires.append("osdependent")
if has_oglcompiler:
self.cpp_info.components["machineindependent"].requires.append("oglcompiler")
if has_genericcodegen:
# GenericCodeGen
self.cpp_info.components["genericcodegen"].set_property("cmake_target_name", "glslang::GenericCodeGen")
self.cpp_info.components["genericcodegen"].libs = [f"GenericCodeGen{lib_suffix}"]
if has_osdependent:
# OSDependent
self.cpp_info.components["osdependent"].set_property("cmake_target_name", "glslang::OSDependent")
self.cpp_info.components["osdependent"].libs = [f"OSDependent{lib_suffix}"]
if self.settings.os in ["Linux", "FreeBSD"]:
self.cpp_info.components["osdependent"].system_libs.append("pthread")
if has_oglcompiler:
# OGLCompiler
self.cpp_info.components["oglcompiler"].set_property("cmake_target_name", "glslang::OGLCompiler")
self.cpp_info.components["oglcompiler"].libs = [f"OGLCompiler{lib_suffix}"]
# SPIRV
self.cpp_info.components["spirv"].set_property("cmake_target_name", "glslang::SPIRV")
self.cpp_info.components["spirv"].libs = [f"SPIRV{lib_suffix}"]
self.cpp_info.components["spirv"].requires = ["glslang-core"]
if self.options.enable_optimizer:
self.cpp_info.components["spirv"].requires.append("spirv-tools::spirv-tools-opt")
self.cpp_info.components["spirv"].defines.append("ENABLE_OPT")
# HLSL
if has_hlsl:
self.cpp_info.components["hlsl"].set_property("cmake_target_name", "glslang::HLSL")
self.cpp_info.components["hlsl"].libs = [f"HLSL{lib_suffix}"]
self.cpp_info.components["glslang-core"].requires.append("hlsl")
# SPVRemapper
if self.options.get_safe("spv_remapper"):
self.cpp_info.components["spvremapper"].set_property("cmake_target_name", "glslang::SPVRemapper")
self.cpp_info.components["spvremapper"].libs = [f"SPVRemapper{lib_suffix}"]
if Version(self.version) >= "1.3.243":
self.cpp_info.components["glslang-default-resource-limits"].set_property("cmake_target_name", "glslang::glslang-default-resource-limits")
self.cpp_info.components["glslang-default-resource-limits"].libs = [f"glslang-default-resource-limits{lib_suffix}"]