1--
2-- Copyright 2010-2019 Branimir Karadzic. All rights reserved.
3-- License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
4--
5
6group "tools/shaderc"
7
8local GLSL_OPTIMIZER = path.join(BGFX_DIR, "3rdparty/glsl-optimizer")
9local FCPP_DIR       = path.join(BGFX_DIR, "3rdparty/fcpp")
10local GLSLANG        = path.join(BGFX_DIR, "3rdparty/glslang")
11local SPIRV_CROSS    = path.join(BGFX_DIR, "3rdparty/spirv-cross")
12local SPIRV_HEADERS  = path.join(BGFX_DIR, "3rdparty/spirv-headers")
13local SPIRV_TOOLS    = path.join(BGFX_DIR, "3rdparty/spirv-tools")
14
15project "spirv-opt"
16	kind "StaticLib"
17
18	includedirs {
19		SPIRV_TOOLS,
20
21		path.join(SPIRV_TOOLS, "include"),
22		path.join(SPIRV_TOOLS, "include/generated"),
23		path.join(SPIRV_TOOLS, "source"),
24		path.join(SPIRV_HEADERS, "include"),
25	}
26
27	files {
28		path.join(SPIRV_TOOLS, "source/opt/**.cpp"),
29		path.join(SPIRV_TOOLS, "source/opt/**.h"),
30		path.join(SPIRV_TOOLS, "source/reduce/**.cpp"),
31		path.join(SPIRV_TOOLS, "source/reduce/**.h"),
32
33		-- libspirv
34		path.join(SPIRV_TOOLS, "source/assembly_grammar.cpp"),
35		path.join(SPIRV_TOOLS, "source/assembly_grammar.h"),
36		path.join(SPIRV_TOOLS, "source/binary.cpp"),
37		path.join(SPIRV_TOOLS, "source/binary.h"),
38		path.join(SPIRV_TOOLS, "source/cfa.h"),
39		path.join(SPIRV_TOOLS, "source/diagnostic.cpp"),
40		path.join(SPIRV_TOOLS, "source/diagnostic.h"),
41		path.join(SPIRV_TOOLS, "source/disassemble.cpp"),
42		path.join(SPIRV_TOOLS, "source/disassemble.h"),
43		path.join(SPIRV_TOOLS, "source/enum_set.h"),
44		path.join(SPIRV_TOOLS, "source/enum_string_mapping.cpp"),
45		path.join(SPIRV_TOOLS, "source/enum_string_mapping.h"),
46		path.join(SPIRV_TOOLS, "source/ext_inst.cpp"),
47		path.join(SPIRV_TOOLS, "source/ext_inst.h"),
48		path.join(SPIRV_TOOLS, "source/extensions.cpp"),
49		path.join(SPIRV_TOOLS, "source/extensions.h"),
50		path.join(SPIRV_TOOLS, "source/instruction.h"),
51		path.join(SPIRV_TOOLS, "source/latest_version_glsl_std_450_header.h"),
52		path.join(SPIRV_TOOLS, "source/latest_version_opencl_std_header.h"),
53		path.join(SPIRV_TOOLS, "source/latest_version_spirv_header.h"),
54		path.join(SPIRV_TOOLS, "source/libspirv.cpp"),
55		path.join(SPIRV_TOOLS, "source/macro.h"),
56		path.join(SPIRV_TOOLS, "source/name_mapper.cpp"),
57		path.join(SPIRV_TOOLS, "source/name_mapper.h"),
58		path.join(SPIRV_TOOLS, "source/opcode.cpp"),
59		path.join(SPIRV_TOOLS, "source/opcode.h"),
60		path.join(SPIRV_TOOLS, "source/operand.cpp"),
61		path.join(SPIRV_TOOLS, "source/operand.h"),
62		path.join(SPIRV_TOOLS, "source/parsed_operand.cpp"),
63		path.join(SPIRV_TOOLS, "source/parsed_operand.h"),
64		path.join(SPIRV_TOOLS, "source/print.cpp"),
65		path.join(SPIRV_TOOLS, "source/print.h"),
66		path.join(SPIRV_TOOLS, "source/software_version.cpp"),
67		path.join(SPIRV_TOOLS, "source/spirv_constant.h"),
68		path.join(SPIRV_TOOLS, "source/spirv_definition.h"),
69		path.join(SPIRV_TOOLS, "source/spirv_endian.cpp"),
70		path.join(SPIRV_TOOLS, "source/spirv_endian.h"),
71		path.join(SPIRV_TOOLS, "source/spirv_optimizer_options.cpp"),
72		path.join(SPIRV_TOOLS, "source/spirv_reducer_options.cpp"),
73		path.join(SPIRV_TOOLS, "source/spirv_target_env.cpp"),
74		path.join(SPIRV_TOOLS, "source/spirv_target_env.h"),
75		path.join(SPIRV_TOOLS, "source/spirv_validator_options.cpp"),
76		path.join(SPIRV_TOOLS, "source/spirv_validator_options.h"),
77		path.join(SPIRV_TOOLS, "source/table.cpp"),
78		path.join(SPIRV_TOOLS, "source/table.h"),
79		path.join(SPIRV_TOOLS, "source/text.cpp"),
80		path.join(SPIRV_TOOLS, "source/text.h"),
81		path.join(SPIRV_TOOLS, "source/text_handler.cpp"),
82		path.join(SPIRV_TOOLS, "source/text_handler.h"),
83		path.join(SPIRV_TOOLS, "source/util/bit_vector.cpp"),
84		path.join(SPIRV_TOOLS, "source/util/bit_vector.h"),
85		path.join(SPIRV_TOOLS, "source/util/bitutils.h"),
86		path.join(SPIRV_TOOLS, "source/util/hex_float.h"),
87		path.join(SPIRV_TOOLS, "source/util/parse_number.cpp"),
88		path.join(SPIRV_TOOLS, "source/util/parse_number.h"),
89		path.join(SPIRV_TOOLS, "source/util/string_utils.cpp"),
90		path.join(SPIRV_TOOLS, "source/util/string_utils.h"),
91		path.join(SPIRV_TOOLS, "source/util/timer.h"),
92		path.join(SPIRV_TOOLS, "source/val/basic_block.cpp"),
93		path.join(SPIRV_TOOLS, "source/val/construct.cpp"),
94		path.join(SPIRV_TOOLS, "source/val/decoration.h"),
95		path.join(SPIRV_TOOLS, "source/val/function.cpp"),
96		path.join(SPIRV_TOOLS, "source/val/instruction.cpp"),
97		path.join(SPIRV_TOOLS, "source/val/validate.cpp"),
98		path.join(SPIRV_TOOLS, "source/val/validate.h"),
99		path.join(SPIRV_TOOLS, "source/val/validate_adjacency.cpp"),
100		path.join(SPIRV_TOOLS, "source/val/validate_annotation.cpp"),
101		path.join(SPIRV_TOOLS, "source/val/validate_arithmetics.cpp"),
102		path.join(SPIRV_TOOLS, "source/val/validate_atomics.cpp"),
103		path.join(SPIRV_TOOLS, "source/val/validate_barriers.cpp"),
104		path.join(SPIRV_TOOLS, "source/val/validate_bitwise.cpp"),
105		path.join(SPIRV_TOOLS, "source/val/validate_builtins.cpp"),
106		path.join(SPIRV_TOOLS, "source/val/validate_capability.cpp"),
107		path.join(SPIRV_TOOLS, "source/val/validate_cfg.cpp"),
108		path.join(SPIRV_TOOLS, "source/val/validate_composites.cpp"),
109		path.join(SPIRV_TOOLS, "source/val/validate_constants.cpp"),
110		path.join(SPIRV_TOOLS, "source/val/validate_conversion.cpp"),
111		path.join(SPIRV_TOOLS, "source/val/validate_debug.cpp"),
112		path.join(SPIRV_TOOLS, "source/val/validate_decorations.cpp"),
113		path.join(SPIRV_TOOLS, "source/val/validate_derivatives.cpp"),
114		path.join(SPIRV_TOOLS, "source/val/validate_execution_limitations.cpp"),
115		path.join(SPIRV_TOOLS, "source/val/validate_extensions.cpp"),
116		path.join(SPIRV_TOOLS, "source/val/validate_function.cpp"),
117		path.join(SPIRV_TOOLS, "source/val/validate_id.cpp"),
118		path.join(SPIRV_TOOLS, "source/val/validate_image.cpp"),
119		path.join(SPIRV_TOOLS, "source/val/validate_instruction.cpp"),
120		path.join(SPIRV_TOOLS, "source/val/validate_interfaces.cpp"),
121		path.join(SPIRV_TOOLS, "source/val/validate_layout.cpp"),
122		path.join(SPIRV_TOOLS, "source/val/validate_literals.cpp"),
123		path.join(SPIRV_TOOLS, "source/val/validate_logicals.cpp"),
124		path.join(SPIRV_TOOLS, "source/val/validate_memory.cpp"),
125		path.join(SPIRV_TOOLS, "source/val/validate_memory_semantics.cpp"),
126		path.join(SPIRV_TOOLS, "source/val/validate_misc.cpp"),
127		path.join(SPIRV_TOOLS, "source/val/validate_mode_setting.cpp"),
128		path.join(SPIRV_TOOLS, "source/val/validate_non_uniform.cpp"),
129		path.join(SPIRV_TOOLS, "source/val/validate_primitives.cpp"),
130		path.join(SPIRV_TOOLS, "source/val/validate_scopes.cpp"),
131		path.join(SPIRV_TOOLS, "source/val/validate_small_type_uses.cpp"),
132		path.join(SPIRV_TOOLS, "source/val/validate_type.cpp"),
133		path.join(SPIRV_TOOLS, "source/val/validation_state.cpp"),
134	}
135
136	configuration { "vs*" }
137		buildoptions {
138			"/wd4127", -- warning C4127: conditional expression is constant
139			"/wd4389", -- warning C4389: '==': signed/unsigned mismatch
140			"/wd4702", -- warning C4702: unreachable code
141			"/wd4706", -- warning C4706: assignment within conditional expression
142		}
143
144	configuration { "mingw* or linux or osx" }
145		buildoptions {
146			"-Wno-switch",
147		}
148
149	configuration { "mingw* or linux-gcc-*" }
150		buildoptions {
151			"-Wno-misleading-indentation",
152		}
153
154	configuration {}
155
156project "spirv-cross"
157	kind "StaticLib"
158
159	defines {
160		"SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS",
161	}
162
163	includedirs {
164		path.join(SPIRV_CROSS, "include"),
165	}
166
167	files {
168		path.join(SPIRV_CROSS, "spirv.hpp"),
169		path.join(SPIRV_CROSS, "spirv_cfg.cpp"),
170		path.join(SPIRV_CROSS, "spirv_cfg.hpp"),
171		path.join(SPIRV_CROSS, "spirv_common.hpp"),
172		path.join(SPIRV_CROSS, "spirv_cpp.cpp"),
173		path.join(SPIRV_CROSS, "spirv_cpp.hpp"),
174		path.join(SPIRV_CROSS, "spirv_cross.cpp"),
175		path.join(SPIRV_CROSS, "spirv_cross.hpp"),
176		path.join(SPIRV_CROSS, "spirv_cross_parsed_ir.cpp"),
177		path.join(SPIRV_CROSS, "spirv_cross_parsed_ir.hpp"),
178		path.join(SPIRV_CROSS, "spirv_cross_util.cpp"),
179		path.join(SPIRV_CROSS, "spirv_cross_util.hpp"),
180		path.join(SPIRV_CROSS, "spirv_glsl.cpp"),
181		path.join(SPIRV_CROSS, "spirv_glsl.hpp"),
182		path.join(SPIRV_CROSS, "spirv_hlsl.cpp"),
183		path.join(SPIRV_CROSS, "spirv_hlsl.hpp"),
184		path.join(SPIRV_CROSS, "spirv_msl.cpp"),
185		path.join(SPIRV_CROSS, "spirv_msl.hpp"),
186		path.join(SPIRV_CROSS, "spirv_parser.cpp"),
187		path.join(SPIRV_CROSS, "spirv_parser.hpp"),
188		path.join(SPIRV_CROSS, "spirv_reflect.cpp"),
189		path.join(SPIRV_CROSS, "spirv_reflect.hpp"),
190	}
191
192	configuration { "vs*" }
193		buildoptions {
194			"/wd4018", -- warning C4018: '<': signed/unsigned mismatch
195			"/wd4245", -- warning C4245: 'return': conversion from 'int' to 'unsigned int', signed/unsigned mismatch
196			"/wd4706", -- warning C4706: assignment within conditional expression
197			"/wd4715", -- warning C4715: '': not all control paths return a value
198		}
199
200	configuration {}
201
202project "glslang"
203	kind "StaticLib"
204
205	defines {
206		"ENABLE_OPT=1", -- spirv-tools
207		"ENABLE_HLSL=1",
208	}
209
210	includedirs {
211		GLSLANG,
212		path.join(SPIRV_TOOLS, "include"),
213		path.join(SPIRV_TOOLS, "source"),
214	}
215
216	files {
217		path.join(GLSLANG, "glslang/**.cpp"),
218		path.join(GLSLANG, "glslang/**.h"),
219
220		path.join(GLSLANG, "hlsl/**.cpp"),
221		path.join(GLSLANG, "hlsl/**.h"),
222
223		path.join(GLSLANG, "SPIRV/**.cpp"),
224		path.join(GLSLANG, "SPIRV/**.h"),
225
226		path.join(GLSLANG, "OGLCompilersDLL/**.cpp"),
227		path.join(GLSLANG, "OGLCompilersDLL/**.h"),
228	}
229
230	removefiles {
231		path.join(GLSLANG, "glslang/OSDependent/Unix/main.cpp"),
232		path.join(GLSLANG, "glslang/OSDependent/Windows/main.cpp"),
233	}
234
235	configuration { "windows" }
236		removefiles {
237			path.join(GLSLANG, "glslang/OSDependent/Unix/**.cpp"),
238			path.join(GLSLANG, "glslang/OSDependent/Unix/**.h"),
239		}
240
241	configuration { "not windows" }
242		removefiles {
243			path.join(GLSLANG, "glslang/OSDependent/Windows/**.cpp"),
244			path.join(GLSLANG, "glslang/OSDependent/Windows/**.h"),
245		}
246
247	configuration { "vs*" }
248		buildoptions {
249			"/wd4005", -- warning C4005: '_CRT_SECURE_NO_WARNINGS': macro redefinition
250			"/wd4065", -- warning C4065: switch statement contains 'default' but no 'case' labels
251			"/wd4100", -- warning C4100: 'inclusionDepth' : unreferenced formal parameter
252			"/wd4127", -- warning C4127: conditional expression is constant
253			"/wd4189", -- warning C4189: 'isFloat': local variable is initialized but not referenced
254			"/wd4244", -- warning C4244: '=': conversion from 'int' to 'char', possible loss of data
255			"/wd4310", -- warning C4310: cast truncates constant value
256			"/wd4389", -- warning C4389: '==': signed/unsigned mismatch
257			"/wd4456", -- warning C4456: declaration of 'feature' hides previous local declaration
258			"/wd4457", -- warning C4457: declaration of 'token' hides function parameter
259			"/wd4458", -- warning C4458: declaration of 'language' hides class member
260			"/wd4702", -- warning C4702: unreachable code
261			"/wd4715", -- warning C4715: 'spv::Builder::makeFpConstant': not all control paths return a value
262			"/wd4838", -- warning C4838: conversion from 'spv::GroupOperation' to 'unsigned int' requires a narrowing conversion
263		}
264
265	configuration { "mingw* or linux or osx" }
266		buildoptions {
267			"-Wno-ignored-qualifiers",
268			"-Wno-implicit-fallthrough",
269			"-Wno-missing-field-initializers",
270			"-Wno-reorder",
271			"-Wno-return-type",
272			"-Wno-shadow",
273			"-Wno-sign-compare",
274			"-Wno-switch",
275			"-Wno-undef",
276			"-Wno-unknown-pragmas",
277			"-Wno-unused-function",
278			"-Wno-unused-parameter",
279			"-Wno-unused-variable",
280		}
281
282	configuration { "osx" }
283		buildoptions {
284			"-Wno-c++11-extensions",
285			"-Wno-unused-const-variable",
286			"-Wno-deprecated-register",
287		}
288
289	configuration { "linux-gcc-*" }
290		buildoptions {
291			"-Wno-unused-but-set-variable",
292		}
293
294	configuration { "mingw* or linux or osx" }
295		buildoptions {
296			"-fno-strict-aliasing", -- glslang has bugs if strict aliasing is used.
297		}
298
299	configuration {}
300
301project "glsl-optimizer"
302	kind "StaticLib"
303
304	includedirs {
305		path.join(GLSL_OPTIMIZER, "src"),
306		path.join(GLSL_OPTIMIZER, "include"),
307		path.join(GLSL_OPTIMIZER, "src/mesa"),
308		path.join(GLSL_OPTIMIZER, "src/mapi"),
309		path.join(GLSL_OPTIMIZER, "src/glsl"),
310	}
311
312	files {
313		path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp.h"),
314		path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp-lex.c"),
315		path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp-parse.c"),
316		path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp-parse.h"),
317		path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/pp.c"),
318
319		path.join(GLSL_OPTIMIZER, "src/glsl/ast.h"),
320		path.join(GLSL_OPTIMIZER, "src/glsl/ast_array_index.cpp"),
321		path.join(GLSL_OPTIMIZER, "src/glsl/ast_expr.cpp"),
322		path.join(GLSL_OPTIMIZER, "src/glsl/ast_function.cpp"),
323		path.join(GLSL_OPTIMIZER, "src/glsl/ast_to_hir.cpp"),
324		path.join(GLSL_OPTIMIZER, "src/glsl/ast_type.cpp"),
325		path.join(GLSL_OPTIMIZER, "src/glsl/builtin_functions.cpp"),
326		path.join(GLSL_OPTIMIZER, "src/glsl/builtin_type_macros.h"),
327		path.join(GLSL_OPTIMIZER, "src/glsl/builtin_types.cpp"),
328		path.join(GLSL_OPTIMIZER, "src/glsl/builtin_variables.cpp"),
329		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_lexer.cpp"),
330		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_optimizer.cpp"),
331		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_optimizer.h"),
332		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_parser.cpp"),
333		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_parser.h"),
334		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_parser_extras.cpp"),
335		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_parser_extras.h"),
336		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_symbol_table.cpp"),
337		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_symbol_table.h"),
338		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_types.cpp"),
339		path.join(GLSL_OPTIMIZER, "src/glsl/glsl_types.h"),
340		path.join(GLSL_OPTIMIZER, "src/glsl/hir_field_selection.cpp"),
341		path.join(GLSL_OPTIMIZER, "src/glsl/ir.cpp"),
342		path.join(GLSL_OPTIMIZER, "src/glsl/ir.h"),
343		path.join(GLSL_OPTIMIZER, "src/glsl/ir_basic_block.cpp"),
344		path.join(GLSL_OPTIMIZER, "src/glsl/ir_basic_block.h"),
345		path.join(GLSL_OPTIMIZER, "src/glsl/ir_builder.cpp"),
346		path.join(GLSL_OPTIMIZER, "src/glsl/ir_builder.h"),
347		path.join(GLSL_OPTIMIZER, "src/glsl/ir_clone.cpp"),
348		path.join(GLSL_OPTIMIZER, "src/glsl/ir_constant_expression.cpp"),
349		path.join(GLSL_OPTIMIZER, "src/glsl/ir_equals.cpp"),
350		path.join(GLSL_OPTIMIZER, "src/glsl/ir_expression_flattening.cpp"),
351		path.join(GLSL_OPTIMIZER, "src/glsl/ir_expression_flattening.h"),
352		path.join(GLSL_OPTIMIZER, "src/glsl/ir_function.cpp"),
353		path.join(GLSL_OPTIMIZER, "src/glsl/ir_function_can_inline.cpp"),
354		path.join(GLSL_OPTIMIZER, "src/glsl/ir_function_detect_recursion.cpp"),
355		path.join(GLSL_OPTIMIZER, "src/glsl/ir_function_inlining.h"),
356		path.join(GLSL_OPTIMIZER, "src/glsl/ir_hierarchical_visitor.cpp"),
357		path.join(GLSL_OPTIMIZER, "src/glsl/ir_hierarchical_visitor.h"),
358		path.join(GLSL_OPTIMIZER, "src/glsl/ir_hv_accept.cpp"),
359		path.join(GLSL_OPTIMIZER, "src/glsl/ir_import_prototypes.cpp"),
360		path.join(GLSL_OPTIMIZER, "src/glsl/ir_optimization.h"),
361		path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_glsl_visitor.cpp"),
362		path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_glsl_visitor.h"),
363		path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_metal_visitor.cpp"),
364		path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_metal_visitor.h"),
365		path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_visitor.cpp"),
366		path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_visitor.h"),
367		path.join(GLSL_OPTIMIZER, "src/glsl/ir_rvalue_visitor.cpp"),
368		path.join(GLSL_OPTIMIZER, "src/glsl/ir_rvalue_visitor.h"),
369		path.join(GLSL_OPTIMIZER, "src/glsl/ir_stats.cpp"),
370		path.join(GLSL_OPTIMIZER, "src/glsl/ir_stats.h"),
371		path.join(GLSL_OPTIMIZER, "src/glsl/ir_uniform.h"),
372		path.join(GLSL_OPTIMIZER, "src/glsl/ir_unused_structs.cpp"),
373		path.join(GLSL_OPTIMIZER, "src/glsl/ir_unused_structs.h"),
374		path.join(GLSL_OPTIMIZER, "src/glsl/ir_validate.cpp"),
375		path.join(GLSL_OPTIMIZER, "src/glsl/ir_variable_refcount.cpp"),
376		path.join(GLSL_OPTIMIZER, "src/glsl/ir_variable_refcount.h"),
377		path.join(GLSL_OPTIMIZER, "src/glsl/ir_visitor.h"),
378		path.join(GLSL_OPTIMIZER, "src/glsl/link_atomics.cpp"),
379		path.join(GLSL_OPTIMIZER, "src/glsl/link_functions.cpp"),
380		path.join(GLSL_OPTIMIZER, "src/glsl/link_interface_blocks.cpp"),
381		path.join(GLSL_OPTIMIZER, "src/glsl/link_uniform_block_active_visitor.cpp"),
382		path.join(GLSL_OPTIMIZER, "src/glsl/link_uniform_block_active_visitor.h"),
383		path.join(GLSL_OPTIMIZER, "src/glsl/link_uniform_blocks.cpp"),
384		path.join(GLSL_OPTIMIZER, "src/glsl/link_uniform_initializers.cpp"),
385		path.join(GLSL_OPTIMIZER, "src/glsl/link_uniforms.cpp"),
386		path.join(GLSL_OPTIMIZER, "src/glsl/link_varyings.cpp"),
387		path.join(GLSL_OPTIMIZER, "src/glsl/link_varyings.h"),
388		path.join(GLSL_OPTIMIZER, "src/glsl/linker.cpp"),
389		path.join(GLSL_OPTIMIZER, "src/glsl/linker.h"),
390		path.join(GLSL_OPTIMIZER, "src/glsl/list.h"),
391		path.join(GLSL_OPTIMIZER, "src/glsl/loop_analysis.cpp"),
392		path.join(GLSL_OPTIMIZER, "src/glsl/loop_analysis.h"),
393		path.join(GLSL_OPTIMIZER, "src/glsl/loop_controls.cpp"),
394		path.join(GLSL_OPTIMIZER, "src/glsl/loop_unroll.cpp"),
395		path.join(GLSL_OPTIMIZER, "src/glsl/lower_clip_distance.cpp"),
396		path.join(GLSL_OPTIMIZER, "src/glsl/lower_discard.cpp"),
397		path.join(GLSL_OPTIMIZER, "src/glsl/lower_discard_flow.cpp"),
398		path.join(GLSL_OPTIMIZER, "src/glsl/lower_if_to_cond_assign.cpp"),
399		path.join(GLSL_OPTIMIZER, "src/glsl/lower_instructions.cpp"),
400		path.join(GLSL_OPTIMIZER, "src/glsl/lower_jumps.cpp"),
401		path.join(GLSL_OPTIMIZER, "src/glsl/lower_mat_op_to_vec.cpp"),
402		path.join(GLSL_OPTIMIZER, "src/glsl/lower_named_interface_blocks.cpp"),
403		path.join(GLSL_OPTIMIZER, "src/glsl/lower_noise.cpp"),
404		path.join(GLSL_OPTIMIZER, "src/glsl/lower_offset_array.cpp"),
405		path.join(GLSL_OPTIMIZER, "src/glsl/lower_output_reads.cpp"),
406		path.join(GLSL_OPTIMIZER, "src/glsl/lower_packed_varyings.cpp"),
407		path.join(GLSL_OPTIMIZER, "src/glsl/lower_packing_builtins.cpp"),
408		path.join(GLSL_OPTIMIZER, "src/glsl/lower_ubo_reference.cpp"),
409		path.join(GLSL_OPTIMIZER, "src/glsl/lower_variable_index_to_cond_assign.cpp"),
410		path.join(GLSL_OPTIMIZER, "src/glsl/lower_vec_index_to_cond_assign.cpp"),
411		path.join(GLSL_OPTIMIZER, "src/glsl/lower_vec_index_to_swizzle.cpp"),
412		path.join(GLSL_OPTIMIZER, "src/glsl/lower_vector.cpp"),
413		path.join(GLSL_OPTIMIZER, "src/glsl/lower_vector_insert.cpp"),
414		path.join(GLSL_OPTIMIZER, "src/glsl/lower_vertex_id.cpp"),
415		path.join(GLSL_OPTIMIZER, "src/glsl/opt_algebraic.cpp"),
416		path.join(GLSL_OPTIMIZER, "src/glsl/opt_array_splitting.cpp"),
417		path.join(GLSL_OPTIMIZER, "src/glsl/opt_constant_folding.cpp"),
418		path.join(GLSL_OPTIMIZER, "src/glsl/opt_constant_propagation.cpp"),
419		path.join(GLSL_OPTIMIZER, "src/glsl/opt_constant_variable.cpp"),
420		path.join(GLSL_OPTIMIZER, "src/glsl/opt_copy_propagation.cpp"),
421		path.join(GLSL_OPTIMIZER, "src/glsl/opt_copy_propagation_elements.cpp"),
422		path.join(GLSL_OPTIMIZER, "src/glsl/opt_cse.cpp"),
423		path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_builtin_variables.cpp"),
424		path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_builtin_varyings.cpp"),
425		path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_code.cpp"),
426		path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_code_local.cpp"),
427		path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_functions.cpp"),
428		path.join(GLSL_OPTIMIZER, "src/glsl/opt_flatten_nested_if_blocks.cpp"),
429		path.join(GLSL_OPTIMIZER, "src/glsl/opt_flip_matrices.cpp"),
430		path.join(GLSL_OPTIMIZER, "src/glsl/opt_function_inlining.cpp"),
431		path.join(GLSL_OPTIMIZER, "src/glsl/opt_if_simplification.cpp"),
432		path.join(GLSL_OPTIMIZER, "src/glsl/opt_minmax.cpp"),
433		path.join(GLSL_OPTIMIZER, "src/glsl/opt_noop_swizzle.cpp"),
434		path.join(GLSL_OPTIMIZER, "src/glsl/opt_rebalance_tree.cpp"),
435		path.join(GLSL_OPTIMIZER, "src/glsl/opt_redundant_jumps.cpp"),
436		path.join(GLSL_OPTIMIZER, "src/glsl/opt_structure_splitting.cpp"),
437		path.join(GLSL_OPTIMIZER, "src/glsl/opt_swizzle_swizzle.cpp"),
438		path.join(GLSL_OPTIMIZER, "src/glsl/opt_tree_grafting.cpp"),
439		path.join(GLSL_OPTIMIZER, "src/glsl/opt_vectorize.cpp"),
440		path.join(GLSL_OPTIMIZER, "src/glsl/program.h"),
441		path.join(GLSL_OPTIMIZER, "src/glsl/s_expression.cpp"),
442		path.join(GLSL_OPTIMIZER, "src/glsl/s_expression.h"),
443		path.join(GLSL_OPTIMIZER, "src/glsl/standalone_scaffolding.cpp"),
444		path.join(GLSL_OPTIMIZER, "src/glsl/standalone_scaffolding.h"),
445		path.join(GLSL_OPTIMIZER, "src/glsl/strtod.c"),
446		path.join(GLSL_OPTIMIZER, "src/glsl/strtod.h"),
447
448		path.join(GLSL_OPTIMIZER, "src/mesa/main/compiler.h"),
449		path.join(GLSL_OPTIMIZER, "src/mesa/main/config.h"),
450		path.join(GLSL_OPTIMIZER, "src/mesa/main/context.h"),
451		path.join(GLSL_OPTIMIZER, "src/mesa/main/core.h"),
452		path.join(GLSL_OPTIMIZER, "src/mesa/main/dd.h"),
453		path.join(GLSL_OPTIMIZER, "src/mesa/main/errors.h"),
454		path.join(GLSL_OPTIMIZER, "src/mesa/main/glheader.h"),
455		path.join(GLSL_OPTIMIZER, "src/mesa/main/glminimal.h"),
456		path.join(GLSL_OPTIMIZER, "src/mesa/main/imports.c"),
457		path.join(GLSL_OPTIMIZER, "src/mesa/main/imports.h"),
458		path.join(GLSL_OPTIMIZER, "src/mesa/main/macros.h"),
459		path.join(GLSL_OPTIMIZER, "src/mesa/main/mtypes.h"),
460		path.join(GLSL_OPTIMIZER, "src/mesa/main/simple_list.h"),
461
462		path.join(GLSL_OPTIMIZER, "src/mesa/program/hash_table.h"),
463		path.join(GLSL_OPTIMIZER, "src/mesa/program/prog_hash_table.c"),
464		path.join(GLSL_OPTIMIZER, "src/mesa/program/prog_instruction.h"),
465		path.join(GLSL_OPTIMIZER, "src/mesa/program/prog_parameter.h"),
466		path.join(GLSL_OPTIMIZER, "src/mesa/program/prog_statevars.h"),
467		path.join(GLSL_OPTIMIZER, "src/mesa/program/symbol_table.c"),
468		path.join(GLSL_OPTIMIZER, "src/mesa/program/symbol_table.h"),
469
470		path.join(GLSL_OPTIMIZER, "src/util/hash_table.c"),
471		path.join(GLSL_OPTIMIZER, "src/util/hash_table.h"),
472		path.join(GLSL_OPTIMIZER, "src/util/macros.h"),
473		path.join(GLSL_OPTIMIZER, "src/util/ralloc.c"),
474		path.join(GLSL_OPTIMIZER, "src/util/ralloc.h"),
475	}
476
477	removefiles {
478		path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp.c"),
479		path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/tests/**"),
480		path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/**.l"),
481		path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/**.y"),
482		path.join(GLSL_OPTIMIZER, "src/glsl/ir_set_program_inouts.cpp"),
483		path.join(GLSL_OPTIMIZER, "src/glsl/main.cpp"),
484		path.join(GLSL_OPTIMIZER, "src/glsl/builtin_stubs.cpp"),
485	}
486
487	configuration { "Release" }
488		flags {
489			"Optimize",
490		}
491
492		removeflags {
493			-- GCC 4.9 -O2 + -fno-strict-aliasing don't work together...
494			"OptimizeSpeed",
495		}
496
497	configuration { "vs*" }
498		includedirs {
499			path.join(GLSL_OPTIMIZER, "src/glsl/msvc"),
500		}
501
502		defines { -- glsl-optimizer
503			"__STDC__",
504			"__STDC_VERSION__=199901L",
505			"strdup=_strdup",
506			"alloca=_alloca",
507			"isascii=__isascii",
508		}
509
510		buildoptions {
511			"/wd4100", -- error C4100: '' : unreferenced formal parameter
512			"/wd4127", -- warning C4127: conditional expression is constant
513			"/wd4132", -- warning C4132: 'deleted_key_value': const object should be initialized
514			"/wd4189", -- warning C4189: 'interface_type': local variable is initialized but not referenced
515			"/wd4204", -- warning C4204: nonstandard extension used: non-constant aggregate initializer
516			"/wd4244", -- warning C4244: '=': conversion from 'const flex_int32_t' to 'YY_CHAR', possible loss of data
517			"/wd4389", -- warning C4389: '!=': signed/unsigned mismatch
518			"/wd4245", -- warning C4245: 'return': conversion from 'int' to 'unsigned int', signed/unsigned mismatch
519			"/wd4701", -- warning C4701: potentially uninitialized local variable 'lower' used
520			"/wd4702", -- warning C4702: unreachable code
521			"/wd4706", -- warning C4706: assignment within conditional expression
522			"/wd4996", -- warning C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup.
523		}
524
525	configuration { "mingw* or linux or osx" }
526		buildoptions {
527			"-fno-strict-aliasing", -- glsl-optimizer has bugs if strict aliasing is used.
528
529			"-Wno-implicit-fallthrough",
530			"-Wno-parentheses",
531			"-Wno-sign-compare",
532			"-Wno-unused-function",
533			"-Wno-unused-parameter",
534		}
535
536		removebuildoptions {
537			"-Wshadow", -- glsl-optimizer is full of -Wshadow warnings ignore it.
538		}
539
540	configuration { "osx" }
541		buildoptions {
542			"-Wno-deprecated-register",
543		}
544
545	configuration { "mingw* or linux-gcc-*" }
546		buildoptions {
547			"-Wno-misleading-indentation",
548		}
549
550	configuration {}
551
552project "fcpp"
553	kind "StaticLib"
554
555	defines { -- fcpp
556		"NINCLUDE=64",
557		"NWORK=65536",
558		"NBUFF=65536",
559		"OLD_PREPROCESSOR=0",
560--		"MSG_PREFIX=\"Preprocessor: \"",
561	}
562
563	files {
564		path.join(FCPP_DIR, "**.h"),
565		path.join(FCPP_DIR, "cpp1.c"),
566		path.join(FCPP_DIR, "cpp2.c"),
567		path.join(FCPP_DIR, "cpp3.c"),
568		path.join(FCPP_DIR, "cpp4.c"),
569		path.join(FCPP_DIR, "cpp5.c"),
570		path.join(FCPP_DIR, "cpp6.c"),
571		path.join(FCPP_DIR, "cpp6.c"),
572	}
573
574	configuration { "vs*" }
575
576		buildoptions {
577			"/wd4055", -- warning C4055: 'type cast': from data pointer 'void *' to function pointer 'void (__cdecl *)(char *,void *)'
578			"/wd4244", -- warning C4244: '=': conversion from 'const flex_int32_t' to 'YY_CHAR', possible loss of data
579			"/wd4701", -- warning C4701: potentially uninitialized local variable 'lower' used
580			"/wd4706", -- warning C4706: assignment within conditional expression
581		}
582
583	configuration { "not vs*" }
584		buildoptions {
585			"-Wno-implicit-fallthrough",
586			"-Wno-incompatible-pointer-types",
587			"-Wno-parentheses-equality",
588		}
589
590	configuration {}
591
592project "shaderc"
593	kind "ConsoleApp"
594
595	includedirs {
596		path.join(BX_DIR,   "include"),
597		path.join(BIMG_DIR, "include"),
598		path.join(BGFX_DIR, "include"),
599
600		path.join(BGFX_DIR, "3rdparty/dxsdk/include"),
601
602		FCPP_DIR,
603
604		path.join(BGFX_DIR, "3rdparty/glslang/glslang/Public"),
605		path.join(BGFX_DIR, "3rdparty/glslang/glslang/Include"),
606		path.join(BGFX_DIR, "3rdparty/glslang"),
607
608		path.join(GLSL_OPTIMIZER, "include"),
609		path.join(GLSL_OPTIMIZER, "src/glsl"),
610
611		SPIRV_CROSS,
612
613		path.join(SPIRV_TOOLS, "include"),
614	}
615
616	links {
617		"bx",
618		"fcpp",
619		"glslang",
620		"glsl-optimizer",
621		"spirv-opt",
622		"spirv-cross",
623	}
624
625	files {
626		path.join(BGFX_DIR, "tools/shaderc/**.cpp"),
627		path.join(BGFX_DIR, "tools/shaderc/**.h"),
628		path.join(BGFX_DIR, "src/vertexdecl.**"),
629		path.join(BGFX_DIR, "src/shader_spirv.**"),
630	}
631
632	configuration { "mingw-*" }
633		targetextension ".exe"
634
635	configuration { "osx" }
636		links {
637			"Cocoa.framework",
638		}
639
640	configuration { "vs*" }
641		includedirs {
642			path.join(GLSL_OPTIMIZER, "include/c99"),
643		}
644
645	configuration { "vs20* or mingw*" }
646		links {
647			"psapi",
648		}
649
650	configuration { "osx or linux*" }
651		links {
652			"pthread",
653		}
654
655	configuration {}
656
657	if filesexist(BGFX_DIR, path.join(BGFX_DIR, "../bgfx-gnm"), {
658		path.join(BGFX_DIR, "scripts/shaderc.lua"), }) then
659
660		if filesexist(BGFX_DIR, path.join(BGFX_DIR, "../bgfx-gnm"), {
661			path.join(BGFX_DIR, "tools/shaderc/shaderc_pssl.cpp"), }) then
662
663			removefiles {
664				path.join(BGFX_DIR, "tools/shaderc/shaderc_pssl.cpp"),
665			}
666		end
667
668		dofile(path.join(BGFX_DIR, "../bgfx-gnm/scripts/shaderc.lua") )
669	end
670
671	strip()
672
673group "tools"
674