common.make   [plain text]


##
# Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
#
# @APPLE_LICENSE_HEADER_START@
# 
# The contents of this file constitute Original Code as defined in and
# are subject to the Apple Public Source License Version 1.1 (the
# "License").  You may not use this file except in compliance with the
# License.  Please obtain a copy of the License at
# http://www.apple.com/publicsource and read it before using this file.
# 
# This Original Code and all software distributed under the License are
# distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
# License for the specific language governing rights and limitations
# under the License.
# 
# @APPLE_LICENSE_HEADER_END@
##



# Turn on the use of the NeXT/Apple make hacks to support the pb_makefiles.
USE_APPLE_PB_SUPPORT = all
export USE_APPLE_PB_SUPPORT


#
# Top-Level Rule
#

.PHONY: all

ifeq "AGGREGATE" "$(PROJTYPE)"
all:
else
all: build
endif

#
# Local site-wide Makefile customization
#

ifndef LOCAL_MAKEFILEDIR
        LOCAL_MAKEFILEDIR = $(NEXT_ROOT)$(LOCAL_DEVELOPER_DIR)/Makefiles/pb_makefiles
endif

-include $(LOCAL_MAKEFILEDIR)/common.make.preamble

#
# merging OS-specific variables
#

ifndef INSTALLDIR
INSTALLDIR = $($(PLATFORM_TYPE)_INSTALLDIR)
endif

ifndef DYLIB_ROOT
ifeq "SOLARIS" "$(OS)"
DYLIB_ROOT = /opt/Apple
endif
endif

#
# Localization variables
#
# Under the old localization scheme, a project defined LANGUAGE to name the
# language that was being built and LOCAL_RESOURCES and HELP_FILES to name the 
# resources used by that language.  The new scheme builds all languages
# simultaneously, and requires that the project define LANGUAGES to name all
# languages and English_RESOURCES, English_HELP_FILES, French_RESOURCES
# French_HELP_FILES, etc. to define the resources needed by each language.
#
# The following variable definitions allow projects that have not yet been
# updated to the new scheme to continue to build.
#

ifndef $(LANGUAGE)_HELP_FILES
$(LANGUAGE)_HELP_FILES = $(HELP_FILES)
endif
ifndef $(LANGUAGE)_RESOURCES
$(LANGUAGE)_RESOURCES = $(LOCAL_RESOURCES)
endif
ifndef LANGUAGES
LANGUAGES = $(LANGUAGE)
endif

#
# Miscellaneous variables
#

SILENT = @
ARCH = $(shell $(ARCH_CMD))
ifndef RC_ARCHS
RC_ARCHS = $(ARCH)
endif
TARGET_ARCHS = $(RC_ARCHS)
MAKEFILE_SOURCE = pb_makefiles

ifeq "WINDOWS" "$(OS)"

ifndef LINK_SUBPROJECTS
LINK_SUBPROJECTS = NO
endif
DISABLE_OBJCPLUSPLUS = NO
EXECUTABLE_EXT = .exe
ifeq "STATIC" "$(LIBRARY_STYLE)"
LIBRARY_EXT = .lib
else
LIBRARY_EXT = .dll
endif
LIBRARY_PREFIX =
DLL_EXT = .dll
EXP_EXT = .exp
NULL = NUL
ifneq "$(LIBRARY_STYLE)" "STATIC"
WINDOWS_DEF_FILE = $(NAME)$(BUILD_TYPE_SUFFIX).def 
endif

else

ifndef LINK_SUBPROJECTS
LINK_SUBPROJECTS = YES
endif
EXECUTABLE_EXT = 
LIBRARY_PREFIX = lib

ifeq "SOLARIS" "$(OS)"
ifeq "STATIC" "$(LIBRARY_STYLE)"
LIBRARY_EXT = .a
else
LIBRARY_EXT = .so
endif
else
ifeq "HPUX" "$(OS)"
ifeq "STATIC" "$(LIBRARY_STYLE)"
LIBRARY_EXT = .a
else
LIBRARY_EXT = .sl
endif
else
ifeq "STATIC" "$(LIBRARY_STYLE)"
LIBRARY_EXT = .a
else
LIBRARY_EXT = .dylib
endif
endif
endif

DLL_EXT =
NULL = /dev/null

endif

PROFILE_SUFFIX = _profile
ifndef DEBUG_SUFFIX
DEBUG_SUFFIX = _debug
endif

ifneq "NO" "$(INCLUDE_COMPATIBILITY_MAKEFILE)"
include $(MAKEFILEDIR)/compatibility.make
endif

#
# Roots
#

SRCROOT := $(shell pwd)
# BUILD_SYMROOT is defined below under Directories for derived files
ifndef OBJROOT
OBJROOT = $(BUILD_SYMROOT)
endif
# BUILD_OUTPUT_DIR is defined below under Directories
ifndef SYMROOT
SYMROOT = $(BUILD_OUTPUT_DIR)
endif

#
# Directories
#

ifneq "" "$($(PLATFORM_TYPE)_BUILD_OUTPUT_DIR)"
BUILD_OUTPUT_DIR = $($(PLATFORM_TYPE)_BUILD_OUTPUT_DIR)
endif
ifeq "" "$(BUILD_OUTPUT_DIR)"
BUILD_OUTPUT_DIR = $(SRCROOT)
endif

#
# Java transformations
#
## NOTE: This is OFF by default so OpenStep apps aren't affected.
ifeq "$(JAVA_IS_CLIENT_SIDE)" "YES"
JAVA_CLASSES_CLIENT := $(JAVA_CLASSES)
endif

## NOTE: This is ON by default so OpenStep apps do compile for server-side.
ifeq "$(JAVA_IS_SERVER_SIDE)" "NO"
override JAVA_CLASSES = 
endif

# Directories for derived files
PRODUCT_DIR = $(SYMROOT)
ifeq "" "$(TOPLEVEL_NAME)"
TOPLEVEL_NAME = $(NAME)
endif
export TOPLEVEL_NAME

BUILD_SYMROOT = $(SYMROOT)/$(TOPLEVEL_NAME).build

OFILE_DIR = $(OBJROOT)/objects$(OFILE_DIR_SUFFIX)
SFILE_DIR = $(BUILD_SYMROOT)/derived_src

JAVA_SRC_DIR = $(BUILD_SYMROOT)/derived_src/java
JAVA_SRC_DIR_CLIENT = $(JAVA_SRC_DIR)_client
JAVA_OBJ_DIR = $(OBJROOT)/java_classes
JAVA_OBJ_DIR_CLIENT = $(JAVA_OBJ_DIR)_client

PROJECT_HDR_DIR = $(BUILD_SYMROOT)/ProjectHeaders
ifneq "" "$(PUBLIC_HDR_DIR)"
   PUBLIC_HDR_DIR = $(BUILD_SYMROOT)/Headers/$(notdir $(PUBLIC_HDR_INSTALLDIR))
endif
ifeq "YES" "$(WRAPPED)"
ifeq "APP" "$(PROJTYPE)"
   PUBLIC_HDR_DIR = $(BUILD_SYMROOT)/Headers
else
   PUBLIC_HDR_DIR = $(PRODUCT)/Headers
endif
endif
ifneq "" "$(PRIVATE_HDR_DIR)"
   PRIVATE_HDR_DIR = $(BUILD_SYMROOT)/PrivateHeaders/$(notdir $(PRIVATE_HDR_INSTALLDIR))
endif
ifeq "YES" "$(WRAPPED)"
   PRIVATE_HDR_DIR = $(PRODUCT)/PrivateHeaders
endif
ifeq "" "$(PRECOMP_TRUSTFILE)"
PRECOMP_TRUSTFILE = $(SFILE_DIR)/TrustedPrecomps.txt
endif
export PUBLIC_HDR_DIR
export PRIVATE_HDR_DIR
export PUBLIC_HDR_INSTALLDIR
export PRIVATE_HDR_INSTALLDIR
export PRECOMP_TRUSTFILE

#
# File Lists
#

VPATH = $(OFILE_DIR) $(SFILE_DIR) $(LANGUAGE).lproj
GENERATED_SRCFILES = $(MSGFILES:%.msg=%Speaker.h) $(MSGFILES:%.msg=%Speaker.m) $(MSGFILES:%.msg=%Listener.h) $(MSGFILES:%.msg=%Listener.m) $(DEFSFILES:%.defs=%.h) $(DEFSFILES:%.defs=%User.c) $(DEFSFILES:%.defs=%Server.c) $(MIGFILES:%.mig=%.h) $(MIGFILES:%.mig=%User.c) $(MIGFILES:%.mig=%Server.c) $(PSWFILES:.psw=.h) $(PSWFILES:.psw=.c) $(PSWMFILES:.pswm=.h) $(PSWMFILES:.pswm=.m) $(subst .x_svc,.c, $(subst .x_clnt,.c, $(subst .x_xdr,.c, $(subst .x,.h, $(RPCFILES))))) $(YFILES:.y=.c) $(YFILES:.y=.h) $(LFILES:.l=.c) $(YMFILES:.ym=.m) $(YMFILES:.ym=.h) $(LMFILES:.lm=.m) $(OTHER_GENERATED_SRCFILES)

SRCFILES = PB.project $(JAVA_CLASSES) $(JAVA_CLASSES_CLIENT) $(OTHERSRCS) $(HFILES) $(CLASSES) $(MFILES) $(CFILES) $(CAPCFILES) $(CAPMFILES) $(CCFILES) $(CPPFILES) $(CXXFILES) $(YFILES) $(LFILES) $(YMFILES) $(LMFILES) $(PSWFILES) $(PSWMFILES) $(WOSFILES) $(foreach L,$(LANGUAGES),$(addprefix $(L).lproj/,$($(L)_RESOURCES))) $(GLOBAL_RESOURCES) $(foreach L,$(LANGUAGES),$(addprefix $(L).lproj/,$($(L)_HELP_FILES))) $(OTHERLINKED) $(OTHER_SOURCEFILES)

LOCAL_OFILES = $(addsuffix .o, $(basename $(CLASSES) $(MFILES) $(CFILES) $(CAPCFILES) $(CAPMFILES) $(CCFILES) $(CPPFILES) $(CXXFILES) $(PSWFILES) $(PSWMFILES))) $(PROJTYPE_OFILES) $(OTHERLINKEDOFILES) $(OTHER_OFILES) $(OTHER_GENERATED_OFILES)

GENERATED_JAVA_CLASSES += $(OTHER_GENERATED_JAVA_CLASSES)
GENERATED_JAVA_CLASSES_CLIENT += $(OTHER_GENERATED_JAVA_CLASSES_CLIENT)

JAVAFILES = $(strip $(JAVA_CLASSES) $(GENERATED_JAVA_CLASSES))
JAVAFILES_CLIENT = $(strip $(JAVA_CLASSES_CLIENT) $(GENERATED_JAVA_CLASSES_CLIENT))

ifeq "YES" "$(LINK_SUBPROJECTS)"
 SUBPROJ_OFILES = $(addsuffix _subproj.o,$(SUBPROJECTS))
 OFILES = $(LOCAL_OFILES) $(SUBPROJ_OFILES)
 LOCAL_OFILELISTS =
else
 OFILES = $(LOCAL_OFILES)
 SUBPROJ_OFILELISTS = $(addsuffix _subproj.ofileList,$(SUBPROJECTS))
 LOCAL_OFILELISTS = $(SUBPROJ_OFILELISTS)
endif

LOCAL_OFILELISTS += $(OTHER_OFILELISTS)
ifneq "" "$(strip $(LOCAL_OFILELISTS))"
 OFILELISTS = $(NAME).ofileList
endif

ALL_PRECOMPS = $(PRECOMPILED_HEADERS:.h=.p) $(PRECOMPS)
PRECOMPILED_PUBLIC_HEADERS = $(foreach X, $(PRECOMPILED_HEADERS), $(findstring $(X), $(PUBLIC_HEADERS)))
PRECOMPILED_PRIVATE_HEADERS = $(foreach X, $(PRECOMPILED_HEADERS), $(findstring $(X), $(PRIVATE_HEADERS)))
PRECOMPILED_PROJECT_HEADERS = $(foreach X, $(PRECOMPILED_HEADERS), $(findstring $(X), $(PROJECT_HEADERS)))


ifeq "$(BUILD_TYPE)" "normal"

FRAMEWORK_FLAGS = $(FRAMEWORKS)
PROJTYPE_FRAMEWORK_FLAGS = $(PROJTYPE_FRAMEWORKS)
OTHER_FRAMEWORK_FLAGS = $(OTHER_FRAMEWORKS)
OPTIONAL_FRAMEWORK_FLAGS = $(OPTIONAL_FRAMEWORKS)

else

FRAMEWORK_FLAGS = $(shell $(FRAMEWORK_TOOL) $(FRAMEWORKS) $(BUILD_TYPE))
PROJTYPE_FRAMEWORK_FLAGS = $(shell $(FRAMEWORK_TOOL) $(PROJTYPE_FRAMEWORKS) $(BUILD_TYPE))
OTHER_FRAMEWORK_FLAGS = $(shell $(FRAMEWORK_TOOL) $(OTHER_FRAMEWORKS) $(BUILD_TYPE))
OPTIONAL_FRAMEWORK_FLAGS = $(shell $(FRAMEWORK_TOOL) $(OPTIONAL_FRAMEWORKS) $(BUILD_TYPE))

endif

DEPENDENCIES = $(ARCH_SPECIFIC_OFILES) $(OFILES) $(OFILELISTS) $(OTHER_PRODUCT_DEPENDS)

ifeq "$(LIBRARY_STYLE)" "STATIC"
LOADABLES = $(OFILELISTS:%=-filelist %) $(OFILES) $(LIBS) $(PROJTYPE_LIBS) $(OTHER_LIBS) $(OPTIONAL_LIBS)
else
LOADABLES = $(OFILELISTS:%=-filelist %) $(OFILES) $(LIBS) $(FRAMEWORK_FLAGS) $(PROJTYPE_LIBS) $(PROJTYPE_FRAMEWORK_FLAGS) $(OTHER_LIBS) $(OTHER_FRAMEWORK_FLAGS) $(OPTIONAL_LIBS) $(OPTIONAL_FRAMEWORK_FLAGS)
endif

GARBAGE = $(OBJROOT)/objects-* $(OBJROOT)/obj-* $(SFILE_DIR) $(PROJECT_HDR_DIR) $(PROJTYPE_GARBAGE) $(OTHER_GARBAGE) $(PRECOMPILED_HEADERS:.h=.p) $(PRECOMPS) $(JAVA_SRC_DIR) $(JAVA_SRC_DIR_CLIENT) $(JAVA_OBJ_DIR) $(JAVA_OBJ_DIR_CLIENT)

include $(MAKEFILEDIR)/versions.make
include $(MAKEFILEDIR)/commands-$(OS).make

# if the Makefile has defined a compiler for a specific platform,
# use that one instead of the one found in commands-$(OS).make
ifneq "$($(PLATFORM_TYPE)_OBJCPLUS_COMPILER)" ""
CC = $($(PLATFORM_TYPE)_OBJCPLUS_COMPILER)
endif
ifneq "$($(PLATFORM_TYPE)_OBJCPLUS_COMPILER)" ""
JAVAC = $($(PLATFORM_TYPE)_JAVA_COMPILER)
endif

ifneq "$(findstring java,$(JAVAFILES)$(JAVAFILES_CLIENT))" ""
JAVA_ENABLED = YES
JAVA_USED = YES
endif

ifndef JAVA_NEEDED
JAVA_NEEDED = $(JAVA_AWARE)
endif

ifeq "YES" "$(JAVA_USED)"
ifeq "" "$(JAVA_NEEDED)"
JAVA_NEEDED = YES
endif
endif

include $(MAKEFILEDIR)/flags.make
include $(MAKEFILEDIR)/recursion.make
include $(MAKEFILEDIR)/implicitrules.make

#
# In general, no rules should be placed above the include lines above, to
# ensure that when the rule is stored, any variables in that rule or its
# dependencies have been fully defined.  For example, OFILE_DIR may change
# in flags.make.
#

$(OFILELISTS): $(LOCAL_OFILELISTS) Makefile
	$(OFILE_LIST_TOOL) -o $(OFILE_DIR)/$(NAME).ofileList $(LOCAL_OFILELISTS)


#
# Rules for creating help files
#
# Note that the LOCALIZED_HELP_PLIST, LOCALIZED_HELP_FILES, and 
# LOCALIZED_SUBPROJECT_HELP_PLISTS variables are defined in terms of the 
# current target ($*) and therefore are only meaningful in the context of 
# the {Language}.create-help-file targets.
#
# The ifneq "$(HELP_FILES)" "$($(LANGUAGE)_HELP_FILES)" statement below may be
# a little unclear, so here's the explanation:
# It is an error to have non-localized help files.  This is because help files
# are always written in some human language, and therefore implicitly local.
# The ifneq enforces this.  There are three possible states of the variables:
# 1. Still using LANGUAGE, etc. instead of LANGUAGES, etc.
#    In this case, $(LANGUAGE)_HELP_FILES was assigned to $(HELP_FILES) earlier
#    in common.make, so the test is guaranteed to fail and the message is not reported
# 2. Using the new variables.
#    In this case, $(LANGUAGE)_HELP_FILES is _HELP_FILES, which is undefined.
#    HELP_FILES is also undefined, and so "" != "" fails and hence no message
# 3. Using the new variables, but have non-localized help files
#    $(LANGUAGE)_HELP_FILES is _HELP_FILES, which is undefined, but HELP_FILES
#    is defined.  Therefore the ifneq succeeds, the message is reported, and the
#    build stops.
#

HELP_FILE_NAME = Help.plist
ifeq "YES" "$(WRAPPED)"
LOCALIZED_HELP_PLIST = $(GLOBAL_RESOURCE_DIR)/$*.lproj/$(HELP_FILE_NAME)
else
LOCALIZED_HELP_PLIST = $(SFILE_DIR)/$*$(HELP_FILE_NAME)
endif
LOCALIZED_HELP_FILES = $(addprefix $*.lproj/, $($*_HELP_FILES))
LOCALIZED_SUBPROJECT_HELP_PLISTS = $(wildcard $(foreach SUBPROJ, $(SUBPROJECTS), $(SFILE_DIR)/$(SUBPROJ)/$*$(HELP_FILE_NAME)))
ALL_LOCALIZED_HELP_CONTENT = $(strip $(LOCALIZED_HELP_FILES) $(LOCALIZED_SUBPROJECT_HELP_PLISTS))

.SUFFIXES: .create-help-file

create-help-file: $(addsuffix .create-help-file, $(LANGUAGES))

$(addsuffix .create-help-file, $(LANGUAGES)):
ifneq "$(HELP_FILES)" "$($(LANGUAGE)_HELP_FILES)"
	$(SILENT) $(ECHO) common.make: localization error: Non-localized help files: $(HELP_FILES)
	$(SILENT) exit 1
endif
	$(SILENT) if [ ! -n "$(ALL_LOCALIZED_HELP_CONTENT)" ] || $(NEWER) -s -n $(LOCALIZED_HELP_PLIST) $(ALL_LOCALIZED_HELP_CONTENT); \
	then \
		$(ECHO) -n ; \
	else \
		$(ECHO) Processing $* help files... ; \
		cmd="$(MKDIRS) $(dir $(LOCALIZED_HELP_PLIST))" ; \
		$(ECHO) $$cmd ; $$cmd ; \
		cmd="$(COMPILEHELP) $(LOCALIZED_HELP_FILES) $(addprefix -m , $(LOCALIZED_SUBPROJECT_HELP_PLISTS)) -o $(LOCALIZED_HELP_PLIST)" ; \
		$(ECHO) $$cmd ; $$cmd ; \
	fi

# "Versioning Systems" adapt these makefiles to an SCM system in the following 2 ways:
#  1. Provide a rule for an object file that can be linked into binaries produced here
#      (e.g. $(VERS_OFILE) could then be included in OTHER_GENERATED_OFILES).
#  2. Provide a decimal number that can be used as the current project version to be
#      stored in a Mach dylib (i.e. $(CURRENT_PROJECT_VERSION)).

ifndef VERSIONING_SYSTEM_MAKEFILEDIR
VERSIONING_SYSTEM_MAKEFILEDIR = $(MAKEFILEPATH)/VersioningSystems
endif

ifndef LOCAL_VERSIONING_SYSTEM_MAKEFILEDIR
LOCAL_VERSIONING_SYSTEM_MAKEFILEDIR = $(NEXT_ROOT)$(LOCAL_DEVELOPER_DIR)/Makefiles/VersioningSystems
endif

-include $(VERSIONING_SYSTEM_MAKEFILEDIR)/$(VERSIONING_SYSTEM).make
-include $(LOCAL_VERSIONING_SYSTEM_MAKEFILEDIR)/$(VERSIONING_SYSTEM).make

# In case $(VERSIONING_SYSTEM).make didn't set CURRENT_PROJECT_VERSION...

ifeq "" "$(CURRENT_PROJECT_VERSION)"
CURRENT_PROJECT_VERSION = 1
endif
ifeq "" "$(COMPATIBILITY_PROJECT_VERSION)"
COMPATIBILITY_PROJECT_VERSION = 1
endif

# STRIP_ON_INSTALL must have a value
ifneq "$(STRIP_ON_INSTALL)" "NO"
STRIP_ON_INSTALL = YES
endif

# On Windows, we want to force the loading of framework DLL's.

ifeq "WINDOWS" "$(OS)"
ifneq "" "$(FRAMEWORKS)"

FORCELOAD_FILENAME = NSFrameworkForceLoad_$(NAME).m
FORCELOAD_FILEPATH = $(SFILE_DIR)/$(FORCELOAD_FILENAME)
OTHER_GENERATED_SRCFILES += $(FORCELOAD_FILENAME)
OTHER_GENERATED_OFILES += $(FORCELOAD_FILENAME:.m=.o)
BEFORE_BUILD_RECURSION += generate-forceload-file

STD_FRAMEWORK_SEARCHPATHS = -F$(NEXT_ROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks -F$(NEXT_ROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks
FRAMEWORK_ARGS = $(ALL_LDFLAGS) $(FRAMEWORKS) $(STD_FRAMEWORK_SEARCHPATHS)

generate-forceload-file: $(FORCELOAD_FILEPATH)
$(FORCELOAD_FILEPATH): Makefile
	$(SILENT) $(MKDIRS) $(SFILE_DIR)
	$(SILENT) $(RM) -f $(FORCELOAD_FILEPATH)
	$(GENFORCELOAD) $(FRAMEWORK_ARGS) > $(FORCELOAD_FILEPATH)

$(FORCELOAD_FILENAME:.m=.o): $(FORCELOAD_FILEPATH)
	$(CC) -c $(filter-out -W%, $(ALL_CFLAGS)) -o $(OFILE_DIR)/$(FORCELOAD_FILENAME:.m=.o) $<

endif
endif

# Back to Java...

ifeq "YES" "$(JAVA_USED)"

ifeq "$(patsubst $(PRODUCT)%,,$(JAVA_INSTALL_DIR))" "$(JAVA_INSTALL_DIR)"
JAVA_DSTROOT = $(DSTROOT)
endif
ifeq "$(patsubst $(PRODUCT)%,,$(JAVA_INSTALL_DIR_CLIENT))" "$(JAVA_INSTALL_DIR_CLIENT)"
JAVA_DSTROOT_CLIENT = $(DSTROOT)
endif

endif

ifneq "AGGREGATE" "$(PROJTYPE)"
# 04/14/1999 RDW -- Excluding depend.make for stage 1 builds on PDO
#                   (when we're bootstrapping everything).  Should
#                   be on for all other cases.  This was causing
#                   problems in stage 1 builds on HP-UX.
ifndef PDO_STAGE1BUILD
include $(MAKEFILEDIR)/depend.make
endif
include $(MAKEFILEDIR)/prebuild.make
include $(MAKEFILEDIR)/build.make
include $(MAKEFILEDIR)/installhdrs.make
include $(MAKEFILEDIR)/install.make
endif
include $(MAKEFILEDIR)/installsrc.make

always:


#
# architecture-specific .o files get combined into fat .o files
#

ifneq "$(LIPO)" ""

ARCH_SPECIFIC_OFILES = $(foreach OFILE, $(LOCAL_OFILES), $(foreach ARCH, $(ADJUSTED_TARGET_ARCHS), $(OFILE_DIR)/$(notdir $(basename $(OFILE))).$(ARCH).o))

$(OFILES): $(ARCH_SPECIFIC_OFILES)

endif

#
# Sequencing
#

ifneq "YES" "$(RECURSING)"
announce-prebuild announce-build announce-installhdrs announce-install: display-masthead
endif

ifneq "AGGREGATE" "$(PROJTYPE)"
ifneq "YES" "$(RECURSING)"
ifneq "YES" "$(SKIP_BUILD)"
announce-install: build
endif
ifneq "YES" "$(SKIP_PREBUILD)"
announce-build: prebuild
endif
endif
endif

#
# Conveniences
#

profile:
	$(SILENT) unset $(CUMULATIVE_VARIABLES) ||: ; \
            $(MAKE) PROFILE=YES \
		BUILD_TYPE=$@ \
		BUILD_TYPE_SUFFIX=$(PROFILE_SUFFIX) \
		APP_WRAPPER_EXTENSION=.profile

debug:
	$(SILENT) unset $(CUMULATIVE_VARIABLES) ||: ; \
            $(MAKE) DEBUG=YES PROFILE=NO OPTIMIZE=NO \
		BUILD_TYPE=$@ \
		BUILD_TYPE_SUFFIX=$(DEBUG_SUFFIX) \
		APP_WRAPPER_EXTENSION=.debug

BUILD_TYPE = normal

#
# Masthead
#

display-masthead:
ifeq "$(BUILD_TYPE)" "normal"
	$(SILENT) $(ECHO) == Making $(NAME) for $(ADJUSTED_TARGET_ARCHS) ==
else
	$(SILENT) $(ECHO) == Making $(BUILD_TYPE) on $(NAME) for $(ADJUSTED_TARGET_ARCHS) ==
endif

#
# Makefile-Debugging and Variable-Access Rules
#

.PHONY: show-variable sv show-expression se

VARIABLE=$(V)
show-variables sv:
	$(SILENT) $(foreach X, $(VARIABLE), $(ECHO) "$($(X))";)
EXPRESSION=$(E)
show-expression se:
	$(SILENT) $(foreach X, $(EXPRESSION), $(ECHO) "$(X)";)

echo_makefile_variable:
	$(SILENT) $(foreach X, $(VAR_NAME), $(ECHO) "$($(X))";)

echo_makefile_expression:
	$(SILENT) $(foreach X, $(EXPR_STRING), $(ECHO) "$(X)";)

#
# Cleaning Rules
#

.PHONY: clean mostlyclean announce-clean

clean: announce-clean
	$(RM) -rf $(GARBAGE) $(PRODUCTS)
ifneq "$(SYMROOT)" "$(BUILD_SYMROOT)"
	$(RM) -rf $(BUILD_SYMROOT)
endif

mostlyclean: announce-clean
	$(RM) -rf $(GARBAGE)
ifneq "$(SYMROOT)" "$(BUILD_SYMROOT)"
	$(RM) -rf $(BUILD_SYMROOT)
endif
	
announce-clean:
	$(SILENT) $(ECHO) == Cleaning $(NAME) ==


#
# Some install conveniences that apply to all projects
#
# The install_java_debug target creates the _g libraries that
# Sun's VM needs to run native method implementations under jdb
#

install_java_debug:
	$(MAKE) install DEBUG=YES PROFILE=NO OPTIMIZE=NO STRIP_ON_INSTALL=NO \
            BUILD_TYPE=debug BUILD_TYPE_SUFFIX=$(DEBUG_SUFFIX) \
            SRCROOT=$(SRCROOT) SYMROOT=$(SYMROOT) OBJROOT=$(OBJROOT)

install_debug:
	$(MAKE) install DEBUG=YES PROFILE=NO OPTIMIZE=NO STRIP_ON_INSTALL=NO

install_unstripped:
	$(MAKE) install DEBUG=NO PROFILE=NO OPTIMIZE=YES STRIP_ON_INSTALL=NO

install_profile:
	$(MAKE) install DEBUG=YES PROFILE=YES OPTIMIZE=YES STRIP_ON_INSTALL=NO

ifeq "YES" "$(JAVA_USED)"

COPY_JAVA_FS = copy-java-fs-wtar

# ZIP_JAVA_CLASSES is deprecated but it meant no archiving, so we'll
# honour it here if possible.

ifeq "NO" "$(ZIP_JAVA_CLASSES)"
ARCHIVE_JAVA_CLASSES = NO
endif

# Find the appropriate way to archive the Java classes.

ifneq "NO" "$(ARCHIVE_JAVA_CLASSES)"

ifndef JAVA_ARCHIVE_METHOD
JAVA_ARCHIVE_METHOD = ZIP
endif

ifeq "JAR" "$(JAVA_ARCHIVE_METHOD)"
ifndef JAVA_JAR_NAME
JAVA_JAR_NAME := $(shell $(SHELL) -c 'JJAR=`$(ECHO) $(NAME) | $(TR) "[A-Z]" "[a-z]"`; $(ECHO) $${JJAR:=$(NAME)}').jar
endif
JAVA_JAR_NAME_CLIENT = $(NAME).jar

COPY_JAVA_CLASSES = copy-java-jar
JAVA_PRODUCT = $(JAVA_JAR_NAME)
JAVA_PRODUCT_CLIENT = $(JAVA_JAR_NAME)
endif

ifeq "ZIP" "$(JAVA_ARCHIVE_METHOD)"
ifndef JAVA_ZIP_NAME
JAVA_ZIP_NAME := $(shell $(SHELL) -c 'JZIP=`$(ECHO) $(NAME) | $(TR) "[A-Z]" "[a-z]"`; $(ECHO) $${JZIP:=$(NAME)}').zip
endif

COPY_JAVA_CLASSES = copy-java-zip
JAVA_PRODUCT = $(JAVA_ZIP_NAME)
endif

endif

ifneq "" "$(JAVA_PRODUCT)"
JAVA_PRODUCTS_PATH = \"$(JAVA_PRODUCT)\"
endif

#ifndef JAVA_PRODUCT
#JAVA_PRODUCT = "`$(SHELL) -c '$(CD) $(JAVA_OBJ_DIR) && $(FIND) * -print'`"
#endif

#ifndef JAVA_PRODUCT_CLIENT
#JAVA_PRODUCT_CLIENT = "`$(SHELL) -c '$(CD) $(JAVA_OBJ_DIR_CLIENT) && $(FIND) * -print'`"
#endif

ifneq "" "$(JAVA_PRODUCT)"
GARBAGE += $(JAVA_RESOURCE_DIR)/$(JAVA_PRODUCT)
endif
ifneq "" "$(JAVA_PRODUCT_CLIENT)"
GARBAGE += $(JAVA_RESOURCE_DIR_CLIENT)/$(JAVA_PRODUCT_CLIENT)
endif

ifeq "" "$(COPY_JAVA_CLASSES)"
COPY_JAVA_CLASSES = $(COPY_JAVA_FS)
endif

ANNOUNCE_COPY_JAVA = announce-copy-java

copy-java-classes: $(ANNOUNCE_COPY_JAVA) relax-java-permissions $(COPY_JAVA_CLASSES)

ifneq "YES" "$(RECURSING)"
announce-copy-java: display-masthead
endif

announce-copy-java:
	$(SILENT) echo Copying Java classes...

relax-java-permissions: relax-java-perms relax-java-perms-client

relax-java-perms:
ifdef CHMOD
	-$(SILENT) if [ ! -z "$(JAVA_OBJ_DIR)" -a -d "$(JAVA_OBJ_DIR)" ]; then \
	    $(ECHO) $(CHMOD) -R a+rX $(JAVA_OBJ_DIR); \
	    $(CHMOD) -R a+rX $(JAVA_OBJ_DIR); \
        fi
endif

relax-java-perms-client:
ifdef CHMOD
	-$(SILENT) if [ ! -z "$(JAVA_OBJ_DIR_CLIENT)" -a -d "$(JAVA_OBJ_DIR_CLIENT)" ]; then \
	    $(ECHO) $(CHMOD) -R a+rX $(JAVA_OBJ_DIR_CLIENT); \
	    $(CHMOD) -R a+rX $(JAVA_OBJ_DIR_CLIENT); \
        fi
endif

copy-java-fs-wfastcp:
	$(SILENT) if [ -d "$(JAVA_OBJ_DIR)" ]; then \
	    $(CD) $(JAVA_OBJ_DIR); if [ "*" != "`$(ECHO) *`" ]; then \
	        $(MKDIRS) $(JAVA_RESOURCE_DIR); \
	        $(FASTCP) $(JAVA_OBJ_DIR)/* $(JAVA_RESOURCE_DIR); \
	    fi; \
	fi
	$(SILENT) if [ -d "$(JAVA_OBJ_DIR_CLIENT)" ]; then \
	    $(CD) $(JAVA_OBJ_DIR_CLIENT); if [ "*" != "`$(ECHO) *`" ]; then \
	    $(MKDIRS) $(JAVA_RESOURCE_DIR_CLIENT); \
	    $(FASTCP) $(JAVA_OBJ_DIR_CLIENT)/* $(JAVA_RESOURCE_DIR_CLIENT); \
	    fi; \
	fi

copy-java-fs-wtar:
	$(SILENT) if [ -d "$(JAVA_OBJ_DIR)" ]; then \
	    $(CD) $(JAVA_OBJ_DIR); if [ "*" != "`$(ECHO) *`" ]; then \
	        $(MKDIRS) $(JAVA_RESOURCE_DIR); \
	        ($(CD) $(JAVA_OBJ_DIR) && $(TAR) cf - *) | ($(CD) $(JAVA_RESOURCE_DIR) && $(TAR) xpf -) && echo Copied `($(CD) $(JAVA_OBJ_DIR) && ls -d *)`; \
	    fi; \
	fi
	$(SILENT) if [ -d "$(JAVA_OBJ_DIR_CLIENT)" ]; then \
	    $(CD) $(JAVA_OBJ_DIR_CLIENT); if [ "*" != "`$(ECHO) *`" ]; then \
	    $(MKDIRS) $(JAVA_RESOURCE_DIR_CLIENT); \
	    ($(CD) $(JAVA_OBJ_DIR_CLIENT) && $(TAR) cf - *) | ($(CD) $(JAVA_RESOURCE_DIR_CLIENT) && $(TAR) xpf -) && echo Copied `($(CD) $(JAVA_OBJ_DIR_CLIENT) && ls -d *)`; \
	    fi; \
	fi

# Note: Info-ZIP's zip recursively exploration of directories looks broken
# so we have to find the .class files ourselves in order to have a correct
# archive of classes.

# As a matter of fact, we do not want to zip the client-side Java: hey, how
# will it be served by an HTTP server, then? So we just use the fastcp copy.

copy-java-zip:
	$(SILENT) if [ -d "$(JAVA_OBJ_DIR)" -a "$(JAVA_CLASSES)" ]; then \
	    $(CD) $(JAVA_OBJ_DIR); if [ "*" != "`$(ECHO) *`" ]; then \
	        $(MKDIRS) $(JAVA_RESOURCE_DIR); \
		if [ "$(ARCHIVE_ALL_JAVA_CLASSES)" = "NO" ]; then \
		    $(CD) $(JAVA_OBJ_DIR) && $(MKZIP) $(JAVA_ZIP_FLAGS) $(JAVA_RESOURCE_DIR)/$(JAVA_ZIP_NAME) `$(ECHO) "$(JAVA_CLASSES)" | $(SED) -e "s/\.java/\.class/g"` && $(ECHO) Zipped `$(ECHO) "$(JAVA_CLASSES)" | $(SED) -e "s/\.java/\.class/g"`; \
		else \
		    $(CD) $(JAVA_OBJ_DIR) && $(MKZIP) $(JAVA_ZIP_FLAGS) $(JAVA_RESOURCE_DIR)/$(JAVA_ZIP_NAME) `$(FIND) . \( -type d -o -name \*.class \) -print | $(SED) 's,^\./,,'` && echo Zipped `ls -d *`; \
		fi; \
	    fi; \
	fi
	$(SILENT) if [ -d "$(JAVA_OBJ_DIR_CLIENT)" ]; then \
	    $(CD) $(JAVA_OBJ_DIR_CLIENT); if [ "*" != "`$(ECHO) *`" ]; then \
	    $(MKDIRS) $(JAVA_RESOURCE_DIR_CLIENT); \
	    $(FASTCP) $(JAVA_OBJ_DIR_CLIENT)/* $(JAVA_RESOURCE_DIR_CLIENT); \
	    fi; \
	fi

# If we have jar, we certainly will use this rule rather than the zip one.

copy-java-jar-resources: $(JAVA_OBJ_DIR)
ifneq "$(OTHER_JAR_RESOURCES)" ""
	$(SILENT) $(FASTCP) $(OTHER_JAR_RESOURCES) $(JAVA_OBJ_DIR)
endif
ifneq "$(OTHER_JAR_RESOURCES_CLIENT)" ""
	$(SILENT) $(FASTCP) $(OTHER_JAR_RESOURCES_CLIENT) $(JAVA_OBJ_DIR_CLIENT)
endif

copy-java-jar: copy-java-jar-resources
	$(SILENT) if [ -d "$(JAVA_OBJ_DIR)" -a "$(JAVA_CLASSES)" ]; then \
	    $(CD) $(JAVA_OBJ_DIR); if [ "*" != "`$(ECHO) *`" ]; then \
	        $(MKDIRS) $(JAVA_RESOURCE_DIR); \
		if [ "$(ARCHIVE_ALL_JAVA_CLASSES)" = "NO" ]; then \
	            $(CD) $(JAVA_OBJ_DIR) && $(JAR) $(JAVA_JAR_FLAGS) $(JAVA_JAR_PARTIAL_MANIFEST) $(JAVA_RESOURCE_DIR)/$(JAVA_JAR_NAME) `$(ECHO) "$(JAVA_CLASSES)" | $(SED) -e "s/\.java/\.class/g"` && $(ECHO) Jarred `$(ECHO) "$(JAVA_CLASSES)" | $(SED) -e "s/\.java/\.class/g"`; \
		else \
		    $(CD) $(JAVA_OBJ_DIR) && $(JAR) $(JAVA_JAR_FLAGS) $(JAVA_JAR_PARTIAL_MANIFEST) $(JAVA_RESOURCE_DIR)/$(JAVA_JAR_NAME) *  && echo Jarred `ls -d *`; \
		fi; \
	    fi; \
	fi
	$(SILENT) if [ -d "$(JAVA_OBJ_DIR_CLIENT)" ]; then \
	    $(CD) $(JAVA_OBJ_DIR_CLIENT); if [ "*" != "`$(ECHO) *`" ]; then \
	    $(MKDIRS) $(JAVA_RESOURCE_DIR_CLIENT); \
	    $(CD) $(JAVA_OBJ_DIR_CLIENT) && $(JAR) $(JAVA_JAR_FLAGS_CLIENT) $(JAVA_JAR_PARTIAL_MANIFEST_CLIENT) $(JAVA_RESOURCE_DIR_CLIENT)/$(JAVA_JAR_NAME_CLIENT) * && $(ECHO) Jarred `ls -d *`; \
	    $(FASTCP) $(JAVA_OBJ_DIR_CLIENT)/* $(JAVA_RESOURCE_DIR_CLIENT); \
	    fi; \
	fi

endif

-include $(LOCAL_MAKEFILEDIR)/common.make.postamble