# 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)$(PYTHON2) $(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
