## -*-makefile-*-
## HP/UX-specific setup using CC
## Copyright (c) 1999-2000, International Business Machines Corporation and
## others. All Rights Reserved.
##
## $Id: mh-hpux-cc,v 1.25 2000/10/20 01:17:33 srl Exp $


## This causes source/tools/pkgdata generated makefiles  to create and link
## in a bogus C++ file, so that exception handling with +eh will be
## enabled properly.  Fun.
HPUX_JUNK_OBJ=  $(TEMP_DIR)/hpux_junk_obj.o

## Commands to generate dependency files
GEN_DEPS.c= 	:
GEN_DEPS.cc= 	:

## Commands to compile
COMPILE.c=	$(CC)  -D__STDC__  +z -Ae $(DEFS) $(CPPFLAGS) $(CFLAGS) -c
COMPILE.cc=	$(CXX) +dup_static_removal +d -D__STDC__  +z +a1 $(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 (bug in linker?)
#LINK.c=		$(CC)  +z -Ae $(DEFS) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
LINK.c=	$(CXX)  +z +a1 $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -Wl,+s
LINK.cc=	$(CXX)  +z +a1 $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -Wl,+s

## Commands to make a shared library
#SHLIB.c=	$(LD) $(LDFLAGS) -b
SHLIB.c=	$(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -b -Wl,+s
SHLIB.cc=	$(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -b -Wl,+s

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

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

## Compiler switch to embed a library name
LD_SONAME = -Wl,+h,$(MIDDLE_SO_TARGET)

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

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

## 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 $<"
	@$(GEN_DEPS.c) $< > $@

%.d : $(srcdir)/%.cpp
	@echo "Generating dependency information for $<"
	@$(GEN_DEPS.cc) $< > $@

## Versioned libraries rules

%.$(SO_TARGET_VERSION_MAJOR): %.$(SO_TARGET_VERSION)
	$(RM) $@ && ln -s $< $@
%.$(SO): %.$(SO_TARGET_VERSION_MAJOR)
	$(RM) $@ && ln -s $*.$(SO_TARGET_VERSION) $@

## End HP/UX-specific setup

