bundle-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@
##
#
#                              bundle-common.make
#

RESOURCES_ROOT = $(PRODUCT_ROOT)/Resources

include $(MAKEFILEDIR)/common.make

# Override common.make
DEV_HEADER_DIR_BASE = $(TOP_PRODUCT_ROOT)

DYNAMIC_BUILD_TYPE_SUFFIX = ""
DEBUG_BUILD_TYPE_SUFFIX = ""
PROFILE_BUILD_TYPE_SUFFIX = "_profile"

set_header_dirs = \
	$(set_product_root) ; \
        public_header_dir="$(INSTALLDIR)/$$product_root/Headers" ;\
	 private_header_dir="$(INSTALLDIR)/$$product_root/PrivateHeaders"

.PHONY : framework bundle palette debug profile static

framework bundle palette debug profile static kernel::
	@($(check_for_gnumake) ; \
	$(process_target_archs) ; \
	$(set_dynamic_flags) ; \
	$(set_objdir) ; \
	$(set_product_root) ; \
	for arch in $$archs ; do \
	   $(ECHO) == Making target $@ for $(NAME) \($$arch\) == ; \
	   ofile_dir="$(OBJROOT)/`$(ECHO) $$buildtype`_$$objdir/$$arch" ; \
           intermediate_product_name="$(NAME).$$arch" ; \
	   $(MAKE) project \
		"SYM_DIR = $(SYMROOT)/$(DERIVED_SRC_DIR_NAME)" \
		"OFILE_DIR = $$ofile_dir" \
		"BUILD_TYPE_CFLAGS = $($@_target_CFLAGS) $$dynamic_cflags" \
		"BUILD_TYPE_LDFLAGS = $($@_target_LDFLAGS)" \
		"RC_CFLAGS = -arch $$arch $$archless_rcflags" \
		"RC_ARCHS = $$archs" \
		"TARGET_ARCH = $$arch" \
		"ALL_ARCH_FLAGS = $$arch_flags" \
		"BUILD_TARGET = $@" \
		"BUILD_TYPE_SUFFIX = $$build_type_suffix" \
		"MAKEFILEDIR = $(MAKEFILEDIR)" \
		"ONLY_SUBPROJECT = $(ONLY_SUBPROJECT)" \
		"PRODUCT_ROOT = $(SYMROOT)" \
		"TOP_PRODUCT_ROOT = $(SYMROOT)/$$product_root" \
		"IS_TOPLEVEL = YES" \
		"LINK_STYLE = $(LINK_STYLE)" \
		"INSTALLDIR = $(INSTALLDIR)" \
		"CODE_GEN_STYLE = $(CODE_GEN_STYLE)" \
		"MAKEFILEDIR = $(MAKEFILEDIR)" \
		"DSTROOT = $(DSTROOT)" \
		"SRCROOT = $(SRCROOT)" \
		"OBJROOT = $(OBJROOT)" \
		"SYMROOT = $(SYMROOT)" \
              $(stop_if_error_in_arch) ; \
	   if [ -n "$$last_arch" ] ; then \
		multiple_archs=yes ; \
	   fi ; \
	   last_arch=$$arch ; \
	   lists="$$lists $$ofile_dir/$(NAME).ofileList" ; \
        done ; \
	$(MAKE) configure_for_target_archs \
		"TOP_PRODUCT_ROOT = $(SYMROOT)/$$product_root" \
		"PRODUCT_ROOT = $(SYMROOT)" \
		"REL_PRODUCT_ROOT = $$product_root" \
		"OFILE_DIR = $(OBJROOT)/`$(ECHO) $$buildtype`_$$objdir" \
		"BUILD_TYPE_SUFFIX = $$build_type_suffix" \
		"MULTIPLE_ARCHS = $$multiple_archs" \
		"SINGLE_ARCH = $$last_arch" \
		"RC_ARCHS = $$archs" \
		"OBJROOT = $(OBJROOT)" \
		"SYMROOT = $(SYMROOT)" \
		"ARCH_SPECIFIC_OFILELISTS = $$lists" \
		"DELETE_THIN_RESULTS = $(DELETE_THIN_RESULTS)" \
		"MAKEFILEDIR = $(MAKEFILEDIR)")

# Current limitation: Nested frameworks and palettes are unsupported.
#    Nested bundles are supported but must have BUNDLE_EXTENSION set.

configure_for_target_archs:: 
	@($(set_product_root) ; \
	complete_prod_root="$(PRODUCT_ROOT)/$$product_root" ; \
	for arch in $(RC_ARCHS) ; do \
	    dependencies="$$dependencies $$complete_prod_root/$(NAME)$(BUILD_TYPE_SUFFIX).$$arch$(BUNDLE_BINARY_EXT)" ;\
	    lipo_args="$$lipo_args -arch $$arch $$complete_prod_root/$(NAME)$(BUILD_TYPE_SUFFIX).$$arch$(BUNDLE_BINARY_EXT)" ; \
	done ; \
	$(set_should_build) ; \
	if [ "$$should_build" = "yes" ] ; then \
	   $(MAKE) final \
		"TOP_PRODUCT_ROOT = $(TOP_PRODUCT_ROOT)" \
		"DEPENDENCIES = $$dependencies" \
		"LIPO_ARGS = $$lipo_args" \
		"COMPLETE_PRODUCT_ROOT = $$complete_prod_root" \
		"BUILD_TYPE_SUFFIX = $(BUILD_TYPE_SUFFIX)" \
		"DELETE_THIN_RESULTS = $(DELETE_THIN_RESULTS)" \
		"MULTIPLE_ARCHS = $(MULTIPLE_ARCHS)" \
		"SINGLE_ARCH = $(SINGLE_ARCH)" \
		"RC_ARCHS = $(RC_ARCHS)" \
		"MAKEFILEDIR = $(MAKEFILEDIR)" ; \
	else \
	    $(ECHO) Not configuring $(NAME). ; \
	fi)


.PHONY : final

final: $(COMPLETE_PRODUCT_ROOT)/$(NAME)$(BUILD_TYPE_SUFFIX)$(LIBRARY_EXT)

$(COMPLETE_PRODUCT_ROOT)/$(NAME)$(BUILD_TYPE_SUFFIX)$(LIBRARY_EXT): $(DEPENDENCIES)
	@(if [ -n "$(MULTIPLE_ARCHS)" ] ; then \
	      cmd="$(LIPO) -create $(LIPO_ARGS) -o $@" ; \
	      $(ECHO) $$cmd ; $$cmd ; \
	  else \
	      $(RM) -f $@ ; \
	      if [ "$(PLATFORM_OS)" = "winnt" ] ; then \
	         $(RM) -f $(COMPLETE_PRODUCT_ROOT)/$(NAME)$(BUILD_TYPE_SUFFIX).$(SINGLE_ARCH).exp ; \
	         cmd="$(TRANSMOGRIFY) $(COMPLETE_PRODUCT_ROOT)/$(NAME)$(BUILD_TYPE_SUFFIX).$(SINGLE_ARCH)$(BUNDLE_BINARY_EXT) $(COMPLETE_PRODUCT_ROOT)/$(NAME)$(BUILD_TYPE_SUFFIX)$(BUNDLE_BINARY_EXT)" ; \
	         $(ECHO) $$cmd ; $$cmd ; \
	      fi ; \
	      if [ -r $(COMPLETE_PRODUCT_ROOT)/$(NAME)$(BUILD_TYPE_SUFFIX).$(SINGLE_ARCH)$(LIBRARY_EXT) ] ; then \
		 cmd="$(TRANSMOGRIFY) $(COMPLETE_PRODUCT_ROOT)/$(NAME)$(BUILD_TYPE_SUFFIX).$(SINGLE_ARCH)$(LIBRARY_EXT) $@" ; \
		$(ECHO) $$cmd ; $$cmd ; \
	      fi ; \
	fi ; \
	if [ "$(DELETE_THIN_RESULTS)" = "YES" ] ; then \
	     cmd="$(RM) -f $(DEPENDENCIES)" ; \
	     $(ECHO) $$cmd ; $$cmd ; \
	fi)

.PHONY : project actual_project

project::  
	@($(set_product_root) ; \
	$(set_should_build) ; \
	if [ "$$should_build" = "yes" ] ; then \
	   $(MAKE) actual_project \
		"PRODUCT_ROOT = $(PRODUCT_ROOT)/$$product_root" \
       		"OFILE_DIR = $(OFILE_DIR)" \
       		"SYM_DIR = $(SYM_DIR)" \
		"BUILD_TYPE_CFLAGS = $(BUILD_TYPE_CFLAGS)" \
		"IS_TOPLEVEL = $(IS_TOPLEVEL)" \
		"LINK_STYLE = $(LINK_STYLE)" \
		"BUILD_TARGET = $(BUILD_TARGET)" \
		"ALL_ARCH_FLAGS = $(ALL_ARCH_FLAGS)" \
		"CODE_GEN_STYLE = $(CODE_GEN_STYLE)" \
       		"DEV_HEADER_DIR_BASE = $(DEV_HEADER_DIR_BASE)" \
		"DEV_PROJECT_HEADER_DIR_BASE = $(DEV_PROJECT_HEADER_DIR_BASE)"\
       		"BUILD_OFILES_LIST_ONLY = $(BUILD_OFILES_LIST_ONLY)" \
		"BUILD_TYPE_SUFFIX = $(BUILD_TYPE_SUFFIX)" \
       		"MAKEFILEDIR = $(MAKEFILEDIR)" \
       		"DSTROOT = $(DSTROOT)" \
       		"SRCROOT = $(SRCROOT)" \
       		"OBJROOT = $(OBJROOT)" \
       		"SYMROOT = $(SYMROOT)" \
		$(extra_actual_project_exported_vars) ; \
	else \
	   $(ECHO) " ..... $(NAME) not built for architecture $(TARGET_ARCH), platform $(PLATFORM_OS)" ; \
	fi)


actual_project:: initial_targets $(PRODUCT_ROOT) $(RESOURCES_ROOT) all_subprojects resources $(PRODUCT)



TEMP_C_FILE = $(OFILE_DIR)/$(NAME)_empty.c
TEMP_O_FILE = $(OFILE_DIR)/$(NAME)_empty.o
SINGLE_O_FILE = $(OFILE_DIR)/$(NAME)_everything.o
MY_OFILE_LIST = $(OFILE_DIR)/$(NAME).ofileList

set_extra_libtool_flags = \
	ofileList_flags="-filelist $(MY_OFILE_LIST),$(OFILE_DIR)"

ofilelist:
	@(cd $(OFILE_DIR) ; $(OFILE_LIST_TOOL) -removePrefix $(OFILE_DIR)/ \
	   -removePrefix ../ $(NON_SUBPROJ_OFILES) $(SUBPROJ_OFILELISTS) \
	   $(OTHER_OFILES) $(OTHER_GENERATED_OFILES) -o $(NAME).ofileList)

$(PRODUCT): $(PRODUCT_DEPENDS) ofilelist $(PRELINK_DEPENDS)
	@($(set_dynamic_link_flags) ; \
	$(set_extra_libtool_flags) ; \
	$(set_product_root); \
	(cd $(OFILE_DIR) ; $(OFILE_LIST_TOOL) -removePrefix $(OFILE_DIR)/ \
	   -removePrefix ../ $(NON_SUBPROJ_OFILES) $(SUBPROJ_OFILELISTS) \
	   $(OTHER_OFILES) $(OTHER_GENERATED_OFILES) -o $(NAME).ofileList) ; \
	if [ "$(OS_PREFIX)" != "PDO_UNIX_" ] ; then \
	    frameworks=`$(FRAMEWORK_TOOL) $(FRAMEWORKS) $(BUILD_TARGET)` ; \
	fi ; \
	libs="$(LIBS:-lsys_s=)" ; \
	if [ "$(LINK_STYLE)" = "ONE_MODULE" ] ; then \
	      num_ofiles=$(NUMBER_OF_OBJECT_FILES) ; \
       	      if [ "$$num_ofiles" != "       0" \
       	         -a "$$num_ofiles" != "0" ] ; then \
	         if [ "$(PLATFORM_OS)" = "winnt" ] ; then \
                    contents=$$ofileList_flags ;\
		 else \
                    contents="$(OFILES) $(OTHER_OFILES) $(OTHER_GENERATED_OFILES)" ; \
		 fi ; \
	      else \
	         $(ECHO) Warning: No object files for $(NAME). ; \
	         $(RM) -f $(TEMP_C_FILE) ; \
	         $(TOUCH) $(TEMP_C_FILE) ; \
	         $(CC) $(ALL_CFLAGS) -c $(TEMP_C_FILE) -o $(TEMP_O_FILE) ; \
	         $(RM) -f $(TEMP_C_FILE) ; \
	         contents="$(TEMP_O_FILE)" ; \
	       fi ; \
	       cmd="$(CC) $$dynamic_bundle_flags -o $@ $(ALL_CFLAGS) $(ALL_LDFLAGS) \
			$$contents $$frameworks $$libs $(OTHER_LIBS)" ; \
   	       $(ECHO) $$cmd ; $$cmd ; \
	else \
	      cmd="$(LIBTOOL) $$dynamic_libtool_flags \
		$(PLATFORM_SPECIFIC_LIBTOOL_FLAGS) $(OTHER_LIBTOOL_FLAGS) \
		$(ALL_LDFLAGS) $(ALL_FRAMEWORK_CFLAGS) -arch_only $(TARGET_ARCH) \
		-o $(@:.lib=.dll) $$ofileList_flags $$frameworks $$libs \
		$(OTHER_LIBS)" ; \
	      $(ECHO) $$cmd ; $$cmd ; \
        fi)
	

before_install:: $(DSTROOT)$(INSTALLDIR)
	@($(set_product_root) ; \
	cmd="$(CHMOD) -R a+w $(DSTROOT)$(INSTALLDIR)/$(NAME).$$framework_ext || true" ; \
	$(ECHO) $$cmd ; eval $$cmd ; \
	cmd="$(RM) -rf $(DSTROOT)$(INSTALLDIR)/$(NAME).$$framework_ext" ; \
	$(ECHO) $$cmd ; $$cmd)

ifeq ($(PLATFORM_OS)-$(REINSTALLING), winnt-)
install:: all
	      $(MAKE) reinstall_stripped REINSTALLING=YES
else
install:: all before_install $(OTHER_INSTALL_DEPENDS)
	@($(set_should_build) ; \
	if [ "$$should_build" = "yes" ] ; then \
	    $(ECHO) == Making install for $(NAME) == ; \
	    $(set_product_root) ; \
	    $(process_target_archs) ; \
	    $(set_dynamic_flags) ; \
	    $(set_objdir) ; \
	    ofile_dir="$(OBJROOT)/`$(ECHO) $$buildtype`_$$objdir" ; \
	    installed_product="$(DSTROOT)$(INSTALLDIR)/$(NAME).$$framework_ext" ;\
	    $(ECHO) "Copying $(NAME).$$framework_ext" ; \
	    (cd $(SYMROOT); $(TAR) cf - $(NAME).$$framework_ext) | (cd     $(DSTROOT)$(INSTALLDIR); $(TAR) xf -) ; \
	    $(MAKE) installhdrs finalize_install \
		"DSTROOT = $(DSTROOT)" \
		"SRCROOT = $(SRCROOT)" \
	       	"OBJROOT = $(OBJROOT)" \
		"SYMROOT = $(SYMROOT)" \
		"SYM_DIR = $(SYMROOT)/$(DERIVED_SRC_DIR_NAME)" \
		"DEVROOT = $(DEVROOT)" \
		"INSTALLDIR = $(INSTALLDIR)" \
		"PRODUCT_ROOT = $(DSTROOT)$(INSTALLDIR)/$$product_root" \
		"PRODUCT = $(DSTROOT)$(INSTALLDIR)/$$product_root/$(NAME)" \
		"OFILE_DIR = $$ofile_dir" \
		"BUILD_TYPE_CFLAGS = $(framework_target_CFLAGS) $$dynamic_cflags" \
		"MAKEFILEDIR = $(MAKEFILEDIR)" \
		"RC_CFLAGS = $$arch_cflags" \
		"RC_ARCHS = $$archs" ; \
	    $(CHMOD) -R a-w $$installed_product || true ; \
	    $(CHOWN) -R $(INSTALL_AS_USER) $$installed_product || true ; \
	    $(CHGRP) -R $(INSTALL_AS_GROUP) $$installed_product || true ; \
	fi)
endif

strip_myself::
	@($(set_product_root) ; \
       	product_root="$(PRODUCT_ROOT)" ; \
	product="$(PRODUCT_ROOT)/$(NAME)$(BUNDLE_BINARY_EXT)" ; \
	$(set_should_build) ; \
	if [ "$$should_build" = "yes" ] ; then \
	   if [ ! -f $$product ] ; then \
       	        product_root="$(PRODUCT_ROOT)/$(NAME).$$framework_ext" ; \
       	        product="$$product_root/$(NAME)$(BUNDLE_BINARY_EXT)" ; \
	   fi ; \
	   $(MAKE) strip_bundle_binary $(finalize_install_exported_vars) \
				       "PRODUCT_ROOT = $$product_root" \
				       "PRODUCT = $$product" ; \
	   product="$$product_root)/$(NAME)$(DEBUG_BUILD_TYPE_SUFFIX)$(BUNDLE_BINARY_EXT)" ; \
	   if [ -f $$product ] ; then \
	       $(MAKE) strip_bundle_binary $(finalize_install_exported_vars) \
				       "PRODUCT_ROOT = $$product_root" \
				       "PRODUCT = $$product" ; \
	   fi ; \
	   product="$$product_root/$(NAME)$(PROFILE_BUILD_TYPE_SUFFIX)$(BUNDLE_BINARY_EXT)" ; \
	   if [ -f $$product ] ; then \
	       $(MAKE) strip_bundle_binary $(finalize_install_exported_vars) \
				       "PRODUCT_ROOT = $$product_root" \
				       "PRODUCT = $$product" ; \
	   fi ; \
	fi)

strip_bundle_binary::
	@(if [ "$(BUILD_OFILES_LIST_ONLY)" != "YES" \
	     -a "$(STRIP_ON_INSTALL)" = "YES" ] ; then \
		if [ "$(CODE_GEN_STYLE)" = "DYNAMIC" ] ; then \
			strip_opts="$(DYNAMIC_STRIP_OPTS)" ; \
		else \
			strip_opts="$(LIBRARY_STRIP_OPTS)" ; \
		fi ; \
		cmd="$(STRIP) $$strip_opts $(PRODUCT)" ; \
	       	$(ECHO) $$cmd ; $$cmd ; \
	fi ; \
	$(CHMOD) -R ugo-w $(PRODUCT) || true ; \
	$(RM) -f $(PRODUCT_ROOT)/$(CHANGES_FILE_BASE).* ; \
	for arch in $(RC_ARCHS) ; do \
	    cmd="$(RM) -f $(PRODUCT_ROOT)/$(NAME)*.$$arch$(BUNDLE_BINARY_EXT) $(PRODUCT_ROOT)/$(NAME)*.$$arch$(LIBRARY_EXT)" ;\
	    $(ECHO) $$cmd ; $$cmd ; \
	done)