root := ../..

include $(root)/build/config.make
include $(root)/build/c/rules.make
include $(root)/build/cxx/rules.make

EXTRA_CPPFLAGS := -I..

src :=	c/expat/xmlparse.c c/expat/xmlrole.c c/expat/xmltok.c

src += cxx/string.cxx cxx/ro-string.cxx
src += cxx/parser/elements.cxx cxx/parser/state.cxx
src += cxx/parser/expat/elements.cxx cxx/parser/expat/xml-error.cxx

ifeq ($(XSDE_EXCEPTIONS),y)
src += cxx/parser/exceptions.cxx
else
src += cxx/parser/sys-error.cxx cxx/parser/error.cxx
endif

# Data types.
#

src += cxx/parser/buffer.cxx

ifeq ($(XSDE_STL),y)
src += cxx/parser/string-sequence-stl.cxx
else
src +=                                     \
cxx/parser/qname.cxx                       \
cxx/parser/string-sequence.cxx
endif

# Parsers.
#

ifeq ($(XSDE_VALIDATION),y)

src +=                                    \
cxx/parser/schema-error.cxx               \
cxx/parser/validating/parser.cxx          \
cxx/parser/validating/char-table.cxx      \
cxx/parser/validating/ncname-common.cxx   \
cxx/parser/validating/time-zone.cxx       \
cxx/parser/validating/xml-schema-pskel.cxx

src +=                                          \
cxx/parser/validating/any-type.cxx              \
cxx/parser/validating/boolean.cxx               \
cxx/parser/validating/number.cxx                \
cxx/parser/validating/byte.cxx                  \
cxx/parser/validating/unsigned-byte.cxx         \
cxx/parser/validating/short.cxx                 \
cxx/parser/validating/unsigned-short.cxx        \
cxx/parser/validating/int.cxx                   \
cxx/parser/validating/unsigned-int.cxx          \
cxx/parser/validating/integer.cxx               \
cxx/parser/validating/negative-integer.cxx      \
cxx/parser/validating/non-positive-integer.cxx  \
cxx/parser/validating/positive-integer.cxx      \
cxx/parser/validating/non-negative-integer.cxx  \
cxx/parser/validating/float.cxx                 \
cxx/parser/validating/double.cxx                \
cxx/parser/validating/decimal.cxx

ifeq ($(XSDE_LONGLONG),y)
src +=                                          \
cxx/parser/validating/long-long.cxx             \
cxx/parser/validating/unsigned-long-long.cxx
else
src +=                                          \
cxx/parser/validating/long.cxx                  \
cxx/parser/validating/unsigned-long.cxx
endif

ifeq ($(XSDE_STL),y)

src +=                                          \
cxx/parser/validating/string-stl.cxx            \
cxx/parser/validating/normalized-string-stl.cxx \
cxx/parser/validating/token-stl.cxx             \
cxx/parser/validating/name-stl.cxx              \
cxx/parser/validating/nmtoken-stl.cxx           \
cxx/parser/validating/nmtokens-stl.cxx          \
cxx/parser/validating/ncname-stl.cxx            \
cxx/parser/validating/id-stl.cxx                \
cxx/parser/validating/idref-stl.cxx             \
cxx/parser/validating/idrefs-stl.cxx            \
cxx/parser/validating/language-stl.cxx          \
cxx/parser/validating/uri-stl.cxx               \
cxx/parser/validating/qname-stl.cxx

else

src +=                                       \
cxx/parser/validating/string.cxx             \
cxx/parser/validating/normalized-string.cxx  \
cxx/parser/validating/token.cxx              \
cxx/parser/validating/name.cxx               \
cxx/parser/validating/nmtoken.cxx            \
cxx/parser/validating/nmtokens.cxx           \
cxx/parser/validating/ncname.cxx             \
cxx/parser/validating/id.cxx                 \
cxx/parser/validating/idref.cxx              \
cxx/parser/validating/idrefs.cxx             \
cxx/parser/validating/language.cxx           \
cxx/parser/validating/uri.cxx                \
cxx/parser/validating/qname.cxx

endif # stl

src +=                                       \
cxx/parser/validating/base64-binary.cxx      \
cxx/parser/validating/hex-binary.cxx         \
cxx/parser/validating/gday.cxx               \
cxx/parser/validating/gmonth.cxx             \
cxx/parser/validating/gyear.cxx              \
cxx/parser/validating/gmonth-day.cxx         \
cxx/parser/validating/gyear-month.cxx        \
cxx/parser/validating/date.cxx               \
cxx/parser/validating/time.cxx               \
cxx/parser/validating/date-time.cxx          \
cxx/parser/validating/duration.cxx

else # validation

src +=                                         \
cxx/parser/non-validating/parser.cxx           \
cxx/parser/non-validating/time-zone.cxx        \
cxx/parser/non-validating/xml-schema-pskel.cxx

src +=                                              \
cxx/parser/non-validating/any-type.cxx              \
cxx/parser/non-validating/boolean.cxx               \
cxx/parser/non-validating/number.cxx                \
cxx/parser/non-validating/byte.cxx                  \
cxx/parser/non-validating/unsigned-byte.cxx         \
cxx/parser/non-validating/short.cxx                 \
cxx/parser/non-validating/unsigned-short.cxx        \
cxx/parser/non-validating/int.cxx                   \
cxx/parser/non-validating/unsigned-int.cxx          \
cxx/parser/non-validating/integer.cxx               \
cxx/parser/non-validating/negative-integer.cxx      \
cxx/parser/non-validating/non-positive-integer.cxx  \
cxx/parser/non-validating/positive-integer.cxx      \
cxx/parser/non-validating/non-negative-integer.cxx  \
cxx/parser/non-validating/float.cxx                 \
cxx/parser/non-validating/double.cxx                \
cxx/parser/non-validating/decimal.cxx

ifeq ($(XSDE_LONGLONG),y)
src +=                                              \
cxx/parser/non-validating/long-long.cxx             \
cxx/parser/non-validating/unsigned-long-long.cxx
else
src +=                                              \
cxx/parser/non-validating/long.cxx                  \
cxx/parser/non-validating/unsigned-long.cxx
endif

ifeq ($(XSDE_STL),y)

src +=                                              \
cxx/parser/non-validating/string-stl.cxx            \
cxx/parser/non-validating/normalized-string-stl.cxx \
cxx/parser/non-validating/token-stl.cxx             \
cxx/parser/non-validating/name-stl.cxx              \
cxx/parser/non-validating/nmtoken-stl.cxx           \
cxx/parser/non-validating/nmtokens-stl.cxx          \
cxx/parser/non-validating/ncname-stl.cxx            \
cxx/parser/non-validating/id-stl.cxx                \
cxx/parser/non-validating/idref-stl.cxx             \
cxx/parser/non-validating/idrefs-stl.cxx            \
cxx/parser/non-validating/language-stl.cxx          \
cxx/parser/non-validating/uri-stl.cxx               \
cxx/parser/non-validating/qname-stl.cxx

else

src +=                                           \
cxx/parser/non-validating/string.cxx             \
cxx/parser/non-validating/normalized-string.cxx  \
cxx/parser/non-validating/token.cxx              \
cxx/parser/non-validating/name.cxx               \
cxx/parser/non-validating/nmtoken.cxx            \
cxx/parser/non-validating/nmtokens.cxx           \
cxx/parser/non-validating/ncname.cxx             \
cxx/parser/non-validating/id.cxx                 \
cxx/parser/non-validating/idref.cxx              \
cxx/parser/non-validating/idrefs.cxx             \
cxx/parser/non-validating/language.cxx           \
cxx/parser/non-validating/uri.cxx                \
cxx/parser/non-validating/qname.cxx

endif # stl

src +=                                           \
cxx/parser/non-validating/base64-binary.cxx      \
cxx/parser/non-validating/hex-binary.cxx         \
cxx/parser/non-validating/gday.cxx               \
cxx/parser/non-validating/gmonth.cxx             \
cxx/parser/non-validating/gyear.cxx              \
cxx/parser/non-validating/gmonth-day.cxx         \
cxx/parser/non-validating/gyear-month.cxx        \
cxx/parser/non-validating/date.cxx               \
cxx/parser/non-validating/time.cxx               \
cxx/parser/non-validating/date-time.cxx          \
cxx/parser/non-validating/duration.cxx

endif # validation

obj := $(src:.c=.o)
obj := $(obj:.cxx=.o)

# Build.
#
libxsde.a: $(obj)
	$(AR) rc $@ $^
ifneq ($(RANLIB),)
	$(RANLIB) $@
endif	

$(src): config.h

config.h:
	@echo "generating config.h"
	@echo "/* Generated - do not edit. */" >$@
	@echo "#ifndef XSDE_CONFIG_H"         >>$@
	@echo "#define XSDE_CONFIG_H"         >>$@
	@echo ""                              >>$@
ifeq ($(XSDE_PLATFORM),wince)
	@echo "#define XSDE_PLATFORM_WINCE"   >>$@
endif
ifeq ($(XSDE_PLATFORM),win32)
	@echo "#define XSDE_PLATFORM_WIN32"   >>$@
endif
ifeq ($(XSDE_PLATFORM),posix)
	@echo "#define XSDE_PLATFORM_POSIX"   >>$@
endif
ifeq ($(XSDE_BYTEORDER),l)
	@echo "#define XSDE_BYTEORDER 1234"   >>$@
endif
ifeq ($(XSDE_BYTEORDER),b)
	@echo "#define XSDE_BYTEORDER 4321"   >>$@
endif
ifeq ($(XSDE_STL),y)
	@echo "#define XSDE_STL"              >>$@
endif
ifeq ($(XSDE_IOSTREAM),y)
	@echo "#define XSDE_IOSTREAM"         >>$@
endif
ifeq ($(XSDE_EXCEPTIONS),y)
	@echo "#define XSDE_EXCEPTIONS"       >>$@
endif
ifeq ($(XSDE_VALIDATION),y)
	@echo "#define XSDE_VALIDATION"       >>$@
endif
ifeq ($(XSDE_LONGLONG),y)
	@echo "#define XSDE_LONGLONG"         >>$@
endif
	@echo ""                              >>$@
	@echo "#endif"                        >>$@


# Test.
#
.PHONY: test
test: libxsde.a
	@:

# Clean.
#
.PHONY: clean
clean:
	rm -f libxsde.a $(obj) config.h
