# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

##
# Target settings
##
#JAVA_HOME
#JAVA_HOME=/usr/lib/j2sdk1.5-sun

# set GWT_TOOLS only if it is not already defined
GWT_TOOLS ?= ../../../tools

GWT_ROOT = ../../
OBJDIR  := $(GWT_ROOT)build/out/jni/linux/
OUTDIR  := $(GWT_ROOT)build/jni/linux/
OUT     := $(OUTDIR)libgwt-ll.so

##
# The location to get .class files from for javah
##
CLASSDIR := $(GWT_ROOT)build/out/dev/linux/bin

# use this instead if you want to use eclipse to build the class files during
# development
#CLASSDIR := $(GWT_ROOT)eclipse/dev/linux/bin

##
# Tools
##
CXX      := g++
AR       := ar
STRIP    := strip
LD       := $(CXX)
JAVAH    := $(JAVA_HOME)/bin/javah

##
# List of source, object, and dependency paths plus the path to them
##
SRCDIRS := ./:../core/
VPATH   := .:../core
SRCS    := gwt-ll.cpp LowLevelMoz.cpp JsValueMoz.cpp Tracer.cpp \
	ExternalWrapper.cpp NativeWrapper.cpp JsRootedValue.cpp
OBJS    := $(addprefix $(OBJDIR),$(SRCS:.cpp=.o))
DEPS    := $(addprefix $(OBJDIR),$(SRCS:.cpp=.d))

MOZDIR = $(GWT_TOOLS)/sdk/mozilla-1.7.13
MOZINC = $(MOZDIR)/include
MOZLIB = $(MOZDIR)/lib

##
# Include path configuration
##
SYSINCS := \
    $(JAVA_HOME)/include \
    $(JAVA_HOME)/include/linux \
    $(MOZINC) $(MOZINC)/extra

INCS := $(OBJDIR)
INCS := $(addprefix -I ,$(INCS)) $(addprefix -isystem ,$(SYSINCS))

##
# Libraries and library path
##
LIBS    = xpcomglue_s
LIBPATH = -L$(MOZLIB)
LIBS     := $(addprefix -l,$(LIBS))

# for notes on auto-dependency generation, see
#   http://make.paulandlesley.org/autodep.html
# -MP obviates the need for sed hackery
CFLAGS   := -ggdb -m32 -Os -fPIC -fno-omit-frame-pointer -fno-strict-aliasing -D_REENTRANT -MMD -MP -Wno-system-headers $(CFLAGS)
LDFLAGS  := -ggdb -m32 -s -fPIC -fno-omit-frame-pointer -fno-strict-aliasing -D_REENTRANT -Wl,-shared-gcc $(LDFLAGS)

#-------------------------------------------------------------------------------
# Rules
#-------------------------------------------------------------------------------

##
# default rule
##
all: $(OUT)

# install into prebuilt directory
install: $(OUT)
	cp $(OUT) prebuilt/

##
# Include the dependency rules
##
-include $(DEPS)

##
# javah-generated headers for native methods
##
$(OBJDIR)LowLevelMoz.h : $(CLASSDIR)/com/google/gwt/dev/shell/moz/LowLevelMoz.class
	$(JAVAH) -classpath $(CLASSDIR) -o $(OBJDIR)LowLevelMoz.h com.google.gwt.dev.shell.moz.LowLevelMoz

$(OBJDIR)JsValueMoz.h : $(CLASSDIR)/com/google/gwt/dev/shell/moz/JsValueMoz.class
	$(JAVAH) -classpath $(CLASSDIR) -o $(OBJDIR)JsValueMoz.h com.google.gwt.dev.shell.moz.JsValueMoz

##
# Dependency rules for generated headers
# TODO(jat): autogenerate these and others
##
$(OBJDIR)LowLevelMoz.o: $(OBJDIR)LowLevelMoz.h $(JAVA_HOME)/include/jni.h
$(OBJDIR)JsValueMoz.o: $(OBJDIR)JsValueMoz.h $(JAVA_HOME)/include/jni.h

##
# Compilation rule for cpp files
##
$(OBJDIR)%.o : $(SRCDIR)%.cpp
	@[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR)
	$(CXX) -c $(CFLAGS) $(INCS) -o $@ $<

# generate preprocessed output files upon request for debugging
%.i : $(SRCDIR)%.cpp
	$(CXX) -E $(CFLAGS) $(INCS) -o $@ $<

%.I : $(SRCDIR)%.cpp
	$(CXX) -E -dDI $(CFLAGS) $(INCS) -o $@ $<

##
# Actual output file
##
$(OUT): $(OBJS) $(MOZLIB)/libxpcomglue_s.a
	@[ -d $(OUTDIR) ] || mkdir -p $(OUTDIR)
	$(LD) -shared $(LDFLAGS) $(LIBPATH) -o $@ $^ $(LIBS)
	$(STRIP) --strip-unneeded $@

##
# copy to staging area for hosted-mode development
##
staging: $(OUT)
	cp $(OUT) ../../build/staging/gwt-linux-0.0.0

##
# Clean rule
##
clean:
	@-rm -rf $(OBJDIR) $(OUT)
