## -*-makefile-*-
## IRIX-specific setup (for CC)
## Copyright (c) 1999-2000, International Business Machines Corporation and
## others. All Rights Reserved.
##
## $Id: mh-irix,v 1.17 2000/11/29 16:25:25 srl Exp $

## Flags for position independent code
SHAREDLIBCFLAGS = -shared
SHAREDLIBCXXFLAGS = -shared
SHAREDLIBCPPFLAGS =

## Commands to generate dependency files
GEN_DEPS.c=	$(CC) -E -M $(DEFS) $(CPPFLAGS)
GEN_DEPS.cc=	$(CXX) -E -M $(DEFS) $(CPPFLAGS)

## Commands to compile
COMPILE.c=	$(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) -c
COMPILE.cc=	$(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) -c

## Commands to link
## We need to use the C++ linker, even when linking C programs, since
##  our libraries contain C++ code (C++ static init not called)
#LINK.c=	$(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
LINK.c=		$(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS)
LINK.cc=	$(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS)

## Commands to make a shared library
## SHLIB.c=        ${PLATFORM_CPP_COMPILER} -D${PLATFORM} -shared
## SHLIB.cc=       ${PLATFORM_C_COMPILER} -D${PLATFORM} -shared
## SHLIB.c=	${PLATFORM_CPP_COMPILER}
## SHLIB.c=	${PLATFORM_C_COMPILER}
SHLIB.c=        $(CC) -shared $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS)
SHLIB.cc=       $(CXX) -shared $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS)

## Compiler switch to embed a runtime search path
LD_RPATH=
LD_RPATH_PRE=  -Wl,-rpath,

## Environment variable to set a runtime search path
LDLIBRARYPATH_ENVVAR = LD_LIBRARY_PATH

## Versioned target for a shared library.
FINAL_SO_TARGET = $(SO_TARGET)
MIDDLE_SO_TARGET = 

###  How ICU libraries are named...  ex. $(LIBICU)uc$(SO)
## Prefix for the ICU library names
ICUPREFIX = icu
LIBICU = lib$(ICUPREFIX)
## Shared object suffix
SO=		so
## Non-shared intermediate object suffix
STATIC_O = ao

## Force removal [for make clean]
RMV = rm -rf
## Platform commands to remove or move executable and library targets
INSTALL-S = $(INSTALL_PROGRAM)
INSTALL-L = $(INSTALL_DATA)

## Link commands to link to ICU libs
LIBICUUC= 	-L$(top_builddir)/common -l$(ICUPREFIX)uc
LIBICUI18N= 	-L$(top_builddir)/i18n -l$(ICUPREFIX)i18n
LIBCTESTFW= 	-L$(top_builddir)/tools/ctestfw -lctestfw
LIBICUTOOLUTIL=-L$(top_builddir)/tools/toolutil -l$(ICUPREFIX)toolutil
LIBUSTDIO=      -L$(top_builddir)/extra/ustdio -lustdio

## Compilation rules
%.$(STATIC_O): $(srcdir)/%.c
	$(COMPILE.c) $(STATICCPPFLAGS) $(STATICCFLAGS) -o $@ $<
%.o: $(srcdir)/%.c
	$(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $<

%.$(STATIC_O): $(srcdir)/%.cpp
	$(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $<
%.o: $(srcdir)/%.cpp
	$(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $<

../data/%.o: ../data/%.c
	$(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $<

## Dependency rules
%.d : $(srcdir)/%.c
	@echo "Generating dependency information for $<"
	@$(SHELL) -ec '$(GEN_DEPS.c) $< \
		| sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
		[ -s $@ ] || rm -f $@'

%.d : $(srcdir)/%.cpp
	@echo "Generating dependency information for $<"
	@$(SHELL) -ec '$(GEN_DEPS.cc) $< \
		| sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
		[ -s $@ ] || rm -f $@'

## End IRIX-specific setup
