#
# @(#)sample.makefile.txt	1.2 05/01/04
# 
# Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 
# -Redistribution of source code must retain the above copyright notice, this
#  list of conditions and the following disclaimer.
# 
# -Redistribution in binary form must reproduce the above copyright notice, 
#  this list of conditions and the following disclaimer in the documentation
#  and/or other materials provided with the distribution.
# 
# Neither the name of Sun Microsystems, Inc. or the names of contributors may 
# be used to endorse or promote products derived from this software without 
# specific prior written permission.
# 
# This software is provided "AS IS," without a warranty of any kind. ALL 
# EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
# ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
# OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
# AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
# AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
# DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST 
# REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, 
# INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY 
# OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, 
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
# 
# You acknowledge that this software is not designed, licensed or intended
# for use in the design, construction, operation or maintenance of any
# nuclear facility.
#

########################################################################
#
# Sample GNU Makefile for building 
#
#  Example uses:    
#       gnumake J2SDK=<java_home> OSNAME=solaris [OPT=true] [LIBARCH=sparc]
#       gnumake J2SDK=<java_home> OSNAME=solaris [OPT=true] [LIBARCH=sparcv9]
#       gnumake J2SDK=<java_home> OSNAME=linux   [OPT=true]
#       gnumake J2SDK=<java_home> OSNAME=win32   [OPT=true]
#
########################################################################

# Source lists
LIBNAME=hprof
SOURCES= \
    debug_malloc.c	\
    hprof_blocks.c	\
    hprof_class.c	\
    hprof_cpu.c		\
    hprof_error.c	\
    hprof_event.c	\
    hprof_frame.c	\
    hprof_init.c	\
    hprof_io.c		\
    hprof_ioname.c	\
    hprof_listener.c	\
    hprof_loader.c	\
    hprof_monitor.c	\
    hprof_object.c	\
    hprof_reference.c	\
    hprof_site.c	\
    hprof_stack.c	\
    hprof_string.c	\
    hprof_table.c	\
    hprof_tag.c		\
    hprof_tls.c		\
    hprof_trace.c	\
    hprof_tracker.c	\
    hprof_util.c	\
    hprof_md.c

JAVA_SOURCES=Tracker.java

# Name of jar file that needs to be created
#JARFILE=hprof.jar

# Solaris Sun C Compiler Version 5.5
ifeq ($(OSNAME), solaris)
    # Sun Solaris Compiler options needed
    COMMON_FLAGS=-mt -xregs=no%appl -KPIC
    # Options that help find errors
    COMMON_FLAGS+= -Xa -v -xstrconst -xc99=%none
    # To make hprof logging code available
    COMMON_FLAGS+= -DHPROF_LOGGING
    # Check LIBARCH for any special compiler options
    LIBARCH=$(shell uname -p)
    ifeq ($(LIBARCH), sparc)
        COMMON_FLAGS+=-xarch=v8
    endif
    ifeq ($(LIBARCH), sparcv9)
        COMMON_FLAGS+=-xarch=v9
    endif
    ifeq ($(OPT), true)
        CFLAGS=-xO2 $(COMMON_FLAGS)  -DNDEBUG
    else
        CFLAGS=-g $(COMMON_FLAGS) -DDEBUG
    endif
    # Object files needed to create library
    OBJECTS=$(SOURCES:%.c=%.o)
    # Library name and options needed to build it
    LIBRARY=lib$(LIBNAME).so
    LDFLAGS=-z defs -ztext
    # Libraries we are dependent on
    LIBRARIES=-lsocket -lnsl -ldl -lc
    # Building a shared library
    LINK_SHARED=$(LINK.c) -G -o $@
endif

# Linux GNU C Compiler
ifeq ($(OSNAME), linux)
    # GNU Compiler options needed to build it
    COMMON_FLAGS=-fno-strict-aliasing -fPIC -fno-omit-frame-pointer
    # Options that help find errors
    COMMON_FLAGS+= -W -Wall  -Wno-unused -Wno-parentheses
    # To allow access to dladdr()
    COMMON_FLAGS+= -D_GNU_SOURCE
    # To prevent include of procfs.h
    COMMON_FLAGS+= -DLINUX
    # To make sure code is reentrant
    COMMON_FLAGS+= -D_REENTRANT
    # To make hprof logging code available
    COMMON_FLAGS+= -DHPROF_LOGGING
    ifeq ($(OPT), true)
        CFLAGS=-O2 $(COMMON_FLAGS)  -DNDEBUG
    else
        CFLAGS=-g $(COMMON_FLAGS)  -DDEBUG
    endif
    # Object files needed to create library
    OBJECTS=$(SOURCES:%.c=%.o)
    # Library name and options needed to build it
    LIBRARY=lib$(LIBNAME).so
    LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc -mimpure-text
    # Libraries we are dependent on
    LIBRARIES= -lnsl -ldl -lc
    # Building a shared library
    LINK_SHARED=$(LINK.c) -shared -o $@
endif

# Windows Microsoft C/C++ Optimizing Compiler Version 12
ifeq ($(OSNAME), win32)
    CC=cl
    # Compiler options needed to build it
    COMMON_FLAGS=-Gy
    # Options that help find errors
    COMMON_FLAGS+=-W0 -WX
    # To make hprof logging code available
    COMMON_FLAGS+= -DHPROF_LOGGING
    ifeq ($(OPT), true)
        CFLAGS= -Ox -Op -Zi $(COMMON_FLAGS)  -DNDEBUG
    else
        CFLAGS= -Od -Zi $(COMMON_FLAGS)  -DDEBUG
    endif
    # Object files needed to create library
    OBJECTS=$(SOURCES:%.c=%.obj)
    # Library name and options needed to build it
    LIBRARY=$(LIBNAME).dll
    LDFLAGS=
    # Libraries we are dependent on
    LIBRARIES=wsock32.lib winmm.lib
    # Building a shared library
    LINK_SHARED=link -dll -out:$@
endif

# Common -I options
CFLAGS += -I.
CFLAGS += -I../java_crw_demo
CFLAGS += -I$(J2SDK)/include -I$(J2SDK)/include/$(OSNAME)

# Default rule (build both native library and jar file)
all: hprof_md.c $(LIBRARY) $(JARFILE)

# Get platform specific hprof_md.c
hprof_md.c:
	rm -f $@
	cp $(OSNAME)/hprof_md.c $@

# Build native library
$(LIBRARY): $(OBJECTS)
	$(LINK_SHARED) $(OBJECTS) $(LIBRARIES)

# Build jar file
$(JARFILE): $(JAVA_SOURCES)
	rm -f -r classes
	mkdir -p classes
	$(J2SDK)/bin/javac -d classes $(JAVA_SOURCES)
	(cd classes; $(J2SDK)/bin/jar cf ../$@ *)

# Cleanup the built bits
clean:
	rm -f -r classes
	rm -f $(LIBRARY) $(JARFILE) $(OBJECTS)

# Simple tester
test: all
	LD_LIBRARY_PATH=. $(J2SDK)/bin/java -agentlib:$(LIBNAME) -Xbootclasspath/a:./$(JARFILE) -version

# Compilation rule only needed on Windows
ifeq ($(OSNAME), win32)
%.obj: %.c
	$(COMPILE.c) $<
endif

