view Xcode/package @ 2978:4c9130d66e2c

Added a few things to the TODO list. Unit testing is becoming more and more important the more features are added and the more combinations of factors there are to test.
author Sam Lantinga <slouken@libsdl.org>
date Sat, 03 Jan 2009 07:23:11 +0000
parents d63e9f5944ae
children
line wrap: on
line source

#! /bin/csh -ef

set prog = `/usr/bin/basename $0`
set usage = "Usage: $prog [-f] root-dir info-file [tiff-file] [-d dest-dir] [-r resource-dir] [-traditional | -gnutar]"
set noglob

if (-x /usr/bin/mkbom) then
    set mkbom=/usr/bin/mkbom
    set lsbom=/usr/bin/lsbom
else
    set mkbom=/usr/etc/mkbom
    set lsbom=/usr/etc/lsbom
endif

if (-x /usr/bin/awk) then
    set awk=/usr/bin/awk
else
    set awk=/bin/awk
endif

set gnutar=/usr/bin/gnutar
set tar=/usr/bin/tar
set pax=/bin/pax

# gather parameters
if ($#argv == 0) then
    echo $usage
    exit(1)
endif

while ( $#argv > 0 )
    switch ( $argv[1] )
	case -d:
	    if ( $?destDir ) then
		echo ${prog}: dest-dir parameter already set to ${destDir}.
		echo $usage
		exit(1)
	    else if ( $#argv < 2 ) then
		echo ${prog}: -d option requires destination directory.
		echo $usage
		exit(1)
	    else
		set destDir = $argv[2]
		shift; shift
		breaksw
	    endif
	case -f:
	    if ( $?rootDir ) then
		echo ${prog}: root-dir parameter already set to ${rootDir}.
		echo $usage
		exit(1)
	    else if ( $#argv < 2 ) then
		echo ${prog}: -f option requires package root directory.
		echo $usage
		exit(1)
	    else
		set rootDir = $argv[2]
		set fflag
		shift; shift
		breaksw
	    endif
	case -r:
	    if ( $?resDir ) then
		echo ${prog}: resource-dir parameter already set to ${resDir}.
		echo $usage
		exit(1)
	    else if ( $#argv < 2 ) then
		echo ${prog}: -r option requires package resource directory.
		echo $usage
		exit(1)
	    else
		set resDir = $argv[2]
		shift; shift
		breaksw
	    endif
	case -traditional:
	    set usetar
            unset usegnutar
	    unset usepax
	    breaksw
        case -gnutar:
	    set usegnutar
            unset usepax
	    unset usetar
	case -B:
	    # We got long file names, better use bigtar instead
	    #set archiver = /NextAdmin/Installer.app/Resources/installer_bigtar
	    echo 2>&1 ${prog}: -B flag is no longer relevant.
	    shift
	    breaksw
	case -*:
	    echo ${prog}: Unknown option: $argv[1]
	    echo $usage
	    exit(1)
	case *.info:
	    if ( $?info ) then
		echo ${prog}: info-file parameter already set to ${info}.
		echo $usage
		exit(1)
	    else
		set info = "$argv[1]"
		shift
		breaksw
	    endif
	case *.tiff:
	    if ( $?tiff ) then
		echo ${prog}: tiff-file parameter already set to ${tiff}.
		echo $usage
		exit(1)
	    else
		set tiff = "$argv[1]"
		shift
		breaksw
	    endif
	default:
	    if ( $?rootDir ) then
		echo ${prog}: unrecognized parameter: $argv[1]
		echo $usage
		exit(1)
	    else
		set rootDir = "$argv[1]"
		shift
		breaksw
	    endif
    endsw
end

# check for mandatory parameters
if ( ! $?rootDir ) then
    echo ${prog}: missing root-dir parameter.
    echo $usage
    exit(1)
else if ( ! $?info) then
    echo ${prog}: missing info-file parameter.
    echo $usage
    exit(1)
endif

# destDir gets default value if unset on command line
if ( $?destDir ) then
    /bin/mkdir -p $destDir
else
    set destDir = .
endif

# derive the root name for the package from the root name of the info file
set root = `/usr/bin/basename $info .info`

# create package directory
set pkg = ${destDir}/${root}.pkg
echo Generating Installer package $pkg ...
if ( -e $pkg ) /bin/rm -rf $pkg
/bin/mkdir -p -m 755 $pkg

# (gnu)tar/pax and compress root directory to package archive
echo -n "	creating package archive ... "
if ( $?fflag ) then
    set pkgTop = ${rootDir:t}
    set parent = ${rootDir:h}
    if ( "$parent" == "$pkgTop" ) set parent = "."
else
    set parent = $rootDir
    set pkgTop = .    
endif
if ( $?usetar ) then
    set pkgArchive = $pkg/$root.tar.Z
    (cd $parent; $tar -w $pkgTop) | /usr/bin/compress -f -c > $pkgArchive
else if ( $?usegnutar ) then
    set pkgArchive = $pkg/$root.tar.gz
    (cd $parent; $gnutar zcf $pkgArchive $pkgTop)
else
    set pkgArchive = $pkg/$root.pax.gz
    (cd $parent; $pax -w -z -x cpio $pkgTop) > $pkgArchive
endif
/bin/chmod 444 $pkgArchive
echo done.

# copy info file to package
set pkgInfo = $pkg/$root.info
echo -n "	copying ${info:t} ... "
/bin/cp $info $pkgInfo
/bin/chmod 444 $pkgInfo
echo done.

# copy tiff file to package
if ( $?tiff ) then
    set pkgTiff = $pkg/$root.tiff
    echo -n "	copying ${tiff:t} ... "
    /bin/cp $tiff $pkgTiff
    /bin/chmod 444 $pkgTiff
    echo done.
endif

# copy resources to package
if ( $?resDir ) then
    echo -n "	copying ${resDir:t} ... "

    # don't want to see push/pop output
    pushd $resDir > /dev/null
	# get lists of resources. We'll want to change
	# permissions on just these things later.
        set directoriesInResDir = `find . -type d`
        set filesInResDir = `find . -type f`
    popd > /dev/null

    # copy the resource directory contents into the package directory
    foreach resFile (`ls $resDir`)
	cp -r $resDir/$resFile $pkg
    end

    pushd $pkg > /dev/null
	# Change all directories to +r+x, except the package
	# directory itself
        foreach resFileItem ($directoriesInResDir)
            if ( $resFileItem != "." ) then
                chmod 555 $resFileItem
            endif
        end
	# change all flat files to read only
        foreach resFileItem ($filesInResDir)
            chmod 444 $resFileItem
        end
    popd > /dev/null

    echo done.
endif

# generate bom file
set pkgBom = $pkg/$root.bom
echo -n "	generating bom file ... "
/bin/rm -f $pkgBom
if ( $?fflag ) then
    $mkbom $parent $pkgBom >& /dev/null
else
    $mkbom $rootDir $pkgBom >& /dev/null
endif
/bin/chmod 444 $pkgArchive
echo done.
	
# generate sizes file
set pkgSizes = $pkg/$root.sizes
echo -n "	generating sizes file ... "

# compute number of files in package
set numFiles = `$lsbom -s $pkgBom | /usr/bin/wc -l`

# compute package size when compressed
@ compressedSize = `/usr/bin/du -k -s $pkg | $awk '{print $1}'`
@ compressedSize += 3		# add 1KB each for sizes, location, status files

@ infoSize = `/bin/ls -s $pkgInfo | $awk '{print $1}'`
@ bomSize = `/bin/ls -s $pkgBom | $awk '{print $1}'`
if ( $?tiff ) then
    @ tiffSize = `/bin/ls -s $pkgTiff | $awk '{print $1}'`
else
    @ tiffSize = 0
endif 

@ installedSize = `/usr/bin/du -k -s $rootDir | $awk '{print $1}'`
@ installedSize += $infoSize + $bomSize + $tiffSize + 3

# echo size parameters to sizes file
echo NumFiles $numFiles             >  $pkgSizes
echo InstalledSize $installedSize   >> $pkgSizes
echo CompressedSize $compressedSize >> $pkgSizes
echo done.
echo " ... finished generating $pkg."

exit(0)

# end package