# -*- Makefile -*-
#
# $Id$
#
# makefile to build the C++ Standard library utility programs
#
########################################################################
#
# Licensed to the Apache Software  Foundation (ASF) under one or more
# contributor  license agreements.  See  the NOTICE  file distributed
# with  this  work  for  additional information  regarding  copyright
# ownership.   The ASF  licenses this  file to  you under  the Apache
# License, Version  2.0 (the  "License"); you may  not use  this file
# except in  compliance with the License.   You may obtain  a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the  License is distributed on an  "AS IS" BASIS,
# WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
# implied.   See  the License  for  the  specific language  governing
# permissions and limitations under the License.
#
# Copyright 1999-2007 Rogue Wave Software, Inc.
#
########################################################################

include ../makefile.in

SRCDIRS = $(TOPDIR)/util

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

TARGET    = exec localedef locale gencat

# 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)

# link the gencat utility
gencat: gencat.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
