1import common 2 3Import('*') 4 5from sys import executable as python_cmd 6 7env = env.Clone() 8 9env.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. 18env.Append(CPPPATH = [Dir('.').abspath, Dir('glcpp').abspath]) 19 20env.Append(YACCFLAGS = '-d -p "glcpp_parser_"') 21 22parser_env = env.Clone() 23parser_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 30parser_env['YACCHXXFILESUFFIX'] = '.h' 31 32glcpp_lexer = env.CFile('glcpp/glcpp-lex.c', 'glcpp/glcpp-lex.l') 33glcpp_parser = env.CFile('glcpp/glcpp-parse.c', 'glcpp/glcpp-parse.y') 34glsl_lexer = parser_env.CXXFile('glsl_lexer.cpp', 'glsl_lexer.ll') 35glsl_parser = parser_env.CXXFile('glsl_parser.cpp', 'glsl_parser.yy') 36 37# common generated sources 38glsl_sources = [ 39 glcpp_lexer, 40 glcpp_parser[0], 41 glsl_lexer, 42 glsl_parser[0], 43] 44 45# parse Makefile.sources 46source_lists = env.ParseSourceList('Makefile.sources') 47 48# add non-generated sources 49for l in ('LIBGLCPP_FILES', 'LIBGLSL_FILES', 'LIBGLSL_CXX_FILES'): 50 glsl_sources += source_lists[l] 51 52if env['msvc']: 53 env.Prepend(CPPPATH = ['#/src/getopt']) 54 env.PrependUnique(LIBS = [getopt]) 55 56if env['crosscompile'] and not env['embedded']: 57 Import('builtin_glsl_function') 58else: 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 98glsl_sources += builtin_glsl_function 99 100glsl = 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 107env.Depends(glsl, glsl_parser) 108 109Export('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" 113if env['crosscompile'] or env['embedded']: 114 Return() 115 116env = env.Clone() 117 118if env['platform'] == 'windows': 119 env.PrependUnique(LIBS = [ 120 'user32', 121 ]) 122 123env.Prepend(LIBS = [glsl]) 124 125glsl2 = env.Program( 126 target = 'glsl2', 127 source = compiler_objs, 128) 129env.Alias('glsl2', glsl2) 130 131glcpp = env.Program( 132 target = 'glcpp/glcpp', 133 source = ['glcpp/glcpp.c'] + mesa_objs, 134) 135env.Alias('glcpp', glcpp) 136