subproj.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@
##
#
# subproj.make
#
# Variable definitions and rules for building component subprojects.  A
# component subproject contains code and resources which are needed by the
# parent project, but which have been split off to simplify project management.
#
# PUBLIC TARGETS
#    subproj: synonymous with all
#
# IMPORTED VARIABLES
#    none
#
# EXPORTED VARIABLES
#    none
#

.PHONY: subproj all
subproj: all

# Unlike most project types, the subproject can have two different
# products.  On platforms which support the merging of .o files,
# we will generate a .o file which contains the previous .o files.
# On platforms where this is not supported we will generate an
# ofilelist.  We must specify PRODUCT before we include common.make,
# but will not know which product we are building until after we
# have included common.make.  The solution to the dilemma is to
# define PRODUCT to be a phony target which will build the actual
# product

.PHONY: subproject_product
PRODUCTS = subproject_product
BEFORE_BUILD += create-help-file

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

O_PRODUCT = $(OFILE_DIR)/../$(SUBDIRECTORY_NAME)_subproj.o
OFILELIST_PRODUCT = $(OFILE_DIR)/../$(SUBDIRECTORY_NAME)_subproj.ofileList
ifeq "YES" "$(LINK_SUBPROJECTS)"
ACTUAL_PRODUCT = $(O_PRODUCT)
else
ACTUAL_PRODUCT = $(OFILELIST_PRODUCT)
endif

subproject_product: $(ACTUAL_PRODUCT)

# unlike other project types, a subproject must
# generate its result even if the build is
# suppressed or if there are no source files

# also unlike other project types, a subproject
# is not built from all $(LOADABLES), just from
# $(OFILES) and $(OFILELISTS)

ifeq "YES" "$(SUPPRESS_BUILD)"
ARTIFICIAL_SUBPROJECT = YES
OFILELISTS = 
endif
ifeq "" "$(filter %.o, $(OFILES))"
ARTIFICIAL_SUBPROJECT = YES
endif

ifeq "YES" "$(ARTIFICIAL_SUBPROJECT)"

build: $(ACTUAL_PRODUCT)

$(O_PRODUCT): $(OFILE_DIR) $(SFILE_DIR)/subproj_scratch_file.c
	$(CC) -c $(SFILE_DIR)/subproj_scratch_file.c -o $(O_PRODUCT)

$(SFILE_DIR)/subproj_scratch_file.c: $(SFILE_DIR)
	$(ECHO) static int x';' > $*.c

$(OFILELIST_PRODUCT): $(OFILE_DIR) $(SFILE_DIR)/subproj_scratch_file.c $(OFILELISTS)
	$(CC) -c $(SFILE_DIR)/subproj_scratch_file.c -o $(OFILE_DIR)/subproj_scratch_file.o
	$(OFILE_LIST_TOOL) $(OFILE_DIR)/subproj_scratch_file.o $(OFILELISTS) -o $(OFILELIST_PRODUCT)

else

$(O_PRODUCT): $(DEPENDENCIES) Makefile
	$(CC) $(ARCHITECTURE_FLAGS) $(ALL_CFLAGS) -nostdlib $(OFILES) $(OFILELISTS) -r -o $(O_PRODUCT)
$(OFILELIST_PRODUCT): $(DEPENDENCIES) Makefile
	$(OFILE_LIST_TOOL) $(OFILES) $(OFILELISTS) -o $(OFILELIST_PRODUCT)

endif

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