1 #! /bin/bash 2 3 # Setup paths 4 WORKDIR="${TMPDIR:-/tmp}/starkit2exe-$$${RANDOM}${RANDOM}${RANDOM}${RANDOM}" 5 STARTDIR="$(readlink -f "$(pwd)")" 6 7 # Process script arguments and expand to fully qualified names where appropriate 8 OURSCP="$(readlink -f "$0" 2>/dev/null)" 9 OURSCPDIR="$(dirname "${OURSCP}" 2>/dev/null)" 10 FINDTCLKITSCP="${OURSCPDIR}/support/find-tclkit" 11 TCLKIT=$("${FINDTCLKITSCP}") 12 SDXPATH="${OURSCPDIR}/support/sdx-1nrl.kit" 13 14 NOTK=0 15 if [ "$1" = "--notk" ]; then 16 shift 17 NOTK=1 18 fi 19 20 SRCSTARKIT="$(readlink -f "$1" 2>/dev/null)" 21 OUTPUT="$2" 22 DESTTCLKIT="$3" 23 if [ -z "${TCLKIT}" ]; then 24 echo 'Unable to locate a suitable Tclkit' >&2 25 exit 1 26 fi 27 if [ -f "${SRCSTARKIT}" -o -d "${SRCSTARKIT}" ]; then 28 true 29 else 30 echo 'SRCSTARKIT is not a regular file or directory' >&2 31 SRCSTARKIT="" 32 fi 33 if [ -z "${SRCSTARKIT}" -o -z "${OUTPUT}" ]; then 34 echo 'Usage: starkit2exe [--notk] <srckit> <output> [<dest_tclkit>]' >&2 35 36 exit 1 37 fi 38 39 if [ -n "${DESTTCLKIT}" ]; then 40 if [ ! -f "${DESTTCLKIT}" ]; then 41 if [ "${NOTK}" = "1" ]; then 42 DESTTCLKIT=$("${FINDTCLKITSCP}" --notk "${DESTTCLKIT}") 43 else 44 DESTTCLKIT=$("${FINDTCLKITSCP}" "${DESTTCLKIT}") 45 fi 46 if [ -z "${DESTTCLKIT}" ]; then 47 echo "Unable to find Tclkit matching requested pattern" >&2 48 exit 1 49 fi 50 fi 51 DESTTCLKIT="$(readlink -f "${DESTTCLKIT}")" 52 fi 53 54 if [ -z "${DESTTCLKIT}" ]; then 55 echo "Using Tclkit: $(basename "${TCLKIT}" 2>/dev/null)" 56 else 57 echo "Using Tclkit: $(basename "${TCLKIT}" 2>/dev/null), generating with $(basename "${DESTTCLKIT}" 2>/dev/null)" 58 fi 59 60 # Abort on failure of any command 61 set -e 62 63 # Create working area 64 mkdir -p "${WORKDIR}" 65 chmod 700 "${WORKDIR}" 66 cd "${WORKDIR}" 67 68 # Extract starkit and rename to make things easier 69 if [ -d "${SRCSTARKIT}" ]; then 70 cp -r "${SRCSTARKIT}" output.vfs 71 else 72 "${TCLKIT}" "${SDXPATH}" unwrap "${SRCSTARKIT}" 73 mv *.vfs output.vfs 74 fi 75 76 # Create temporary Tclkit if needed 77 if [ -n "${DESTTCLKIT}" ]; then 78 if [ "$(readlink -f "${TCLKIT}")" = "$(readlink -f "${DESTTCLKIT}")" ]; then 79 DESTTCLKIT="" 80 fi 81 fi 82 if [ -z "${DESTTCLKIT}" ]; then 83 DESTTCLKIT="${WORKDIR}/copykit" 84 cp "${TCLKIT}" "${DESTTCLKIT}" 85 fi 86 87 # Determine platform of destination starpack 88 DESTPLATFORM_FILE=$(file "${DESTTCLKIT}" | sed 's@^[^:]*: *@@') 89 DESTOS="Unknown" 90 case "${DESTPLATFORM_FILE}" in 91 Mach-O\ *|compiled\ Java\ class\ data,\ version\ 2.0) 92 DESTOS="MacOS" 93 ;; 94 ELF\ 32-bit\ *\ version\ 1\ \(SYSV\),\ *) 95 DESTOS="Linux" 96 ;; 97 ELF\ 32-bit\ *\ version\ 1\ \(FreeBSD\),\ *) 98 DESTOS="FreeBSD" 99 ;; 100 MS-DOS\ executable\ *|PE32+\ executable\ *) 101 DESTOS="Windows" 102 ;; 103 esac 104 105 # Create starpack 106 if unzip -l "${DESTTCLKIT}" 2>&1 | grep 'boot\.tcl' >/dev/null; then 107 cp "${DESTTCLKIT}" output.zip 108 109 ( 110 cd output.vfs 111 unzip ../output.zip >/dev/null 2>/dev/null 112 ) || true 113 114 strip output.zip 115 116 ( 117 cd output.vfs 118 zip -r ../vfs.zip * >/dev/null 2>/dev/null 119 ) 120 121 cat output.zip vfs.zip > output 122 chmod +x output 123 else 124 "${TCLKIT}" "${SDXPATH}" wrap output -runtime "${DESTTCLKIT}" 125 fi 126 127 # Enable platform-specific fix-ups (post-wrap) 128 case "${DESTOS}" in 129 MacOS) 130 if [ "${NOTK}" = "0" ]; then 131 APPNAME=$(basename "${OUTPUT}" .zip) 132 mkdir -p "${APPNAME}.app/Contents/MacOS" 133 mv output "${APPNAME}.app/Contents/MacOS/${APPNAME}" 134 zip -r output.zip "${APPNAME}.app" 135 mv output.zip output 136 fi 137 ;; 138 esac 139 140 # Copy starpack to output 141 STARPACKFILE="$(readlink -f output 2>/dev/null)" 142 if [ -z "${STARPACKFILE}" ]; then 143 echo 'Failed to create starpack, leaving temporary directory intact for inspection.' >&2 144 exit 1 145 fi 146 cd "${STARTDIR}" 147 cp -r "${STARPACKFILE}" "${OUTPUT}" 148 149 # Cleanup 150 rm -rf "${WORKDIR}" |