#
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (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.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either of the GNU General Public License Version 2 or later (the "GPL"),
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****

DEPTH		= ../../../../../..
topsrcdir	= ../../../../../..
srcdir		= .
VPATH		= .

include $(DEPTH)/config/autoconf.mk

MODULE		= xpcom
LIBRARY_NAME	= xptcmd
MOZILLA_INTERNAL_API = 1

#
# The default is this buildable, but non-functioning code.
#
CPPSRCS		:= xptcinvoke_unsupported.cpp xptcstubs_unsupported.cpp

# Force use of PIC
FORCE_USE_PIC	= 1

include $(topsrcdir)/config/config.mk

######################################################################
# i386 and beyond
######################################################################
#
# Lots of Unixish x86 flavors
#
ifneq (,$(filter FreeBSD NetBSD OpenBSD BSD_OS Darwin,$(OS_ARCH)))
ifeq (86,$(findstring 86,$(OS_TEST)))
CPPSRCS		:= xptcinvoke_unixish_x86.cpp xptcstubs_unixish_x86.cpp
endif
endif
#
# OpenBSD/amd64
#
ifeq ($(OS_ARCH)$(OS_TEST),OpenBSDamd64)
CPPSRCS		:= xptcinvoke_openbsd_amd64.cpp xptcstubs_openbsd_amd64.cpp
endif
#
# New code for Linux, et. al., with gcc
# Migrate other platforms here after testing
#
ifneq (,$(filter Linux,$(OS_ARCH)))
# Linux/x86-64
ifeq (x86_64,$(OS_TEST))
CPPSRCS		:= xptcinvoke_x86_64_linux.cpp xptcstubs_x86_64_linux.cpp
else
ifeq (86,$(findstring 86,$(OS_TEST)))
CPPSRCS		:= xptcinvoke_gcc_x86_unix.cpp xptcstubs_gcc_x86_unix.cpp
endif
endif
endif
# IA64 Linux
ifneq (,$(filter Linux,$(OS_ARCH)))
ifneq (,$(findstring ia64,$(OS_TEST)))
CPPSRCS		:= xptcinvoke_ipf64.cpp xptcstubs_ipf64.cpp
ASFILES		:= xptcstubs_asm_ipf64.s xptcinvoke_asm_ipf64.s
endif
endif
#
# BeOS/Intel (uses the same unixish_x86 code)
#
ifeq ($(OS_ARCH)$(OS_TEST),BeOSBePC)
CPPSRCS		:= xptcinvoke_gcc_x86_unix.cpp xptcstubs_gcc_x86_unix.cpp
endif
#
# Neutrino/Intel (uses the same unixish_x86 code)
#
ifeq ($(OS_TARGET),NTO)
ifeq ($(OS_TEST),x86)
CPPSRCS		:= xptcinvoke_unixish_x86.cpp xptcstubs_unixish_x86.cpp
endif
ifeq ($(OS_TEST),arm)
CPPSRCS		:= xptcinvoke_nto_arm.cpp xptcstubs_nto_arm.cpp
endif
ifeq ($(OS_TEST),sh)
CPPSRCS		:= xptcinvoke_nto_shle.cpp xptcstubs_nto_shle.cpp
ASFILES		:= xptcstubs_asm_shle.s
endif
endif


######################################################################
# Solaris/Intel
######################################################################
#
# Solaris/Intel
#
ifeq ($(OS_ARCH),SunOS)
ifeq ($(OS_TEST),i86pc)
CPPSRCS		:= xptcinvoke_x86_solaris.cpp xptcstubs_x86_solaris.cpp
# 28817: if Solaris Intel OS, and native compiler, always build optimised.
ifndef GNU_CC
ASFILES		:= xptcinvoke_asm_x86_solaris_SUNW.s xptcstubs_asm_x86_solaris_SUNW.s
CXXFLAGS += -O
endif
endif
endif

######################################################################
# Alpha
######################################################################
#
# Tru64/Alpha
#
ifeq ($(OS_ARCH)$(OS_TEST),OSF1alpha)
CPPSRCS		:= xptcinvoke_osf1_alpha.cpp xptcstubs_osf1_alpha.cpp
ASFILES		:= xptcinvoke_asm_osf1_alpha.s xptcstubs_asm_osf1_alpha.s
endif
#
# OpenBSD/Alpha
#
ifeq ($(OS_ARCH)$(OS_TEST),OpenBSDalpha)
CPPSRCS		:= xptcinvoke_openbsd_alpha.cpp xptcstubs_openbsd_alpha.cpp
endif
#
# Linux/Alpha
#
ifneq (,$(filter Linuxalpha FreeBSDalpha NetBSDalpha,$(OS_ARCH)$(OS_TEST)))                           
CPPSRCS		:= xptcinvoke_linux_alpha.cpp xptcstubs_linux_alpha.cpp
endif
#
# OpenVMS/Alpha
#
ifeq ($(OS_ARCH)$(CPU_ARCH),OpenVMSAlpha)
CPPSRCS		:= xptcinvoke_openvms_alpha.cpp xptcstubs_openvms_alpha.cpp
ASFILES		:= xptcinvoke_asm_openvms_alpha.s xptcstubs_asm_openvms_alpha.s
endif

######################################################################
# ARM
######################################################################
#
# Linux/ARM
#
ifeq ($(OS_ARCH),Linux)
ifneq (,$(filter arm% sa110,$(OS_TEST)))
CPPSRCS		:= xptcinvoke_arm.cpp xptcstubs_arm.cpp
CXXFLAGS += -O2
endif
endif
#
# NetBSD/ARM
#
ifeq ($(OS_ARCH),NetBSD)
ifneq (,$(filter arm% sa110,$(OS_TEST)))
CPPSRCS		:= xptcinvoke_arm_netbsd.cpp xptcstubs_arm_netbsd.cpp
endif
endif
#
# OpenBSD/ARM
#
# NOTE: won't work w/o optimizations (-O1, -O2)
ifeq ($(OS_ARCH),OpenBSD)
ifneq (,$(filter armish zaurus,$(OS_TEST)))
CPPSRCS		:= xptcinvoke_arm_openbsd.cpp xptcstubs_arm_openbsd.cpp
CXXFLAGS	+= -O2
endif
endif

######################################################################
# HPPA
######################################################################
#
# HP-UX/PA32
#
# for gas and gcc, check comment in xptcinvoke_asm_pa32.s
ifeq ($(OS_ARCH),HP-UX)
ifneq ($(CC),gcc)
ifneq ($(OS_TEST),ia64)
CPPSRCS		:= xptcinvoke_pa32.cpp xptcstubs_pa32.cpp
ASFILES		:= xptcstubs_asm_pa32.s xptcinvoke_asm_pa32.s
else
CPPSRCS		:= xptcinvoke_ipf32.cpp xptcstubs_ipf32.cpp
ASFILES		:= xptcstubs_asm_ipf32.s xptcinvoke_asm_ipf32.s
endif

# #18875  Building the CPP's (CXX) optimized causes a crash
CXXFLAGS 	:=  $(filter-out $(MOZ_OPTIMIZE_FLAGS), $(CXXFLAGS))
endif
endif

######################################################################
# M68k
######################################################################
#
# NetBSD/m68k
#
ifeq ($(OS_ARCH),NetBSD)
ifneq (,$(filter amiga atari hp300 mac68k mvme68k next68k sun3 sun3x x68k,$(OS_TEST)))
CPPSRCS		:= xptcinvoke_netbsd_m68k.cpp xptcstubs_netbsd_m68k.cpp
endif
endif

#
# Linux/m68k
#
ifeq ($(OS_ARCH),Linux)
ifeq ($(OS_TEST),m68k)
CPPSRCS		:= xptcinvoke_linux_m68k.cpp xptcstubs_linux_m68k.cpp
endif
endif

######################################################################
# MIPS
######################################################################
#
# IRIX/MIPS
#
ifeq ($(OS_ARCH),IRIX)
ifneq ($(basename $(OS_RELEASE)),5)
CPPSRCS		:= xptcinvoke_irix.cpp xptcstubs_irix.cpp
ASFILES		:= xptcinvoke_asm_irix.s xptcstubs_asm_irix.s
ifdef GNU_CC
ASFLAGS		+= -Wa,-D__GNUC__
else
CXXFLAGS	:= $(shell echo $(CXXFLAGS) | sed 's/-O\(3\|fast\)/-O2/g')
endif
endif
endif

ifeq ($(OS_ARCH),Linux)
ifneq (,$(findstring mips, $(OS_TEST)))
CPPSRCS		:= xptcinvoke_mips.cpp xptcstubs_mips.cpp
ASFILES		:= xptcinvoke_asm_mips.s xptcstubs_asm_mips.s
#xptcstubs_mips.cpp
# xptcstubs_asm_mips.s
ifdef GNU_CC
ASFLAGS		+= $(INCLUDES) -x assembler-with-cpp -D__GNUC__
endif
endif
endif

######################################################################
# PowerPC
######################################################################
#
# AIX/PPC
#
ifeq ($(OS_ARCH),AIX)
ifdef HAVE_64BIT_OS
CPPSRCS		:= xptcinvoke_ppc_aix64.cpp xptcstubs_ppc_aix64.cpp
ASFILES		:= xptcinvoke_asm_ppc_aix64.s xptcstubs_asm_ppc_aix64.s
else
ifeq ($(AIX_OBJMODEL),ibm)
CPPSRCS		:= xptcinvoke_ppc_aix.cpp xptcstubs_ppc_aix.cpp
ASFILES		:= xptcinvoke_asm_ppc_ibmobj_aix.s xptcstubs_asm_ppc_aix.s
else
CPPSRCS		:= xptcinvoke_ppc_aix.cpp xptcstubs_ppc_aix.cpp
ASFILES		:= xptcinvoke_asm_ppc_aix.s xptcstubs_asm_ppc_aix.s
endif
endif

# #24617  Building the CPP's (CXX) optimized causes a crash
CXXFLAGS 	:=  $(filter-out $(MOZ_OPTIMIZE_FLAGS), $(CXXFLAGS))
endif

#
# Linux/PPC
#
ifeq ($(OS_ARCH)$(OS_TEST),Linuxppc)
CPPSRCS		:= xptcinvoke_ppc_linux.cpp xptcstubs_ppc_linux.cpp
ASFILES		:= xptcinvoke_asm_ppc_linux.s xptcstubs_asm_ppc_linux.s
AS		:= $(CC) -c -x assembler-with-cpp
endif

#
# NetBSD/PPC
#
ifneq (,$(filter NetBSDmacppc NetBSDbebox NetBSDofppc NetBSDprep NetBSDamigappc,$(OS_ARCH)$(OS_TEST)))                           
CPPSRCS		:= xptcinvoke_ppc_netbsd.cpp xptcstubs_ppc_netbsd.cpp
ASFILES		:= xptcinvoke_asm_ppc_netbsd.s xptcstubs_asm_ppc_netbsd.s
endif

#
# OpenBSD/PPC
#
ifneq (,$(filter OpenBSDmacppc,$(OS_ARCH)$(OS_TEST)))                           
CPPSRCS		:= xptcinvoke_ppc_openbsd.cpp xptcstubs_ppc_openbsd.cpp
ASFILES		:= xptcinvoke_asm_ppc_openbsd.s xptcstubs_asm_ppc_openbsd.s
endif

#
# Darwin/PPC
#
ifeq ($(OS_ARCH),Darwin)
ifeq ($(TARGET_CPU), powerpc)
ASFLAGS		+= -x assembler-with-cpp   # assumes $(AS) == $(CC)
ifdef HAVE_GCC3_ABI
ASFLAGS		+= -DHAVE_GCC3_ABI
endif
CPPSRCS		:= xptcinvoke_ppc_rhapsody.cpp xptcstubs_ppc_rhapsody.cpp
ASFILES		:= xptcinvoke_asm_ppc_rhapsody.s xptcstubs_asm_ppc_darwin.s
endif
endif

######################################################################
# SPARC
######################################################################
#
# BSD_OS/SPARC
#
ifeq ($(OS_ARCH),BSD_OS)
ifneq (,$(findstring sparc,$(OS_TEST)))
CPPSRCS		:= xptcinvoke_sparc_solaris.cpp xptcstubs_sparc_solaris.cpp
ASFILES		:= xptcinvoke_asm_sparc_bsdos.s xptcstubs_asm_sparc_solaris.s
endif
endif
#
# Linux/SPARC
#
ifeq ($(OS_ARCH),Linux)
ifneq (,$(findstring sparc,$(OS_TEST)))
CPPSRCS		:= xptcinvoke_sparc_solaris.cpp xptcstubs_sparc_solaris.cpp
ifdef HAVE_GCC3_ABI
ASFILES		:= xptcinvoke_asm_sparc_linux_GCC3.s xptcstubs_asm_sparc_solaris.s
else
ASFILES		:= xptcinvoke_asm_sparc_linux.s xptcstubs_asm_sparc_solaris.s
endif
endif
endif
#
# NetBSD/SPARC
#
ifeq ($(OS_ARCH)$(OS_TEST),NetBSDsparc)
CPPSRCS		:= xptcinvoke_sparc_netbsd.cpp xptcstubs_sparc_netbsd.cpp
ASFILES		:= xptcinvoke_asm_sparc_netbsd.s xptcstubs_asm_sparc_netbsd.s
endif
#
# Solaris/SPARC
#
ifeq ($(OS_ARCH),SunOS)
ifneq (86,$(findstring 86,$(OS_TEST)))
ifdef HAVE_64BIT_OS
CPPSRCS		:= xptcinvoke_sparcv9_solaris.cpp xptcstubs_sparcv9_solaris.cpp
else
CPPSRCS		:= xptcinvoke_sparc_solaris.cpp xptcstubs_sparc_solaris.cpp
endif

ifeq ($(GNU_CC),1)
ifdef HAVE_GCC3_ABI
ASFILES		:= xptcinvoke_asm_sparc_solaris_GCC3.s xptcstubs_asm_sparc_solaris.s
else
ASFILES		:= xptcinvoke_asm_sparc_solaris_GCC.s xptcstubs_asm_sparc_solaris.s
endif
else
ifdef HAVE_64BIT_OS
ASFILES		:= xptcinvoke_asm_sparcv9_solaris_SUNW.s xptcstubs_asm_sparcv9_solaris.s
else
ASFILES		:= xptcinvoke_asm_sparc_solaris_SUNW.s xptcstubs_asm_sparc_solaris.s
endif
endif

endif
endif
#
# OpenBSD/SPARC
#
ifeq ($(OS_ARCH)$(OS_TEST),OpenBSDsparc)
CPPSRCS		:= xptcinvoke_sparc_netbsd.cpp xptcstubs_sparc_netbsd.cpp
ASFILES		:= xptcinvoke_asm_sparc_netbsd.s xptcstubs_asm_sparc_netbsd.s
endif
#   
# OpenBSD/SPARC64
#   
ifeq ($(OS_ARCH)$(OS_TEST),OpenBSDsparc64)
CPPSRCS		:= xptcinvoke_sparc64_openbsd.cpp xptcstubs_sparc64_openbsd.cpp
ASFILES		:= xptcinvoke_asm_sparc64_openbsd.s xptcstubs_asm_sparcv9_solaris.s
endif

######################################################################
# S/390
######################################################################
#
# Linux for S/390
#
ifeq ($(OS_ARCH)$(OS_TEST),Linuxs390)
CPPSRCS		:= xptcinvoke_linux_s390.cpp xptcstubs_linux_s390.cpp
CXXFLAGS	+= -fno-strict-aliasing -fno-inline -fomit-frame-pointer -mbackchain
endif

ifeq ($(OS_ARCH)$(OS_TEST),Linuxs390x)
CPPSRCS		:= xptcinvoke_linux_s390x.cpp xptcstubs_linux_s390x.cpp
CXXFLAGS	+= -fno-strict-aliasing -fno-inline -fomit-frame-pointer -mbackchain
endif


# we don't want the shared lib, but we want to force the creation of a static lib.
FORCE_STATIC_LIB = 1

include $(topsrcdir)/config/rules.mk

DEFINES		+= -DEXPORT_XPTC_API

INCLUDES	+= -I$(srcdir)/../..

ifeq ($(OS_ARCH),Linux)
ifneq (,$(findstring mips, $(OS_TEST)))
xptcstubs_asm_mips.o: xptcstubs_asm_mips.s.m4 $(PUBLIC)/xptcstubsdef.inc
	m4 $(INCLUDES) $< > ./xptcstubs_asm_mips.s && \
	$(AS) -o $@ $(ASFLAGS) $(AS_DASH_C_FLAG) ./xptcstubs_asm_mips.s
	$(RM) -f ./xptcstubs_asm_mips.s
endif
endif

ifeq ($(OS_ARCH),Darwin)
xptcstubs_asm_ppc_darwin.o: xptcstubs_asm_ppc_darwin.s.m4 $(PUBLIC)/xptcstubsdef.inc Makefile
	gm4 $(INCLUDES) $< > ./xptcstubs_asm_ppc_darwin.s && \
	$(AS) -o $@ $(ASFLAGS) $(AS_DASH_C_FLAG) ./xptcstubs_asm_ppc_darwin.s
	$(RM) -f ./xptcstubs_asm_ppc_darwin.s
endif

ifeq ($(OS_ARCH),IRIX)
# The assembler on IRIX (6.3 only?) seems to have trouble with the default command,
# but works fine if we first copy the header and source file into the current dir.
xptcstubs_asm_irix.o: $(PUBLIC)/xptcstubsdef.inc $(srcdir)/xptcstubs_asm_irix.s
	@rm -f ./xptcstubsdef.inc
	@cp $(PUBLIC)/xptcstubsdef.inc .
	@if test ! -f ./Makefile.in; then rm -f ./xptcstubs_asm_irix.s; cp $(srcdir)/xptcstubs_asm_irix.s .; else true; fi
	$(AS) -o $@ $(ASFLAGS) $(AS_DASH_C_FLAG) ./xptcstubs_asm_irix.s
	@rm -f ./xptcstubsdef.inc
	@if test ! -f ./Makefile.in; then rm -f ./xptcstubs_asm_irix.s; else true; fi
endif

ifeq ($(OS_ARCH),OpenVMS)
# Our assembler wants the include file to be of assembler syntax, not C/C++
# syntax, so we have to massage it slightly.

xptcstubs_asm_openvms_alpha.o: $(PUBLIC)/xptcstubsdef.inc $(srcdir)/xptcstubs_asm_openvms_alpha.s
	sed \
	  -e 's/^\(.*_ENTRY\)(\([0-9]*\))/ \1 \2/' \
	  -e 's/\/\*\(.*\)\*\//; \1/' \
	$(PUBLIC)/xptcstubsdef.inc > ./xptcstubsdef_asm.vms
	$(AS) -o $@ $(ASFLAGS) $(AS_DASH_C_FLAG) $(srcdir)/xptcstubs_asm_openvms_alpha.s
	@rm -f ./xptcstubsdef_asm.vms
endif

ifeq ($(OS_ARCH),SunOS)
ifeq ($(OS_TEST),i86pc)
ifndef GNU_CC
xptcstubs_asm_x86_solaris_SUNW.o: $(PUBLIC)/xptcstubsdef.inc $(srcdir)/xptcstubs_asm_x86_solaris_SUNW.s
	sed \
	  -e 's/^\(STUB_ENTRY\)(\([0-9]\))/\11\(\2\)/' \
	  -e 's/^\(STUB_ENTRY\)(\([0-9][0-9]\))/\12\(\2\)/' \
	  -e 's/^\(STUB_ENTRY\)(\([0-9][0-9][0-9]\))/\13\(\2\)/' \
	$(PUBLIC)/xptcstubsdef.inc > ./xptcstubsdef_asm.solx86
	$(AS) -o $@ $(ASFLAGS) $(AS_DASH_C_FLAG) -I./ $(srcdir)/xptcstubs_asm_x86_solaris_SUNW.s
	@rm -f ./xptcstubsdef_asm.solx86
endif
endif
endif
