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