84 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
 | 
						|
from SCons.Script import *
 | 
						|
 | 
						|
import glob
 | 
						|
import os
 | 
						|
import pathlib
 | 
						|
import platform
 | 
						|
import shutil
 | 
						|
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']:
 | 
						|
        python_exe = os.path.realpath(sys.executable)
 | 
						|
        script_file = os.path.join(repo['checkout_root'], 'update_glslang_sources.py')
 | 
						|
        prev_cwd = os.getcwd()
 | 
						|
        os.chdir(repo['checkout_root'])
 | 
						|
        if env.Execute(f'"{python_exe}" {script_file}'):
 | 
						|
            env.Exit(1)
 | 
						|
        os.chdir(prev_cwd)
 | 
						|
        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') \
 | 
						|
                           + [os.path.join(repo['checkout_root'], f'glslang/OSDependent/{platform_source_dir}/ossource.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']
 | 
						|
    }
 |