# -*- 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 a .jar file and accompanying JNI support library
# containing the DNSSD implementation for Java and support classes.
#
# Prior to building Java support, you must build DNSSD.dll.
#
# 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\Vc7\bin\vcvars32.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').

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

COREDIR = ..\..\mDNSCore
SHAREDDIR = ..\..\mDNSShared

JDK = "$(JAVA_HOME)"

CC = cl
RC = rc
LD = ld
CP = copy
RM = del /Q
RMDIR = rmdir /S /Q
JAVAC = $(JDK)\bin\javac
JAVAH = $(JDK)\bin\javah
JAR = $(JDK)\bin\jar
CFLAGS_COMMON = -LD -DAUTO_CALLBACKS=0 -I. -I..\.. \
	-I$(COREDIR) -I$(SHAREDDIR) -I$(JDK)\include -I$(JDK)\include\win32

# Set up diverging paths for debug vs. prod builds
DEBUG=0
!if $(DEBUG) == 1
CFLAGS_DEBUG = -Zi -DMDNS_DEBUGMSGS=2 
OBJDIR = objects\debug
BUILDDIR = build\debug
INSTALLDIR = root\"Program Files"\Bonjour
LIBDIR = ..\DLL\Win32\Debug
!else
CFLAGS_DEBUG = -Os -DMDNS_DEBUGMSGS=0 
OBJDIR = objects\prod
BUILDDIR = build\prod
INSTALLDIR = root\"Program Files"\Bonjour
LIBDIR = ..\DLL\Win32\Release
!endif

CFLAGS = $(CFLAGS_COMMON) $(CFLAGS_DEBUG)
JAVACFLAGS = $(CFLAGS) $(JAVACFLAGS_OS)

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

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 $(BUILDDIR)	mkdir $(BUILDDIR)

postbuild:
	@if not "%RC_XBS%"=="YES" GOTO CONT
	@if not exist "$(DSTROOT)\WINDOWS\system32\Win32"	mkdir "$(DSTROOT)\WINDOWS\system32\Win32"
	@if not exist "$(DSTROOT)\Program Files\Bonjour\Win32"	mkdir "$(DSTROOT)\Program Files\Bonjour\Win32"
	@copy $(BUILDDIR)\jdns_sd.dll "$(DSTROOT)\WINDOWS\system32\Win32"
	@copy $(BUILDDIR)\dns_sd.jar  "$(DSTROOT)\Program Files\Bonjour\Win32"
	@:CONT
	@if not exist root					mkdir root
	@if not exist root\"Program Files"	mkdir root\"Program Files"
	@if not exist $(INSTALLDIR)			mkdir $(INSTALLDIR)
	copy $(BUILDDIR)\dns_sd.jar $(INSTALLDIR)
	copy $(BUILDDIR)\jdns_sd.dll $(INSTALLDIR)

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

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

# The following targets build Java wrappers for the dns-sd.h API.

Java: setup $(BUILDDIR)\dns_sd.jar $(BUILDDIR)\jdns_sd.dll postbuild
	@echo "Java wrappers done"

JAVASRC	= $(SHAREDDIR)\Java
JARCONTENTS =	$(OBJDIR)\com\apple\dnssd\DNSSDService.class \
				$(OBJDIR)\com\apple\dnssd\DNSSDException.class \
				$(OBJDIR)\com\apple\dnssd\DNSRecord.class \
				$(OBJDIR)\com\apple\dnssd\TXTRecord.class \
				$(OBJDIR)\com\apple\dnssd\DNSSDRegistration.class \
				$(OBJDIR)\com\apple\dnssd\DNSSDRecordRegistrar.class \
				$(OBJDIR)\com\apple\dnssd\BaseListener.class \
				$(OBJDIR)\com\apple\dnssd\BrowseListener.class \
				$(OBJDIR)\com\apple\dnssd\ResolveListener.class \
				$(OBJDIR)\com\apple\dnssd\RegisterListener.class \
				$(OBJDIR)\com\apple\dnssd\RegisterRecordListener.class \
				$(OBJDIR)\com\apple\dnssd\QueryListener.class \
				$(OBJDIR)\com\apple\dnssd\DomainListener.class \
				$(OBJDIR)\com\apple\dnssd\DNSSD.class

$(BUILDDIR)\dns_sd.jar: $(JARCONTENTS)
	$(JAR) -cf $@ -C $(OBJDIR) com

$(BUILDDIR)\jdns_sd.dll: $(JAVASRC)\JNISupport.c $(OBJDIR)\DNSSD.java.h $(OBJDIR)\jdns_sd.RES
	$(CC) -Fe$@ $(JAVASRC)\JNISupport.c $(CFLAGS) -I$(OBJDIR) \
	$(LIBDIR)\DNSSD.lib $(JDK)\lib\jvm.lib ws2_32.lib iphlpapi.lib $(OBJDIR)\jdns_sd.RES /link /NXCOMPAT /DYNAMICBASE /SAFESEH

.SUFFIXES : .java
{$(JAVASRC)}.java{$(OBJDIR)\com\apple\dnssd}.class:	
	$(JAVAC) -d $(OBJDIR) -classpath $(OBJDIR) $<

$(OBJDIR)\DNSSD.java.h: $(OBJDIR)\com\apple\dnssd\DNSSD.class
	$(JAVAH) -classpath $(OBJDIR) -o $@ \
		com.apple.dnssd.AppleBrowser \
		com.apple.dnssd.AppleResolver \
		com.apple.dnssd.AppleRegistration \
		com.apple.dnssd.AppleQuery \
		com.apple.dnssd.AppleService 

$(OBJDIR)\jdns_sd.RES: jdns_sd.rc
	$(RC) /fo $@ $?

