## -*-makefile-*-
## Solaris-specific setup using Sun's workshop compilers
## Copyright (c) 1999-2003, International Business Machines Corporation and
## others. All Rights Reserved.
##
## $Id: mh-solaris,v 1.33 2003/12/18 23:14:13 emader-oss Exp $

## Flags for position independent code
SHAREDLIBCFLAGS = -KPIC
SHAREDLIBCXXFLAGS = -KPIC
SHAREDLIBCPPFLAGS = -DPIC

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

# -libmil means use the intrinsic library functions like strlen
CPPFLAGS += -libmil

# -mt means 'compiles and links a multithreaded program'
THREADSCFLAGS += -mt
THREADSCXXFLAGS += -mt

## Commands to link
## For Sun Workshop, use CC to link to bring in C++ runtime
LINK.c=		$(CXX) $(CXXFLAGS) $(LDFLAGS)
LINK.cc=	$(CXX) $(CXXFLAGS) $(LDFLAGS)

## Commands to make a shared library
SHLIB.c=	$(CC) $(CFLAGS) $(LDFLAGS) -G
SHLIB.cc=	$(CXX) $(CXXFLAGS) $(LDFLAGS) -G

## Compiler switch to embed a runtime search path
LD_RPATH=	-R
LD_RPATH_PRE=	

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

## Shared object suffix
SO=		so
## Non-shared intermediate object suffix
STATIC_O = o

## 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 $@ $<


## 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).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION)
	$(RM) $@ && ln -s $< $@
%.$(SO): %.$(SO).$(SO_TARGET_VERSION_MAJOR)
	$(RM) $@ && ln -s $*.$(SO).$(SO_TARGET_VERSION) $@

# 
BIR_LDFLAGS=  -Wl,-M,$(NAME).map -Wl,-B,symbolic -Wl,-B,eliminate
BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
BIR_DEPS=   $(NAME).map
## End Solaris-specific setup
