# -*- tab-width: 4 -*-
#
# Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
#
# 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.
#
# This Makefile builds .jar files for the DNS-SD Java sample apps.
# You must have the Java support installed.
#
# nmake with no arguments builds all production targets.
# 'nmake DEBUG=1' to build debugging targets.
# 'nmake clean' or 'nmake clean DEBUG=1' to delete prod/debug objects & targets
#
# To run nmake, you may need to set up your PATH correctly, using a script 
# such as: "\Program Files\Microsoft Visual Studio .NET\Common7\tools\vsvars32.bat"
# 
# The default location of the JDK is \javasdk. You can override this on the
# command line (e.g. 'nmake JDK=\j2dk1.4.2_03').

############################################################################

JDK = "$(JAVA_HOME)"

CP = copy
RM = del /Q
RMDIR = rmdir /S /Q
JAVAC = $(JDK)\bin\javac
JAVAH = $(JDK)\bin\javah
JAR = $(JDK)\bin\jar

# Set up diverging paths for debug vs. prod builds
DEBUG=0
!if $(DEBUG) == 1
JFLAGS = -g
OBJDIR = objects\debug
BUILDDIR = build\debug
!else
JFLAGS = 
OBJDIR = objects\prod
BUILDDIR = build\prod
!endif

SCOBJ = $(OBJDIR)\SimpleChat
BAOBJ = $(OBJDIR)\BrowserApp

#############################################################################

all: setup Java postbuild

# 'setup' sets up the build directory structure the way we want
setup:
	@if not exist objects		mkdir objects
	@if not exist build			mkdir build
	@if not exist $(OBJDIR)		mkdir $(OBJDIR)
	@if not exist $(SCOBJ)		mkdir $(SCOBJ)
	@if not exist $(BAOBJ)		mkdir $(BAOBJ)
	@if not exist $(BUILDDIR)	mkdir $(BUILDDIR)

postbuild:
	@if not "%RC_XBS%"=="YES" GOTO END
	@if not exist "$(DSTROOT)\Program Files\Bonjour SDK\Samples\Java" mkdir "$(DSTROOT)\Program Files\Bonjour SDK\Samples\Java"
	@copy "nmakefile"			"$(DSTROOT)\Program Files\Bonjour SDK\Samples\Java"
	@copy "BrowserApp.java"		"$(DSTROOT)\Program Files\Bonjour SDK\Samples\Java"
	@copy "SimpleChat.java"		"$(DSTROOT)\Program Files\Bonjour SDK\Samples\Java"
	@copy "Swing*.java"			"$(DSTROOT)\Program Files\Bonjour SDK\Samples\Java"
	@copy "$(BUILDDIR)\*.jar"	"$(DSTROOT)\Program Files\Bonjour SDK\Samples\Java"
	@:END

# clean removes targets and objects
clean:
	@if exist $(OBJDIR)		$(RMDIR) $(OBJDIR)
	@if exist $(BUILDDIR)	$(RMDIR) $(BUILDDIR)

#############################################################################

Java: setup $(BUILDDIR)\SimpleChat.jar $(BUILDDIR)\BrowserApp.jar
	@echo "Build complete"

SIMPLECHATOBJ =	$(SCOBJ)\SwingBrowseListener.class \
				$(SCOBJ)\SwingQueryListener.class \
				$(SCOBJ)\SimpleChat.class 
SIMPLECHATMAN = SimpleChat.manifest

$(BUILDDIR)\SimpleChat.jar: $(SIMPLECHATOBJ) $(SIMPLECHATMAN)
	$(JAR) -cfm $@ $(SIMPLECHATMAN) -C $(SCOBJ) .

BROWSERAPPOBJ =	$(BAOBJ)\BrowserApp.class 
BROWSERAPPMAN = BrowserApp.manifest

$(BUILDDIR)\BrowserApp.jar: $(BROWSERAPPOBJ) $(BROWSERAPPMAN)
	$(JAR) -cfm $@ $(BROWSERAPPMAN) -C $(BAOBJ) .

JAVASRC	= .
.SUFFIXES : .java
{$(JAVASRC)}.java{$(BAOBJ)}.class:	
	$(JAVAC) -d $(BAOBJ) -classpath $(BAOBJ);$(DNS_SD) $<
{$(JAVASRC)}.java{$(SCOBJ)}.class:	
	$(JAVAC) -d $(SCOBJ) -classpath $(SCOBJ);$(DNS_SD) $<

