# -*- Makefile -*-
#
# $Id$
#
# makefile to build the C++ Standard library utility programs
#
##############################################################################

include ../makefile.in

SRCDIRS = $(TOPDIR)/util

# include common variables setting for all makefiles
ONE_REPOSITORY = 1
include ../makefile.common

TARGET    = exec localedef locale

# locale sources and related 
NLSDIR = $(TOPDIR)/etc/nls
LOCDIR = $(BUILDDIR)/nls

# add nls directory to VPATH so that the database directories do not
# have to carry the path with them in the rule target.
VPATH += $(LOCDIR)

# list of locales to build
# first compose a full name from gen_list in the form
#   <locale name>.<codeset>
# then move the known modifiers (@euro and @cyrillic) to the end
# of the name
LOCALES :=                                                                 \
    $(shell sed -e s:"^ *\([^ ]*\)  *\([^ ]*\) *":"\1\.\2":g               \
                -e s:"\([^.]*\)\(.euro\)\([^ ]*\)":"\1\3@euro":g           \
                -e s:"\([^.]*\)\(.cyrillic\)\([^ ]*\)":"\1\3@cyrillic":g   \
                $(NLSDIR)/gen_list)

## Filter from RUNTARGET only the scripts
RUNTARGET := $(filter %.sh,$(RUNTARGET))

# If empty populate it with the names of the locales databases test scripts
ifeq ($(RUNTARGET),)
  RUNTARGET := sanity_test.sh $(patsubst %,%.sh,$(LOCALES))
endif

ifneq ($(CXX_REPOSITORY),)
  LDFLAGS += $(CPPFLAGS)
endif   # ($(CXX_REPOSITORY),)

# Don't want to link exec utility with stdlib, so create our own LDFLAGS var
LDFLAGS.exec = $(filter-out -l$(LIBBASE),$(LDFLAGS))

ifneq ($(RPATH),)
  LDFLAGS += $(RPATH)$(LIBDIR)
endif

##############################################################################
#  TARGETS
##############################################################################
all:  $(LIBDIR)/$(LIBNAME) $(TARGET) $(RUNTARGET)

$(LIBDIR)/$(LIBNAME):
	@$(MAKE) -C $(LIBDIR) 

# link the run utility
exec: runall.o cmdopt.o output.o util.o exec.o display.o
	@echo "$(LD) $^ -o $@ $(LDFLAGS.exec) $(LDLIBS)" $(call CXX.repo,$<) \
	>> $(LOGFILE)
	$(LD) $^ -o $@ $(LDFLAGS.exec) $(LDLIBS) $(call CXX.repo,$<) $(TEEOPTS)

# link the localedef utility
localedef: localedef.o locale.o aliases.o charmap.o codecvt.o collate.o \
           ctype.o def.o diagnostic.o memchk.o messages.o monetary.o    \
           numeric.o path.o time.o scanner.o
	@echo "$(LD) $^ -o $@ $(LDFLAGS) $(LDLIBS)" $(call CXX.repo,$<) \
	>> $(LOGFILE)
	$(LD) $^ -o $@ $(LDFLAGS) $(LDLIBS) $(call CXX.repo,$<) $(TEEOPTS)

# link the locale utility
locale: locale_stub.o
	@echo "$(LD) $^ -o $@ $(LDFLAGS) $(LDLIBS)" $(call CXX.repo,$<) \
	>> $(LOGFILE)
	$(LD) $^ -o $@ $(LDFLAGS) $(LDLIBS) $(call CXX.repo,$<) $(TEEOPTS)

# build all locales with the localedef utility
locales: localedef $(LOCALES)

# the rule builds the scripts that are run by the runall script
$(RUNTARGET): $(NLSDIR)/gen_list
	@(echo "making $@...";                                               \
          echo "#!/bin/sh" > $@;                                             \
          locname=`echo $@ | sed "s:^\./::g;s:\.sh$$::g"`;                   \
          if [ "$@" = "sanity_test.sh" ]; then                               \
              echo "./run_utils -s -b $(BUILDDIR)/bin $$""*" >>$@;           \
          else                                                               \
              echo "./run_utils -f -i $(NLSDIR) -l $$locname $$""*" >> $@;   \
          fi;                                                                \
          chmod ug+x $@;)

# the rule presents as dependencies the source files corresponding
# to that locale; it is run once for each entry in LOCALES
$(LOCALES): $(NLSDIR)/gen_list
	@(lname=`echo $@ | sed "s:\([^.]*\)\.\([^@]*\)\(.*\):\1\3:;y:@:.:"`; \
          cname=`echo $@ | sed "s:\([^.]*\)\.\([^@]*\)\(.*\):\2:"`;          \
          echo "./localedef -w -c -f $(NLSDIR)/charmaps/$$cname"             \
               "-i $(NLSDIR)/src/$$lname $(LOCDIR)/$@";                      \
          ./localedef -w -c -f $(NLSDIR)/charmaps/$$cname                    \
                      -i $(NLSDIR)/src/$$lname $(LOCDIR)/$@)

$(DEPENDDIR)/localedb.d: $(DEPENDDIR) $(NLSDIR)/gen_list
	@(echo "# generated locale dependencies" > $@;                      \
          for f in ""$(LOCALES); do                                         \
              lname=`echo $$f |                                             \
                sed "s:\([^.]*\)\.\([^@]*\)\(.*\):\1\3:;y:@:.:"`;           \
              cname=`echo $$f | sed "s:\([^.]*\)\.\([^@]*\)\(.*\):\2:"`;    \
              f=$$f;                                                        \
              echo "generating dependencies for $$f";                       \
              echo "$$f: $$""(NLSDIR)/src/$$lname"                          \
                   "$$""(NLSDIR)/charmaps/$$cname" >> $@;                   \
          done;)

# tell makefile.rules to include the generated dependencies file
DEPS := $(DEPENDDIR)/localedb.d

# do any directory specific cleanup using the realclean target
realclean: clean dependclean
	-rm -rf $(TARGET) 

# compute the names of codesets (codecvt databases) and set
# the variable only for the install target for efficiency
install: codesets :=                                            \
    $(sort $(shell   echo $(LOCALES)                            \
                   | sed -e "s/[^ .@][^ .@]*\.\([^ ]*\)/\1/g"   \
                         -e "s/@[^ ]*//g"))

# create the $(PREFIX)/bin $(PREFIX)/nls directories and install
# the utilities and locales 
install: locale localedef $(LOCALES)
	mkdir -p $(PREFIX)/bin
	cp locale localedef $(PREFIX)/bin
	mkdir -p $(PREFIX)/nls
	if [ "$(LOCALES)" != "" ]; then \
            cd ../nls && cp -R $(LOCALES) $(codesets) $(PREFIX)/nls; \
	fi

include ../makefile.rules
