# Copyright © 2012 Intel Corporation
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

SUBDIRS = . main/tests

# state tracker tests depend on libmesagallium.la
if HAVE_GALLIUM
SUBDIRS += state_tracker/tests
endif

if HAVE_XLIB_GLX
SUBDIRS += drivers/x11
endif

if HAVE_DRICOMMON
SUBDIRS += drivers/dri
endif

if HAVE_OSMESA
SUBDIRS += drivers/osmesa
endif

include Makefile.sources

EXTRA_DIST = \
	drivers/SConscript \
	main/meson.build \
	program/meson.build \
	meson.build \
	main/format_fallback.py \
	main/format_info.py \
	main/format_pack.py \
	main/format_parser.py \
	main/format_unpack.py \
	main/formats.csv \
	main/get_hash_generator.py \
	main/get_hash_params.py \
	program/program_lexer.l \
	program/program_parse.y \
	SConscript \
	swrast/NOTES \
	swrast_setup/NOTES \
	tnl/NOTES \
	tnl_dd

BUILT_SOURCES = \
	main/get_hash.h \
	main/format_fallback.c \
	main/format_info.h \
	main/format_pack.c \
	main/format_unpack.c \
	program/program_parse.tab.c \
	program/lex.yy.c
CLEANFILES = \
	$(BUILT_SOURCES) \
	program/program_parse.tab.h

PYTHON_GEN = $(AM_V_GEN)$(PYTHON) $(PYTHON_FLAGS)

main/get_hash.h: ../mapi/glapi/gen/gl_and_es_API.xml main/get_hash_params.py \
                 main/get_hash_generator.py
	$(PYTHON_GEN) $(srcdir)/main/get_hash_generator.py \
		-f $(srcdir)/../mapi/glapi/gen/gl_and_es_API.xml > $@

main/format_fallback.c: main/format_fallback.py \
                        main/format_parser.py \
	                main/formats.csv
	$(PYTHON_GEN) $(srcdir)/main/format_fallback.py $(srcdir)/main/formats.csv $@

main/format_info.h: main/formats.csv \
                    main/format_parser.py main/format_info.py
	$(PYTHON_GEN) $(srcdir)/main/format_info.py $(srcdir)/main/formats.csv > $@

main/format_pack.c: main/format_pack.py main/formats.csv \
                    main/format_parser.py
	$(PYTHON_GEN) $(srcdir)/main/format_pack.py $(srcdir)/main/formats.csv > $@

main/format_unpack.c: main/format_unpack.py main/formats.csv	\
                      main/format_parser.py
	$(PYTHON_GEN) $(srcdir)/main/format_unpack.py $(srcdir)/main/formats.csv > $@

main/formats.c: main/format_info.h

noinst_LTLIBRARIES = $(ARCH_LIBS)
if NEED_LIBMESA
noinst_LTLIBRARIES += libmesa.la
else
check_LTLIBRARIES = libmesa.la
endif
if HAVE_GALLIUM
noinst_LTLIBRARIES += libmesagallium.la
endif

AM_CPPFLAGS = $(DEFINES) $(INCLUDE_DIRS)
AM_CFLAGS = \
	$(VDPAU_CFLAGS) \
	$(LLVM_CFLAGS) \
	$(VISIBILITY_CFLAGS) \
	$(MSVC2013_COMPAT_CFLAGS)
AM_CXXFLAGS = \
	$(LLVM_CFLAGS) \
	$(VISIBILITY_CXXFLAGS) \
	$(MSVC2013_COMPAT_CXXFLAGS)

ARCH_LIBS =

if SSE41_SUPPORTED
ARCH_LIBS += libmesa_sse41.la
endif

MESA_ASM_FILES_FOR_ARCH =

if HAVE_X86_ASM
noinst_PROGRAMS = gen_matypes

gen_matypes_SOURCES = x86/gen_matypes.c
BUILT_SOURCES += matypes.h

if HAVE_X86_64_ASM
MESA_ASM_FILES_FOR_ARCH += $(X86_64_FILES)
AM_CPPFLAGS += -I$(builddir)/x86-64 -I$(srcdir)/x86-64
else
MESA_ASM_FILES_FOR_ARCH += $(X86_FILES)
AM_CPPFLAGS += -I$(builddir)/x86 -I$(srcdir)/x86
endif
endif
if HAVE_SPARC_ASM
MESA_ASM_FILES_FOR_ARCH += $(SPARC_FILES)
AM_CPPFLAGS += -I$(builddir)/sparc -I$(srcdir)/sparc
endif

libmesa_la_SOURCES = \
	$(MESA_FILES) \
	$(PROGRAM_FILES) \
	$(PROGRAM_NIR_FILES) \
	$(MESA_ASM_FILES_FOR_ARCH)

libmesa_la_LIBADD = \
	$(top_builddir)/src/compiler/glsl/libglsl.la \
	$(ARCH_LIBS)

libmesagallium_la_SOURCES = \
	$(MESA_GALLIUM_FILES) \
	$(PROGRAM_FILES) \
	$(PROGRAM_NIR_FILES) \
	$(MESA_ASM_FILES_FOR_ARCH)

libmesagallium_la_LIBADD = \
	$(top_builddir)/src/compiler/glsl/libglsl.la \
	$(ARCH_LIBS)

libmesa_sse41_la_SOURCES = \
	$(X86_SSE41_FILES)

libmesa_sse41_la_CFLAGS = $(AM_CFLAGS) $(SSE41_CFLAGS)

MKDIR_GEN = $(AM_V_at)$(MKDIR_P) $(@D)
YACC_GEN = $(AM_V_GEN)$(YACC) $(YFLAGS)
LEX_GEN = $(AM_V_GEN)$(LEX) $(LFLAGS)

program/lex.yy.c: program/program_lexer.l
	$(MKDIR_GEN)
	$(LEX_GEN) -o $@ $(srcdir)/program/program_lexer.l

program/program_parse.tab.c program/program_parse.tab.h: program/program_parse.y
	$(MKDIR_GEN)
	$(YACC_GEN) -o $@ -p "_mesa_program_" --defines=$(builddir)/program/program_parse.tab.h $(srcdir)/program/program_parse.y

if GEN_ASM_OFFSETS
matypes.h: $(gen_matypes_SOURCES)
	$(AM_V_GEN)$(COMPILE) $< -DASM_OFFSETS -S -o - | \
		sed -n '/^->/{s:^->::;/[$$]/{s:^:#define :;s:[$$]::};p}' > $@
else
matypes.h: gen_matypes
	$(AM_V_GEN)./gen_matypes > $@
endif

# Emacs tags
tags:
	etags `find . -name \*.[ch]` $(top_srcdir)/include/GL/*.h
