79 lines
3.9 KiB
Python
79 lines
3.9 KiB
Python
|
|
from SCons.Script import *
|
|
|
|
import glob
|
|
import os
|
|
import pathlib
|
|
import platform
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
|
|
_SCRIPT_STAMPFILE = '.spp_script_run'
|
|
|
|
def cook(env: Environment, remote: str = 'github', git_ref: str = '') -> dict:
|
|
if remote == 'mewin':
|
|
repo = env.Cook('GitBranch', repo_name = 'glslang_mewin', remote_url = 'https://git.mewin.de/mewin/glslang.git', git_ref = git_ref or 'master')
|
|
else:
|
|
repo = env.Cook('GitBranch', repo_name = 'glslang', remote_url = 'https://github.com/KhronosGroup/glslang.git', git_ref = git_ref or 'main')
|
|
checkout_root = repo['checkout_root']
|
|
|
|
# TODO: windows?
|
|
did_run_script = os.path.exists(os.path.join(repo['checkout_root'], _SCRIPT_STAMPFILE))
|
|
if not did_run_script or env['UPDATE_REPOSITORIES']:
|
|
subprocess.run(('/usr/bin/env', 'python3', 'update_glslang_sources.py'), cwd=checkout_root, stdout=sys.stdout, stderr=sys.stderr, check=True)
|
|
pathlib.Path(repo['checkout_root'], _SCRIPT_STAMPFILE).touch()
|
|
|
|
# generate the build_info.h
|
|
generator_script = os.path.join(repo['checkout_root'], 'build_info.py')
|
|
generator_script_input = os.path.join(repo['checkout_root'], 'build_info.h.tmpl')
|
|
generator_script_output = os.path.join(repo['checkout_root'], 'glslang/build_info.h')
|
|
env.Command(
|
|
target = generator_script_output,
|
|
source = [generator_script, generator_script_input, os.path.join(repo['checkout_root'], 'CHANGES.md')],
|
|
action = f'"$PYTHON" "{generator_script}" "{repo["checkout_root"]}" -i "{generator_script_input}" -o "$TARGET"'
|
|
)
|
|
|
|
platform_source_dir = {
|
|
'Linux': 'Unix',
|
|
'Windows': 'Windows',
|
|
'Darwin': 'Unix'
|
|
}.get(platform.system(), 'Unix')
|
|
glslang_source_files = env.RGlob(os.path.join(repo['checkout_root'], 'glslang/GenericCodeGen/'), '*.cpp') \
|
|
+ env.RGlob(os.path.join(repo['checkout_root'], 'glslang/MachineIndependent/'), '*.cpp') \
|
|
+ env.RGlob(os.path.join(repo['checkout_root'], 'glslang/OGLCompilersDLL/'), '*.cpp') \
|
|
+ env.RGlob(os.path.join(repo['checkout_root'], 'glslang/ResourceLimits/'), '*.cpp') \
|
|
+ env.RGlob(os.path.join(repo['checkout_root'], 'SPIRV/'), '*.cpp') \
|
|
+ env.RGlob(os.path.join(repo['checkout_root'], f'glslang/OSDependent/{platform_source_dir}/'), '*.cpp')
|
|
|
|
# disable a few warnings when compiling with clang
|
|
additional_cxx_flags = {
|
|
'clang': ['-Wno-deprecated-copy', '-Wno-missing-field-initializers', '-Wno-gnu-redeclared-enum',
|
|
'-Wno-unused-but-set-variable', '-Wno-deprecated-enum-enum-conversion']
|
|
}.get(env['COMPILER_FAMILY'], [])
|
|
env.StaticLibrary(
|
|
CCFLAGS = env['CCFLAGS'] + additional_cxx_flags,
|
|
CPPPATH = repo['checkout_root'],
|
|
target = env['LIB_DIR'] + '/glslang_full',
|
|
source = glslang_source_files
|
|
)
|
|
|
|
# build the include folder
|
|
include_dir = os.path.join(checkout_root, 'include')
|
|
if not os.path.exists(include_dir) or env['UPDATE_REPOSITORIES']:
|
|
def copy_headers(dst, src):
|
|
os.makedirs(dst, exist_ok=True)
|
|
for file in glob.glob(os.path.join(src, '*.h')):
|
|
shutil.copy(file, dst)
|
|
|
|
copy_headers(os.path.join(include_dir, 'glslang/HLSL'), os.path.join(checkout_root, 'glslang/HLSL'))
|
|
copy_headers(os.path.join(include_dir, 'glslang/Include'), os.path.join(checkout_root, 'glslang/Include'))
|
|
copy_headers(os.path.join(include_dir, 'glslang/MachineIndependent'), os.path.join(checkout_root, 'glslang/MachineIndependent'))
|
|
copy_headers(os.path.join(include_dir, 'glslang/Public'), os.path.join(checkout_root, 'glslang/Public'))
|
|
copy_headers(os.path.join(include_dir, 'glslang/SPIRV'), os.path.join(checkout_root, 'SPIRV'))
|
|
|
|
return {
|
|
'CPPPATH': [include_dir],
|
|
'LIBS': ['glslang_full']
|
|
}
|