#!/bin/sh

FORCE="YES"

XCODEBUILD=/usr/bin/xcodebuild
BUILDROOT="$1"

EXTRACOPY=( \
    /usr/lib/dyld \
    /usr/share/icu \
    /System/Library/CoreServices/CharacterSets \
    /Developer/Private \
    /Developer/Tools \
    /usr/bin/xcodebuild \
    /Developer/Makefiles/pbx_jamfiles \
    /Library/Application\ Support/Xcode)

JAMFILES=/Developer/Makefiles/pbx_jamfiles
XCODESETTINGS="/System/Library/PrivateFrameworks/DevToolsCore.framework/Versions/A/Resources/BuildSettings-macosx.plist"
XCODECOMP="/System/Library/PrivateFrameworks/DevToolsCore.framework/Versions/A/Resources/Built-in compilers.pbcompspec"

if [ -z "$BUILDROOT" ]; then
    echo "Usage: $0 /Volumes/DarwinBuild/BuildRoot" 1>&2
    exit 1
fi

mkdir -p "$BUILDROOT"

###
### Recurse through frameworks and libraries looking for dependencies
###
RecurseLibs() {
	echo $1 >> /tmp/installXcode.seen.$$
	otool -L $1 | tail -n +2 | awk '{ print $1 }' > /tmp/installXcode.tmplibs.$$
	cat /tmp/installXcode.tmplibs.$$ >> /tmp/installXcode.libs.$$
	cat /tmp/installXcode.tmplibs.$$ | while read X; do
		if ! grep -q "^$X\$" /tmp/installXcode.seen.$$ ; then
			RecurseLibs $X
		fi
	done
}

RemoveTemps() {
	rm -f /tmp/installXcode.libs.$$
	rm -f /tmp/installXcode.seen.$$
	rm -f /tmp/installXcode.tmplibs.$$
	rm -f /tmp/installXcode.tmpfiles.$$
	rm -f /tmp/installXcode.files.$$
}

AppendExtraFiles() {
    for X in "${EXTRACOPY[@]}"; do
	echo "$X" >> /tmp/installXcode.libs.$$
    done
}

TransformLibs() {
#    set -x
    while read X; do
	NEWX=$(echo $X | sed -n 's/\(.*\.framework\).*/\1/p')
	if [ -n "$NEWX" ]; then
	    # if we're copying a framework binary, copy the entire bundle
	    echo "$NEWX"
	    continue
	fi

	NEWX=$(echo $X | sed -n 's/\([^.]*\)\..*dylib$/\1/p')
	if [ -n "$NEWX" ]; then
	    # if we're copying a dylib, copy associate symlinks and stuff
	    for Y in "$NEWX"*.dylib; do
		echo "$Y"
	    done
	    continue
	fi

	echo "$X"
    done
#    set +x
}

GenerateFileNames() {
    cat /tmp/installXcode.libs.$$ | sort -u | TransformLibs | sort -u | while read X; do
	# echo adding children for "$X"

	# first mkdir parent directories
	PARENT=$(dirname "$X")
	while [ "$PARENT" != "/" -a "$PARENT" != "." ]; do
	    echo ".$PARENT" >> /tmp/installXcode.tmpfiles.$$
	    PARENT=$(dirname "$PARENT")
	done
	find ".$X" \! \( -name \*_debug\* -o -name \*_profile\* -o -path \*/Headers\* -o -path \*/PrivateHeaders\* -o -path \*.dict\* \) >> /tmp/installXcode.tmpfiles.$$
    done
    sort -u /tmp/installXcode.tmpfiles.$$ > /tmp/installXcode.files.$$
}

CopyFiles() {
#    VERBOSECPIO="v"
    VERBOSECPIO=""
    echo -n "Copying Xcode and dependencies ..."
    cpio -o -c < /tmp/installXcode.files.$$ | \
	sed -e 's,/System,/XCD/SY,g' \
	-e 's,/usr/lib,/XCD/lib,g' \
	-e 's,/usr/share/icu,/XCD/share/icu,g' \
	-e 's,/Developer,/XCD/loper,g' | \
    (cd "$BUILDROOT"; cpio -ium${VERBOSECPIO}d )

    find ".$JAMFILES" ".$XCODECOMP" | cpio -o -c | \
	sed -e 's,$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks,/XCD/SY///////Library/PrivateFrameworks,g' \
	-e 's,/Developer/Makefiles/pbx_jamfiles,/XCD/loper/Makefiles/pbx_jamfiles,g' \
	-e 's,/System/Library/PrivateFrameworks/DevToolsCore.framework,/XCD/SY/Library/PrivateFrameworks/DevToolsCore.framework,g' | \
    (cd "$BUILDROOT"; cpio -ium${VERBOSECPIO}d )

    find ".$XCODESETTINGS" | cpio -o -c | \
	sed -e 's,/System/Library/PrivateFrameworks/DevToolsCore.framework,/XCD/SY/Library/PrivateFrameworks/DevToolsCore.framework,g' | \
    (cd "$BUILDROOT"; cpio -ium${VERBOSECPIO}d )

    echo "done"
}



###
### Find all the framework and library dependencies of Xcode build
### For frameworks, copy over all supporting files.
###

pushd / > /dev/null

RemoveTemps
touch /tmp/installXcode.seen.$$
echo Analyzing Xcode dependencies ...
RecurseLibs $XCODEBUILD
AppendExtraFiles
GenerateFileNames
CopyFiles

popd > /dev/null

if [ ! -e "$BUILDROOT/Library/Application Support/Xcode/Specifications/GCC 3.5.xcspec" ];
then
    echo "Generating GCC 3.5.xcspec"
    SRC="$BUILDROOT/Library/Application Support/Xcode/Specifications/GCC 4.0.xcspec"
    if [ ! -e "$SRC" ]; then
	SRC="$BUILDROOT/Library/Application Support/Xcode/Specifications/GCC 4.0.xcplugin/Contents/Resources/GCC 4.0.xcspec"
	if [ ! -e "$SRC" ]; then
	    echo "No template for 3.5 spec" 1>&2
	    exit 1
	fi
    fi
    sed \
	-e 's/4\.0/3.5/g' \
	-e 's/4_0/3_5/g' \
	-e '/DashIFlagAcceptsHeadermaps/d' \
	-e '/SupportsPredictiveCompilation/d' \
	-e '/SupportsSeparateUserHeaderPaths/d' \
	-e '/SupportsSymbolSeparation/d' \
	-e '/SupportsMacOSXMinVersionFlag/d' \
	-e '/SupportsIsysroot/d' \
	-e 's/SupportsHeadermaps = Yes/SupportsHeadermaps = No/' \
	-e '/USE_HEADERMAP/,/}/  s/DefaultValue = YES/DefaultValue = NO/' \
	-e '/USE_HEADER_SYMLINKS/,/}/  s/DefaultValue = NO/DefaultValue = YES/' \
	-e '/Name = GCC_MACOSX_VERSION_MIN/,/},/d' \
	-e '/Name = GCC_ENABLE_SYMBOL_SEPARATION/,/},/d' \
	-e '/Name = GCC_ENABLE_SSE3_EXTENSIONS/,/},/d' \
	-e '/Name = GCC_THREADSAFE_STATICS/,/},/d' \
	-e '/Name = GCC_OBJC_CALL_CXX_CDTORS/,/},/d' \
	-e '/Name = GCC_USE_NASM_FOR_ASM_FILETYPE/,/},/d' \
	-e '/OptionsForSDKPackages/,/};/d' \
	< "$SRC" \
	> "$BUILDROOT/Library/Application Support/Xcode/Specifications/GCC 3.5.xcspec"
    
fi

RemoveTemps
