## -*-makefile-*-
## 390-specific setup 
## Copyright (c) 1999-2004, International Business Machines Corporation and
## others. All Rights Reserved.

###################################################################
#                    IMPORTANT NOTE                               #
###################################################################
# Before you try to run the Makefile, make sure you have the      #
# environment variables set.                                      #
#                                                                 #
# If you are going to do the OS390BATCH build, make sure you have #
# the OS390BATCH environment variable set.                        #
#                                                                 #
#   export OS390BATCH=1                                           #
#                                                                 #
# To build a version of ICU which uses IEEE Floating point        #
#                                                                 #
#   export IEEE390=1                                              #
#                                                                 #
# To build a version of ICU which uses a two common libraries     #
# where the smaller one is loaded first.                          #
#                                                                 #
#   export OS390_STUBDATA=1                                       #
#                                                                 #
# To build a version of ICU which exploits the C/C++ compiler     #
# and runtime Extra Performance Linkage (XPLINK), specify         #
#                                                                 #
#   export OS390_XPLINK=1                                         #
#                                                                 #
###################################################################

ifeq (${IEEE390},)
IEEE390=1
endif

ifeq (${IEEE390}, 1)
ICU_IEEE          = -Wc,"float(ieee)" -DIEEE_754=1
else
ICU_IEEE          = -DIEEE_754=0
endif

# TODO: Consider using  -Wc,roc,ros for making the data and strings readonly
#       -Wc,"ros" seems to work, but not the "roc"
CFLAGS          += -Wc,"langlvl(extended),spill(2000)" -Wc,"ros" $(ICU_BUILD_OPTIONS) $(ICU_IEEE) -Wc,dll,expo
CXXFLAGS        += -Wc,"langlvl(extended),spill(2000)" -Wc,"ros" $(ICU_BUILD_OPTIONS) $(ICU_IEEE) -Wc,dll,expo
DEFS            += -D_OPEN_THREADS -D_XOPEN_SOURCE_EXTENDED -D_MSE_PROTOS -D_SHR_TZNAME -D_SHR_TIMEZONE -DU_LIBICUDATA_NAME=\"$(ICUDATA_NAME)\"
ARFLAGS         = -cr

# TODO: Fix this configuration so that icu-config will work!
#       This means we shouldn't be using so many of these special case defines.
ifeq (${OS390_XPLINK}, 1)
# Note:  The following options require the PTF for PQ69418 on z/OS 1.2
#        and later.
# These lines must be the last options specified.
ICU_XPLINK_C      = -Wc,"xplink(backchain,storeargs)" -Wc,"GOFF,NOCSECT,RENT,SSCOMM" -Wc,"inline(auto,noreport,500,2500)"
ICU_XPLINK_CPP    = -Wc,"xplink(backchain,storeargs)" -Wc,"GOFF,NOCSECT,NOTEMPINC" -Wc,"inline(auto,noreport,300,2500)"
ICU_XPLINK_L      = -Wl,dll,xplink -Wl,EDIT=NO
endif

## OS390BATCH
ifeq (${OS390BATCH},1)
DEFS            += -DOS390BATCH
endif

# Uncomment this line or do "gmake OS390_STUBDATA=1" to enable dual common library support
#OS390_STUBDATA=1


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

## Commands to compile
# _CXX_STEPS="-1" is a prelink step when compiling C and C++, and
# it's only needed for long function names
COMPILE.c       = $(COMPILE_LINK_ENVVAR) $(CXX) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(ICU_XPLINK_C) -c
COMPILE.cc      = _CXX_CXXSUFFIX="cpp" $(COMPILE_LINK_ENVVAR) $(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(ICU_XPLINK_CPP) -c

# Commands to link
LINK.c=		$(COMPILE_LINK_ENVVAR) $(CC) $(CFLAGS) -Wl,dll $(LDFLAGS) $(ICU_XPLINK_L)
LINK.cc=	$(COMPILE_LINK_ENVVAR) $(CXX) $(CXXFLAGS) -Wl,dll $(LDFLAGS) $(ICU_XPLINK_L)

## Commands for shared library (dll)
SHLIB.c=	$(LINK.c)
SHLIB.cc=	$(LINK.cc)

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

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

## An import library (a.k.a. sidedeck) is needed for z/OS and MSVC
IMPORT_LIB_EXT = .x

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

## Versioned import library names.
IMPORT_LIB = $(basename $(SO_TARGET))$(IMPORT_LIB_EXT)
MIDDLE_IMPORT_LIB = $(basename $(MIDDLE_SO_TARGET))$(IMPORT_LIB_EXT)
FINAL_IMPORT_LIB = $(basename $(FINAL_SO_TARGET))$(IMPORT_LIB_EXT)

## Shared object suffix (switch to dll for shared library build)
SO = dll
## Non-shared intermediate object suffix
STATIC_O = o

ifeq ($(OS390_STUBDATA),1)
## Suffix of the subset data library for dual common library support
STUB_SUFFIX=_stub
DEFS      += -DOS390_STUBDATA
endif

ifeq ($(OS390BATCH),1)
ifeq ($(OS390_STUBDATA),1)
BATCH_STUB_TARGET=	"//'${LOADMOD}(IXMI${SO_TARGET_VERSION_MAJOR}D1)'"
BATCH_LIBICUDT=		"//'${LOADEXP}(IXMI${SO_TARGET_VERSION_MAJOR}D1)'"
else
BATCH_STUB_TARGET=	"//'${LOADMOD}(IXMI${SO_TARGET_VERSION_MAJOR}DA)'"
BATCH_LIBICUDT=		"//'${LOADEXP}(IXMI${SO_TARGET_VERSION_MAJOR}DA)'"
endif

BATCH_COMMON_TARGET="//'${LOADMOD}(IXMI${SO_TARGET_VERSION_MAJOR}UC)'"
BATCH_I18N_TARGET="//'${LOADMOD}(IXMI${SO_TARGET_VERSION_MAJOR}IN)'"
BATCH_IO_TARGET="//'${LOADMOD}(IXMI${SO_TARGET_VERSION_MAJOR}IO)'"
BATCH_LAYOUT_TARGET="//'${LOADMOD}(IXMI${SO_TARGET_VERSION_MAJOR}LE)'"
BATCH_LAYOUTEX_TARGET="//'${LOADMOD}(IXMI${SO_TARGET_VERSION_MAJOR}LX)'"

BATCH_LIBICUUC=		"//'${LOADEXP}(IXMI${SO_TARGET_VERSION_MAJOR}UC)'"
BATCH_LIBICUI18N=	"//'${LOADEXP}(IXMI${SO_TARGET_VERSION_MAJOR}IN)'"
BATCH_LIBICUIO=		"//'${LOADEXP}(IXMI${SO_TARGET_VERSION_MAJOR}IO)'"
BATCH_LIBICULE=		"//'${LOADEXP}(IXMI${SO_TARGET_VERSION_MAJOR}LE)'"
BATCH_LIBICULX=		"//'${LOADEXP}(IXMI${SO_TARGET_VERSION_MAJOR}LX)'"
endif

## Link commands to link to ICU libs
LIBICUDT=	$(top_builddir)/stubdata/$(LIBICU)data$(ICULIBSUFFIX)$(STUB_SUFFIX)$(SO_TARGET_VERSION).x
LIBICUUC=	$(top_builddir)/common/$(LIBICU)uc$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x
LIBICUI18N=	$(top_builddir)/i18n/$(LIBICU)i18n$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x
LIBICULE=	$(top_builddir)/layout/$(LIBICU)le$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x
LIBICULX=	$(top_builddir)/layoutex/$(LIBICU)lx$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x
LIBCTESTFW=	$(top_builddir)/tools/ctestfw/$(LIBICU)ctestfw$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x
LIBICUTOOLUTIL=	$(top_builddir)/tools/toolutil/$(LIBICU)tu$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x
LIBICUIO=	$(top_builddir)/extra/ustdio/$(LIBICU)io$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x

## Special 390 rules

## Build archive from object
%.a : $(OBJECTS)
	$(AR) $(ARFLAGS) $@ $(OBJECTS)

## 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 : %.u
	@$(SHELL) -ec 'cat $<  \
		| sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
		[ -s $@ ] || rm -f $@ ; rm -f $<'

%.u : $(srcdir)/%.c
	@echo "generating dependency information for $<"
	@$(SHELL) -ec 'touch            $*.u  > /dev/null 2>&1'
	@$(SHELL) -ec '$(GEN_DEPS.c) -f $*.u $< > /dev/null 2>&1'

%.u : $(srcdir)/%.cpp
	@echo "generating dependency information for $<"
	@$(SHELL) -ec 'touch              $*.u  > /dev/null 2>&1'
	@$(SHELL) -ec '$(GEN_DEPS.cc)  -f $*.u $< > /dev/null 2>&1'

## Versioned libraries rules
%$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION).$(SO)
	$(RM) $@ && ln -s ${*F}$(SO_TARGET_VERSION).$(SO) $@
%.$(SO): %$(SO_TARGET_VERSION).$(SO)
	$(RM) $@ && ln -s ${*F}$(SO_TARGET_VERSION).$(SO) $@

## Install libraries as executable
INSTALL-L=$(INSTALL_PROGRAM)

## End 390-specific setup
