1 #
   2 # Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
   3 #
   4 # Redistribution and use in source and binary forms, with or without
   5 # modification, are permitted provided that the following conditions
   6 # are met:
   7 #
   8 #   - Redistributions of source code must retain the above copyright
   9 #     notice, this list of conditions and the following disclaimer.
  10 #
  11 #   - Redistributions in binary form must reproduce the above copyright
  12 #     notice, this list of conditions and the following disclaimer in the
  13 #     documentation and/or other materials provided with the distribution.
  14 #
  15 #   - Neither the name of Oracle nor the names of its
  16 #     contributors may be used to endorse or promote products derived
  17 #     from this software without specific prior written permission.
  18 #
  19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  20 # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  21 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  22 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  23 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27 # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30 #
  31 
  32 ########################################################################
  33 #
  34 # Sample GNU Makefile for building 
  35 #
  36 #  Example uses:    
  37 #       gnumake JDK=<java_home> OSNAME=solaris [OPT=true] [LIBARCH=sparc]
  38 #       gnumake JDK=<java_home> OSNAME=solaris [OPT=true] [LIBARCH=sparcv9]
  39 #       gnumake JDK=<java_home> OSNAME=linux   [OPT=true]
  40 #       gnumake JDK=<java_home> OSNAME=win32   [OPT=true]
  41 #
  42 ########################################################################
  43 
  44 # Source lists
  45 LIBNAME=hprof
  46 SOURCES= \
  47     debug_malloc.c      \
  48     hprof_blocks.c      \
  49     hprof_class.c       \
  50     hprof_cpu.c         \
  51     hprof_error.c       \
  52     hprof_event.c       \
  53     hprof_frame.c       \
  54     hprof_init.c        \
  55     hprof_io.c          \
  56     hprof_ioname.c      \
  57     hprof_listener.c    \
  58     hprof_loader.c      \
  59     hprof_monitor.c     \
  60     hprof_object.c      \
  61     hprof_reference.c   \
  62     hprof_site.c        \
  63     hprof_stack.c       \
  64     hprof_string.c      \
  65     hprof_table.c       \
  66     hprof_tag.c         \
  67     hprof_tls.c         \
  68     hprof_trace.c       \
  69     hprof_tracker.c     \
  70     hprof_util.c        \
  71     hprof_md.c
  72 
  73 JAVA_SOURCES=Tracker.java
  74 
  75 # Name of jar file that needs to be created
  76 #JARFILE=hprof.jar
  77 
  78 # Solaris Sun C Compiler Version 5.5
  79 ifeq ($(OSNAME), solaris)
  80     # Sun Solaris Compiler options needed
  81     COMMON_FLAGS=-mt -KPIC
  82     # Options that help find errors
  83     COMMON_FLAGS+= -Xa -v -xstrconst -xc99=%none
  84     # To make hprof logging code available
  85     COMMON_FLAGS+= -DHPROF_LOGGING
  86     # Check LIBARCH for any special compiler options
  87     LIBARCH=$(shell uname -p)
  88     ifeq ($(LIBARCH), sparc)
  89         COMMON_FLAGS+=-xarch=v8 -xregs=no%appl
  90     endif
  91     ifeq ($(LIBARCH), sparcv9)
  92         COMMON_FLAGS+=-xarch=v9 -xregs=no%appl
  93     endif
  94     ifeq ($(OPT), true)
  95         CFLAGS=-xO2 $(COMMON_FLAGS)  -DNDEBUG
  96     else
  97         CFLAGS=-g $(COMMON_FLAGS) -DDEBUG
  98     endif
  99     # Object files needed to create library
 100     OBJECTS=$(SOURCES:%.c=%.o)
 101     # Library name and options needed to build it
 102     LIBRARY=lib$(LIBNAME).so
 103     LDFLAGS=-z defs -ztext
 104     # Libraries we are dependent on
 105     LIBRARIES=-lsocket -lnsl -ldl -lc
 106     # Building a shared library
 107     LINK_SHARED=$(LINK.c) -G -o $@
 108 endif
 109 
 110 # Linux GNU C Compiler
 111 ifeq ($(OSNAME), linux)
 112     # GNU Compiler options needed to build it
 113     COMMON_FLAGS=-fno-strict-aliasing -fPIC -fno-omit-frame-pointer
 114     # Options that help find errors
 115     COMMON_FLAGS+= -W -Wall  -Wno-unused -Wno-parentheses
 116     # To allow access to dladdr()
 117     COMMON_FLAGS+= -D_GNU_SOURCE
 118     # To prevent include of procfs.h
 119     COMMON_FLAGS+= -DLINUX
 120     # To make sure code is reentrant
 121     COMMON_FLAGS+= -D_REENTRANT
 122     # To make hprof logging code available
 123     COMMON_FLAGS+= -DHPROF_LOGGING
 124     ifeq ($(OPT), true)
 125         CFLAGS=-O2 $(COMMON_FLAGS)  -DNDEBUG
 126     else
 127         CFLAGS=-g $(COMMON_FLAGS)  -DDEBUG
 128     endif
 129     # Object files needed to create library
 130     OBJECTS=$(SOURCES:%.c=%.o)
 131     # Library name and options needed to build it
 132     LIBRARY=lib$(LIBNAME).so
 133     LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc
 134     # Libraries we are dependent on
 135     LIBRARIES= -ldl -lc
 136     # Building a shared library
 137     LINK_SHARED=$(LINK.c) -shared -o $@
 138 endif
 139 
 140 # Windows Microsoft C/C++ Optimizing Compiler Version 12
 141 ifeq ($(OSNAME), win32)
 142     CC=cl
 143     # Compiler options needed to build it
 144     COMMON_FLAGS=-Gy -DWIN32
 145     # Options that help find errors
 146     COMMON_FLAGS+=-W0 -WX
 147     # To make hprof logging code available
 148     COMMON_FLAGS+= -DHPROF_LOGGING
 149     ifeq ($(OPT), true)
 150         CFLAGS= -Ox -Op -Zi $(COMMON_FLAGS)  -DNDEBUG
 151     else
 152         CFLAGS= -Od -Zi $(COMMON_FLAGS)  -DDEBUG
 153     endif
 154     # Add java_crw_demo source
 155     SOURCES += ../java_crw_demo.c
 156     # Object files needed to create library
 157     OBJECTS=$(SOURCES:%.c=%.obj)
 158     # Library name and options needed to build it
 159     LIBRARY=$(LIBNAME).dll
 160     LDFLAGS=
 161     # Libraries we are dependent on
 162     LIBRARIES=wsock32.lib winmm.lib
 163     # Building a shared library
 164     LINK_SHARED=link -dll -out:$@
 165 endif
 166 
 167 # Common -I options
 168 CFLAGS += -I.
 169 CFLAGS += -I../java_crw_demo
 170 CFLAGS += -I$(JDK)/include -I$(JDK)/include/$(OSNAME)
 171 
 172 # Default rule (build both native library and jar file)
 173 all: hprof_md.c $(LIBRARY) $(JARFILE)
 174 
 175 # Get platform specific hprof_md.c
 176 hprof_md.c:
 177         rm -f $@
 178         cp $(OSNAME)/hprof_md.c $@
 179 
 180 # Build native library
 181 $(LIBRARY): $(OBJECTS)
 182         $(LINK_SHARED) $(OBJECTS) $(LIBRARIES)
 183 
 184 # Build jar file
 185 $(JARFILE): $(JAVA_SOURCES)
 186         rm -f -r classes
 187         mkdir -p classes
 188         $(JDK)/bin/javac -d classes $(JAVA_SOURCES)
 189         (cd classes; $(JDK)/bin/jar cf ../$@ *)
 190 
 191 # Cleanup the built bits
 192 clean:
 193         rm -f -r classes
 194         rm -f $(LIBRARY) $(JARFILE) $(OBJECTS)
 195 
 196 # Simple tester
 197 test: all
 198         LD_LIBRARY_PATH=. $(JDK)/bin/java -agentlib:$(LIBNAME) -Xbootclasspath/a:./$(JARFILE) -version
 199 
 200 # Compilation rule only needed on Windows
 201 ifeq ($(OSNAME), win32)
 202 %.obj: %.c
 203         $(COMPILE.c) $<
 204 endif
 205