1import common 2 3Import('*') 4 5from sys import executable as python_cmd 6 7env = env.Clone() 8 9env.MSVC2013Compat() 10 11env.Prepend(CPPPATH = [ 12 '#include', 13 '#src', 14 '#src/mapi', 15 '#src/mesa', 16 '#src/gallium/include', 17 '#src/gallium/auxiliary', 18 '#src/compiler/glsl', 19 '#src/compiler/glsl/glcpp', 20 '#src/compiler/nir', 21]) 22 23env.Prepend(LIBS = [mesautil]) 24 25# Make glcpp-parse.h and glsl_parser.h reachable from the include path. 26env.Prepend(CPPPATH = [Dir('.').abspath, Dir('glsl').abspath]) 27# Make NIR headers reachable from the include path. 28env.Prepend(CPPPATH = [Dir('.').abspath, Dir('nir').abspath]) 29 30glcpp_env = env.Clone() 31glcpp_env.Append(YACCFLAGS = [ 32 '-d', 33 '-p', 'glcpp_parser_' 34]) 35 36glsl_env = env.Clone() 37glsl_env.Append(YACCFLAGS = [ 38 '--defines=%s' % File('glsl/glsl_parser.h').abspath, 39 '-p', '_mesa_glsl_', 40]) 41 42# without this line scons will expect "glsl_parser.hpp" instead of 43# "glsl_parser.h", causing glsl_parser.cpp to be regenerated every time 44glsl_env['YACCHXXFILESUFFIX'] = '.h' 45 46glcpp_lexer = glcpp_env.CFile('glsl/glcpp/glcpp-lex.c', 'glsl/glcpp/glcpp-lex.l') 47glcpp_parser = glcpp_env.CFile('glsl/glcpp/glcpp-parse.c', 'glsl/glcpp/glcpp-parse.y') 48glsl_lexer = glsl_env.CXXFile('glsl/glsl_lexer.cpp', 'glsl/glsl_lexer.ll') 49glsl_parser = glsl_env.CXXFile('glsl/glsl_parser.cpp', 'glsl/glsl_parser.yy') 50 51# common generated sources 52glsl_sources = [ 53 glcpp_lexer, 54 glcpp_parser[0], 55 glsl_lexer, 56 glsl_parser[0], 57] 58 59# parse Makefile.sources 60source_lists = env.ParseSourceList('Makefile.sources') 61 62# add non-generated sources 63for l in ('LIBGLCPP_FILES', 'LIBGLSL_FILES'): 64 glsl_sources += source_lists[l] 65 66if env['msvc']: 67 env.Prepend(CPPPATH = ['#/src/getopt']) 68 env.PrependUnique(LIBS = [getopt]) 69 70# Copy these files to avoid generation object files into src/mesa/program 71env.Prepend(CPPPATH = ['#src/mesa/main']) 72env.Command('glsl/imports.c', '#src/mesa/main/imports.c', Copy('$TARGET', '$SOURCE')) 73env.Command('glsl/extensions_table.c', '#src/mesa/main/extensions_table.c', Copy('$TARGET', '$SOURCE')) 74# Copy these files to avoid generation object files into src/mesa/program 75env.Prepend(CPPPATH = ['#src/mesa/program']) 76env.Command('glsl/symbol_table.c', '#src/mesa/program/symbol_table.c', Copy('$TARGET', '$SOURCE')) 77env.Command('glsl/dummy_errors.c', '#src/mesa/program/dummy_errors.c', Copy('$TARGET', '$SOURCE')) 78 79compiler_objs = env.StaticObject(source_lists['GLSL_COMPILER_CXX_FILES']) 80 81mesa_objs = env.StaticObject([ 82 'glsl/extensions_table.c', 83 'glsl/imports.c', 84 'glsl/symbol_table.c', 85 'glsl/dummy_errors.c', 86]) 87 88compiler_objs += mesa_objs 89 90# GLSL generated sources 91env.CodeGenerate( 92 target = 'glsl/ir_expression_operation.h', 93 script = 'glsl/ir_expression_operation.py', 94 source = [], 95 command = python_cmd + ' $SCRIPT enum > $TARGET' 96) 97env.CodeGenerate( 98 target = 'glsl/ir_expression_operation_constant.h', 99 script = 'glsl/ir_expression_operation.py', 100 source = [], 101 command = python_cmd + ' $SCRIPT constant > $TARGET' 102) 103env.CodeGenerate( 104 target = 'glsl/ir_expression_operation_strings.h', 105 script = 'glsl/ir_expression_operation.py', 106 source = [], 107 command = python_cmd + ' $SCRIPT strings > $TARGET' 108) 109 110glsl = env.ConvenienceLibrary( 111 target = 'glsl', 112 source = glsl_sources, 113) 114 115# SCons builtin dependency scanner doesn't detect that glsl_lexer.ll depends on 116# glsl_parser.h 117env.Depends(glsl, glsl_parser) 118 119Export('glsl') 120 121# 122# XXX: It's important to not add any generated source files after this point, 123# or it will break MinGW cross-compilation. 124# 125 126# Skip building these programs as they will cause SCons error "Two environments 127# with different actions were specified for the same target" 128if env['crosscompile'] or env['embedded']: 129 Return() 130 131env = env.Clone() 132 133if env['platform'] == 'windows': 134 env.PrependUnique(LIBS = [ 135 'user32', 136 ]) 137 138env.Prepend(LIBS = [compiler, glsl]) 139 140compiler_objs += env.StaticObject("glsl/main.cpp") 141 142glsl_compiler = env.Program( 143 target = 'glsl_compiler', 144 source = compiler_objs, 145) 146env.Alias('glsl_compiler', glsl_compiler) 147 148glcpp = env.Program( 149 target = 'glsl/glcpp/glcpp', 150 source = ['glsl/glcpp/glcpp.c'] + mesa_objs, 151) 152env.Alias('glcpp', glcpp) 153