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_PARSER_VALIDATION)$(XSDE_SERIALIZER_VALIDATION),nn)
src += cxx/schema-error.cxx
endif

ifeq ($(XSDE_POLYMORPHIC),y)
src += cxx/hashmap.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_PARSER_VALIDATION)$(XSDE_SERIALIZER_VALIDATION),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_POLYMORPHIC),y)
src += cxx/parser/map.cxx cxx/parser/substitution-map.cxx
endif

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


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

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

ifeq ($(XSDE_POLYMORPHIC),y)
src += cxx/parser/validating/inheritance-map.cxx
endif

src +=                                          \
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/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_POLYMORPHIC),y)
src += cxx/serializer/map.cxx cxx/serializer/substitution-map.cxx
endif

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

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

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

ifeq ($(XSDE_POLYMORPHIC),y)
src += cxx/serializer/validating/inheritance-map.cxx
endif

src +=                                              \
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/serializer.cxx            \
cxx/serializer/non-validating/time-zone.cxx             \
cxx/serializer/non-validating/xml-schema-sskel.cxx

src +=                                                  \
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/normalized-string-stl.cxx \
cxx/serializer/non-validating/token-stl.cxx             \
cxx/serializer/non-validating/name-stl.cxx              \
cxx/serializer/non-validating/nmtoken-stl.cxx           \
cxx/serializer/non-validating/ncname-stl.cxx            \
cxx/serializer/non-validating/id-stl.cxx                \
cxx/serializer/non-validating/idref-stl.cxx             \
cxx/serializer/non-validating/language-stl.cxx          \
cxx/serializer/non-validating/uri-stl.cxx               \
cxx/serializer/non-validating/idrefs-stl.cxx            \
cxx/serializer/non-validating/nmtokens-stl.cxx          \
cxx/serializer/non-validating/qname-stl.cxx

else

src +=                                               \
cxx/serializer/non-validating/string.cxx             \
cxx/serializer/non-validating/normalized-string.cxx  \
cxx/serializer/non-validating/token.cxx              \
cxx/serializer/non-validating/name.cxx               \
cxx/serializer/non-validating/nmtoken.cxx            \
cxx/serializer/non-validating/ncname.cxx             \
cxx/serializer/non-validating/id.cxx                 \
cxx/serializer/non-validating/idref.cxx              \
cxx/serializer/non-validating/language.cxx           \
cxx/serializer/non-validating/uri.cxx                \
cxx/serializer/non-validating/idrefs.cxx             \
cxx/serializer/non-validating/nmtokens.cxx           \
cxx/serializer/non-validating/qname.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) $(ARFLAGS) $@ $^
ifneq ($(RANLIB),)
	$(RANLIB) $@
endif

# It is tricky to output # with both POSIX and Windows shells.
#
ifeq ($(shell echo %PATH%),%PATH%)
h := \\\#
shell_type := posix
else
h := \#
shell_type := windows
endif

$(obj): config.h

config.h:
	@echo generating config.h
ifeq ($(shell_type),windows)
	@echo /* Generated - do not edit. */      >$@
else
	@echo "/* Generated - do not edit. */"    >$@
endif
	@echo $(h)ifndef XSDE_CONFIG_H              >>$@
	@echo $(h)define XSDE_CONFIG_H              >>$@
ifeq ($(XSDE_PLATFORM),wince)
	@echo $(h)define XSDE_PLATFORM_WINCE        >>$@
endif
ifeq ($(XSDE_PLATFORM),win32)
	@echo $(h)define XSDE_PLATFORM_WIN32        >>$@
endif
ifeq ($(XSDE_PLATFORM),posix)
	@echo $(h)define XSDE_PLATFORM_POSIX        >>$@
endif
	@echo $(h)define XSDE_ARCH_WIDTH $(XSDE_ARCH_WIDTH) >>$@
ifeq ($(XSDE_BYTEORDER),l)
	@echo $(h)define XSDE_BYTEORDER 1234        >>$@
endif
ifeq ($(XSDE_BYTEORDER),b)
	@echo $(h)define XSDE_BYTEORDER 4321        >>$@
endif
ifeq ($(XSDE_STL),y)
	@echo $(h)define XSDE_STL                   >>$@
endif
ifeq ($(XSDE_IOSTREAM),y)
	@echo $(h)define XSDE_IOSTREAM              >>$@
endif
ifeq ($(XSDE_EXCEPTIONS),y)
	@echo $(h)define XSDE_EXCEPTIONS            >>$@
endif
ifeq ($(XSDE_LONGLONG),y)
	@echo $(h)define XSDE_LONGLONG              >>$@
endif
ifeq ($(XSDE_SNPRINTF),y)
	@echo $(h)define XSDE_SNPRINTF              >>$@
endif
ifeq ($(XSDE_PARSER_VALIDATION),y)
	@echo $(h)define XSDE_PARSER_VALIDATION     >>$@
endif
ifeq ($(XSDE_SERIALIZER_VALIDATION),y)
	@echo $(h)define XSDE_SERIALIZER_VALIDATION >>$@
endif
ifeq ($(XSDE_REUSE_STYLE),mixin)
	@echo $(h)define XSDE_REUSE_STYLE_MIXIN     >>$@
else
	@echo $(h)undef XSDE_REUSE_STYLE_MIXIN      >>$@
endif
ifeq ($(XSDE_REUSE_STYLE),tiein)
	@echo $(h)define XSDE_REUSE_STYLE_TIEIN     >>$@
else
	@echo $(h)undef XSDE_REUSE_STYLE_TIEIN      >>$@
endif
ifeq ($(XSDE_REUSE_STYLE),none)
	@echo $(h)define XSDE_REUSE_STYLE_NONE      >>$@
else
	@echo $(h)undef XSDE_REUSE_STYLE_NONE       >>$@
endif
ifeq ($(XSDE_POLYMORPHIC),y)
	@echo $(h)define XSDE_POLYMORPHIC           >>$@
	@echo $(h)define XSDE_PARSER_SMAP_BUCKETS $(XSDE_PARSER_SMAP_BUCKETS)UL >>$@
ifeq ($(XSDE_PARSER_VALIDATION),y)
	@echo $(h)define XSDE_PARSER_IMAP_BUCKETS $(XSDE_PARSER_IMAP_BUCKETS)UL >>$@
endif
	@echo $(h)define XSDE_SERIALIZER_SMAP_BUCKETS $(XSDE_SERIALIZER_SMAP_BUCKETS)UL >>$@
	@echo $(h)define XSDE_SERIALIZER_SMAP_BUCKET_BUCKETS $(XSDE_SERIALIZER_SMAP_BUCKET_BUCKETS)UL >>$@
ifeq ($(XSDE_SERIALIZER_VALIDATION),y)
	@echo $(h)define XSDE_SERIALIZER_IMAP_BUCKETS $(XSDE_SERIALIZER_IMAP_BUCKETS)UL >>$@
endif
else
	@echo $(h)undef XSDE_POLYMORPHIC            >>$@
endif
	@echo $(h)endif                             >>$@


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

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