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 += c/genx/genx.c c/genx/char-props.c

src += cxx/string.cxx cxx/ro-string.cxx

ifeq ($(XSDE_EXCEPTIONS),n)
src += cxx/sys-error.cxx
endif

ifneq ($(XSDE_VALIDATION_PARSER)$(XSDE_VALIDATION_SERIALIZER),nn)
src += cxx/schema-error.cxx
endif

# Common data types.
#
src += cxx/buffer.cxx

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


## XML
##
ifneq ($(XSDE_VALIDATION_PARSER)$(XSDE_VALIDATION_SERIALIZER),nn)
src += cxx/xml/char-table.cxx cxx/xml/ncname.cxx
endif


## C++/Parser
##
src += cxx/parser/elements.cxx cxx/parser/state.cxx
src += cxx/parser/expat/document.cxx cxx/parser/expat/xml-error.cxx

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


# Parser implementations.
#
ifeq ($(XSDE_VALIDATION_PARSER),y)

src +=                                          \
cxx/parser/validating/parser.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


## C++/Serializer
##
src += cxx/serializer/elements.cxx cxx/serializer/context.cxx
src += cxx/serializer/genx/document.cxx cxx/serializer/genx/xml-error.cxx

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

# Serializer implementations.
#
ifeq ($(XSDE_VALIDATION_SERIALIZER),y)

src +=                                              \
cxx/serializer/validating/time-zone.cxx

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

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

ifeq ($(XSDE_STL),y)

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

else

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

endif # stl

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

else # validation

src +=                                                  \
cxx/serializer/non-validating/time-zone.cxx

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

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

ifeq ($(XSDE_STL),y)

src +=                                                  \
cxx/serializer/non-validating/string-stl.cxx            \
cxx/serializer/non-validating/uri-stl.cxx               \
cxx/serializer/non-validating/qname-stl.cxx             \
cxx/serializer/non-validating/idrefs-stl.cxx            \
cxx/serializer/non-validating/nmtokens-stl.cxx

else

src +=                                               \
cxx/serializer/non-validating/string.cxx             \
cxx/serializer/non-validating/uri.cxx                \
cxx/serializer/non-validating/qname.cxx              \
cxx/serializer/non-validating/idrefs.cxx             \
cxx/serializer/non-validating/nmtokens.cxx

endif # stl

src +=                                               \
cxx/serializer/non-validating/base64-binary.cxx      \
cxx/serializer/non-validating/hex-binary.cxx         \
cxx/serializer/non-validating/gday.cxx               \
cxx/serializer/non-validating/gmonth.cxx             \
cxx/serializer/non-validating/gyear.cxx              \
cxx/serializer/non-validating/gmonth-day.cxx         \
cxx/serializer/non-validating/gyear-month.cxx        \
cxx/serializer/non-validating/date.cxx               \
cxx/serializer/non-validating/time.cxx               \
cxx/serializer/non-validating/date-time.cxx          \
cxx/serializer/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_PARSER),y)
	@echo "#define XSDE_VALIDATION_PARSER"     >>$@
endif
ifeq ($(XSDE_VALIDATION_SERIALIZER),y)
	@echo "#define XSDE_VALIDATION_SERIALIZER" >>$@
endif
ifeq ($(XSDE_LONGLONG),y)
	@echo "#define XSDE_LONGLONG"              >>$@
endif
ifeq ($(XSDE_SNPRINTF),y)
	@echo "#define XSDE_SNPRINTF"              >>$@
endif
	@echo ""                                   >>$@
	@echo "#endif"                             >>$@


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

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