121 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| import glob
 | |
| import pathlib
 | |
| import platform
 | |
| import re
 | |
| import shutil
 | |
| from SCons.Script import *
 | |
| 
 | |
| _SCRIPT_STAMPFILE = '.spp_script_run'
 | |
| 
 | |
| 
 | |
| def _git_cook(env: Environment, repo, options: dict = {}) -> dict:
 | |
|     checkout_root = repo['checkout_root']
 | |
|     enable_hlsl = options.get('enable_hlsl', False)
 | |
| 
 | |
|     # 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')]
 | |
|     if enable_hlsl:
 | |
|         glslang_source_files.extend(env.RGlob(os.path.join(repo['checkout_root'], 'glslang/HLSL/'), '*.cpp'))
 | |
| 
 | |
|     # disable warnings
 | |
|     additional_cxx_flags = {
 | |
|         'clang': ['-w'],
 | |
|         'gcc': ['-w'],
 | |
|         'cl': ['/w']
 | |
|     }.get(env['COMPILER_FAMILY'], [])
 | |
|     additional_cppdefines = []
 | |
| 
 | |
|     if enable_hlsl:
 | |
|         additional_cppdefines.append('ENABLE_HLSL=1')
 | |
| 
 | |
|     lib_glslang_full = env.StaticLibrary(
 | |
|         CCFLAGS = env['CCFLAGS'] + additional_cxx_flags,
 | |
|         CPPPATH = repo['checkout_root'],
 | |
|         CPPDEFINES = list(env['CPPDEFINES']) + additional_cppdefines,
 | |
|         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': [lib_glslang_full]
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
| _REPO_NAMES = {
 | |
|     'default': 'glslang',
 | |
|     'mewin': 'glslang_mewin'
 | |
| }
 | |
| _REPO_URLS = {
 | |
|     'default': 'https://github.com/KhronosGroup/glslang.git',
 | |
|     'mewin': 'https://git.mewin.de/mewin/glslang.git'
 | |
| }
 | |
| _TAG_PATTERNS = {
 | |
|     'default': re.compile(r'^([0-9]+)\.([0-9]+)\.([0-9]+)$'),
 | |
|     'mewin': None
 | |
| }
 | |
| def _ref_fn(env: Environment, version) -> str:
 | |
|     remote = env.get('GLSLANG_REMOTE', 'default')
 | |
|     if remote == 'default':
 | |
|         return f'refs/tags/{version[0]}.{version[1]}.{version[2]}'
 | |
|     elif remote == 'mewin':
 | |
|         return 'master'
 | |
|     else:
 | |
|         raise Exception('invalid glslang remote')
 | |
| 
 | |
| env.GitRecipe(
 | |
|     globals = globals(),
 | |
|     repo_name = lambda env: _REPO_NAMES[env.get('GLSLANG_REMOTE', 'default')],
 | |
|     repo_url = lambda env: _REPO_URLS[env.get('GLSLANG_REMOTE', 'default')],
 | |
|     tag_pattern = lambda env: _TAG_PATTERNS[env.get('GLSLANG_REMOTE', 'default')],
 | |
|     cook_fn = _git_cook,
 | |
|     ref_fn = _ref_fn
 | |
| )
 |