@@ -28,60 +28,37 @@ ( cp -r 'buildsrc' 'build' cd "${BUILDDIR}" || exit 1 + + # Fix up archives that Tcl gets wrong + for archive in ../../../tcl/inst/lib/dde*/tcldde*.a ../../../tcl/inst/lib/reg*/tclreg*.a; do + if [ ! -f "${archive}" ]; then + continue + fi + + rm -rf __TEMP__ + ( + mkdir __TEMP__ || exit 1 + cd __TEMP__ + + ## Patch archive name + archive="../${archive}" + + "${AR:-ar}" x "${archive}" || exit 1 + + rm -f "${archive}" + + "${AR:-ar}" cr "${archive}" *.o || exit 1 + "${RANLIB:-ranlib}" "${archive}" || true + ) + done # Cleanup, just incase the incoming directory was not pre-cleaned ${MAKE:-make} distclean >/dev/null 2>/dev/null - - # Figure out if zlib compiled (if not, the system zlib will be used and we - # will need to have that present) - ZLIBDIR="$(cd "${OTHERPKGSDIR}/zlib/inst" 2>/dev/null && pwd)" - export ZLIBDIR - if [ -z "${ZLIBDIR}" -o ! -f "${ZLIBDIR}/lib/libz.a" ]; then - unset ZLIBDIR - fi - - # Copy user specified kit.rc and kit.ico in to build directory, if found - if [ -f "${OTHERPKGSDIR}/kit.rc" ]; then - cp "${OTHERPKGSDIR}/kit.rc" "${BUILDDIR}" - fi - if [ -f "${OTHERPKGSDIR}/kit.ico" ]; then - cp "${OTHERPKGSDIR}/kit.ico" "${BUILDDIR}" - fi - - # Include extra objects as required - ## Initialize list of extra objects - EXTRA_OBJS="" - - ## Tk Resources (needed for Win32 support) - TKDIR="$(cd "${OTHERPKGSDIR}/tk/inst" && pwd)" - TKRSRC="${TKDIR}/lib/tkbase.res.o" - if [ -n "${TKDIR}" -a -f "${TKRSRC}" ]; then - EXTRA_OBJS="${EXTRA_OBJS} ${TKRSRC}" - fi - - ## Export to the environment, to be picked up by the "configure" script - export EXTRA_OBJS - - # Compile Kitsh - if [ -z "${ZLIBDIR}" ]; then - echo "Running: ./configure --with-tcl=\"${TCLCONFIGDIR}\" ${CONFIGUREEXTRA}" - - ./configure --with-tcl="${TCLCONFIGDIR}" ${CONFIGUREEXTRA} - else - echo "Running: ./configure --with-tcl=\"${TCLCONFIGDIR}\" --with-zlib=\"${ZLIBDIR}\" ${CONFIGUREEXTRA}" - - ./configure --with-tcl="${TCLCONFIGDIR}" --with-zlib="${ZLIBDIR}" ${CONFIGUREEXTRA} - fi - - echo "Running: ${MAKE:-make}" - ${MAKE:-make} || exit 1 - - # Strip the kit of all symbols, if possible - "${STRIP:-strip}" kit >/dev/null 2>/dev/null + rm -rf 'starpack.vfs' # Create VFS directory mkdir "starpack.vfs" mkdir "starpack.vfs/lib" @@ -91,27 +68,142 @@ ## Rename the "vfs" package directory to what "boot.tcl" expects mv 'starpack.vfs/lib'/vfs* 'starpack.vfs/lib/vfs' ## Install "boot.tcl" cp 'boot.tcl' 'starpack.vfs/' + + # Figure out if zlib compiled (if not, the system zlib will be used and we + # will need to have that present) + ZLIBDIR="$(cd "${OTHERPKGSDIR}/zlib/inst" 2>/dev/null && pwd)" + export ZLIBDIR + if [ -z "${ZLIBDIR}" -o ! -f "${ZLIBDIR}/lib/libz.a" ]; then + unset ZLIBDIR + fi + + # Copy user specified kit.rc and kit.ico in to build directory, if found + cp "${KITCREATOR_ICON}" "${BUILDDIR}/kit.ico" + cp "${KITCREATOR_RC}" "${BUILDDIR}/kit.rc" + + # Include extra objects as required + ## Initialize list of extra objects + EXTRA_OBJS="" + export EXTRA_OBJS + + ## Tk Resources (needed for Win32 support) -- remove kit-found resources to prevent the symbols from being in conflict + TKDIR="$(cd "${OTHERPKGSDIR}/tk/inst" && pwd)" + TKRSRC="${TKDIR}/lib/tkbase.res.o" + if [ -n "${TKDIR}" -a -f "${TKRSRC}" ]; then + EXTRA_OBJS="${EXTRA_OBJS} ${TKRSRC}" + + echo ' *** Removing "kit.rc" since we have Tk with its own resource file' + + rm -f "${BUILDDIR}/kit.rc" + fi + + # Determine if target is KitDLL or KitSH + if [ "${KITTARGET}" = "kitdll" ]; then + CONFIGUREEXTRA="${CONFIGUREEXTRA} --enable-kitdll" + fi + + # Compile Kit + if [ -z "${ZLIBDIR}" ]; then + echo "Running: ./configure --with-tcl=\"${TCLCONFIGDIR}\" ${CONFIGUREEXTRA}" + + ./configure --with-tcl="${TCLCONFIGDIR}" ${CONFIGUREEXTRA} + else + echo "Running: ./configure --with-tcl=\"${TCLCONFIGDIR}\" --with-zlib=\"${ZLIBDIR}\" ${CONFIGUREEXTRA}" + + ./configure --with-tcl="${TCLCONFIGDIR}" --with-zlib="${ZLIBDIR}" ${CONFIGUREEXTRA} + fi + + echo "Running: ${MAKE:-make} TCLSH_NATIVE=\"${TCLSH_NATIVE}\"" + ${MAKE:-make} TCLSH_NATIVE="${TCLSH_NATIVE}" || exit 1 + + # Strip the kit of all symbols, if possible + "${STRIP:-strip}" kit >/dev/null 2>/dev/null + "${STRIP:-strip}" -g libtclkit* >/dev/null 2>/dev/null + + # Fix up Win32 DLL names + ## .DLL.A -> .LIB + for file in libtclkit*.dll.a; do + if [ ! -f "${file}" ]; then + continue + fi + + newfile="$(basename "${file}" .dll.a).lib" + mv "${file}" "${newfile}" + done + + ## .DLL.DEF -> .DEF + for file in libtclkit*.dll.def; do + if [ ! -f "${file}" ]; then + continue + fi + + newfile="$(basename "${file}" .dll.def).def" + mv "${file}" "${newfile}" + done + + # Determine name of created kit + KITTARGET_NAME='__error__' + if [ "${KITTARGET}" = "kitdll" ]; then + ## Find the library created + for chkkittarget in libtclkit*.*; do + if [ ! -f "${chkkittarget}" ]; then + continue + fi + + if echo "${chkkittarget}" | egrep '\.(lib|def|a)$'; then + continue + fi + + KITTARGET_NAME="${chkkittarget}" + + break + done + + ## Also create an executable named "kit" so that we can run it later + ${MAKE:-make} tclsh + mv tclsh kit + else + ## The executable is always named "kit" + KITTARGET_NAME='kit' + fi + export KITTARGET_NAME + + if [ "x${KITTARGET_NAME}" = 'x__error__' ]; then + echo "Failed to locate kit target!" >&2 + + exit 1 + fi # Intall VFS onto kit ## Determine if we have a Tclkit to do this work TCLKIT="${TCLKIT:-tclkit}" if echo 'exit 0' | "${TCLKIT}" >/dev/null 2>/dev/null; then ## Install using existing Tclkit ### Call installer - "${TCLKIT}" installvfs.tcl kit starpack.vfs "${ENABLECOMPRESSION}" + echo "Running: \"${TCLKIT}\" installvfs.tcl \"${KITTARGET_NAME}\" starpack.vfs \"${ENABLECOMPRESSION}\"" + "${TCLKIT}" installvfs.tcl "${KITTARGET_NAME}" starpack.vfs "${ENABLECOMPRESSION}" || exit 1 else ## Bootstrap (cannot cross-compile) ### Call installer cp kit runkit - echo "set argv [list kit starpack.vfs {${ENABLECOMPRESSION}}]" > setup.tcl + echo "set argv [list {${KITTARGET_NAME}} starpack.vfs {${ENABLECOMPRESSION}}]" > setup.tcl echo 'if {[catch { clock seconds }]} { proc clock args { return 0 } }' >> setup.tcl echo 'source installvfs.tcl' >> setup.tcl - echo | ./runkit + + echo 'Running: echo | ./runkit' + echo | ./runkit setup.tcl || exit 1 + fi + + # Cleanup + if [ "${KITTARGET}" = "kitdll" ]; then + ## Remove built interpreters if we are building KitDLL -- + ## they're just tiny stubs anyway + rm -f kit runkit fi exit 0 ) || exit 1 exit 0