#
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

# makefile for generating a stable set of bridgesupport files that change timestamp
# only when the bridgesupport data actually changes

FRAMEWORKS_DIR = /System/Library/Frameworks
GBM = /usr/bin/gen_bridge_metadata
GEN_HEADERS = $(addsuffix .headers,$(FRAMEWORKS))
GEN_BRIDGESUPPORT = $(addsuffix .bridgesupport,$(FRAMEWORKS))

%.bridgesupport : %.headers $(FRAMEWORKS_DIR)/%.framework/Headers/*.h
	@echo "generating bridge support for" $<
	if [ -f $(FRAMEWORKS_DIR)/$(<:.headers=.framework)/Resources/BridgeSupport/$(<:.headers=Full.bridgesupport) ] ; \
	  then cp $(FRAMEWORKS_DIR)/$(<:.headers=.framework)/Resources/BridgeSupport/$(<:.headers=Full.bridgesupport) $@ ; \
	  else $(GBM) -F complete --framework $(<:.headers=.framework) -o $@ ; \
	fi
	if cmp -s $@ $(STABLE_GEN_DIR)/$(@:.bridgesupport=Full.bridgesupport) ; \
	  then : ; \
	  else cp $@ $(STABLE_GEN_DIR)/$(@:.bridgesupport=Full.bridgesupport) ; \
	fi

%.headers : $(FRAMEWORKS_DIR)/%.framework/Headers
	@echo linking $<
	ln -s $< $@

$(STABLE_GEN_DIR):
	mkdir -p $(STABLE_GEN_DIR)

$(GEN_BRIDGESUPPORT): $(GEN_HEADERS) $(STABLE_GEN_DIR)

all: $(GEN_BRIDGESUPPORT)
