@@ -24,23 +24,76 @@ mkdir 'build' 'out' 'inst' || exit 1 if [ ! -f "${SRC}" ]; then mkdir 'src' >/dev/null 2>/dev/null + use_fossil='0' if echo "${TCLVERS}" | grep '^cvs_' >/dev/null; then - CVSTAG=$(echo "${TCLVERS}" | sed 's/^cvs_//g') - export CVSTAG + use_fossil='1' + + FOSSILTAG=$(echo "${TCLVERS}" | sed 's/^cvs_//g') + if [ "${FOSSILTAG}" = "HEAD" ]; then + FOSSILTAG="trunk" + fi + elif echo "${TCLVERS}" | grep '^fossil_' >/dev/null; then + use_fossil='1' + + FOSSILTAG=$(echo "${TCLVERS}" | sed 's/^fossil_//g') + fi + export FOSSILTAG + if [ "${use_fossil}" = "1" ]; then ( cd src || exit 1 - cvs -z3 -d:pserver:anonymous@tcl.cvs.sourceforge.net:/cvsroot/tcl co -r "${CVSTAG}" -P tcl + workdir="tmp-$$${RANDOM}${RANDOM}${RANDOM}" + rm -rf "${workdir}" + + mkdir "${workdir}" || exit 1 + cd "${workdir}" || exit 1 + + # Handle Tcl first, since it will be used to base other packages on + wget -O "tmp-tcl.tar.gz" "http://core.tcl.tk/tcl/tarball/tcl-fossil.tar.gz?uuid=${FOSSILTAG}" || rm -f 'tmp-tcl.tar.gz' + gzip -dc 'tmp-tcl.tar.gz' | tar -xf - + mv "tcl-fossil" "tcl${TCLVERS}" + + # Determine date of this Tcl release and use that date for all other dependent packages + ## Unless the release we are talking about is "trunk", in which case we use that everywhere + if [ "${FOSSILTAG}" = "trunk" ]; then + FOSSILDATE="${FOSSILTAG}" + else + FOSSILDATE="$(echo 'cd "tcl'"${TCLVERS}"'"; set file [lindex [glob *] 0]; file stat $file finfo; set date $finfo(mtime); set date [expr {$date + 1}]; puts [clock format $date -format {%Y-%m-%dT%H:%M:%S}]' | TZ='UTC' "${TCLSH_NATIVE}")" + fi + + ## If we are unable to determine the modification date, fall-back to the tag and hope for the best + if [ -z "${FOSSILDATE}" ]; then + FOSSILDATE="${FOSSILTAG}" + fi + + # Handle other packages + wget -O "tmp-itcl.tar.gz" "http://core.tcl.tk/itcl/tarball/itcl-fossil.tar.gz?uuid=${FOSSILDATE}" || rm -f 'tmp-itcl.tar.gz' + wget -O "tmp-thread.tar.gz" "http://core.tcl.tk/thread/tarball/thread-fossil.tar.gz?uuid=${FOSSILDATE}" || rm -f "tmp-thread.tar.gz" + wget -O "tmp-tclconfig.tar.gz" "http://core.tcl.tk/tclconfig/tarball/tclconfig-fossil.tar.gz?uuid=${FOSSILDATE}" || rm -f "tmp-tclconfig.tar.gz" + + gzip -dc "tmp-itcl.tar.gz" | tar -xf - + gzip -dc "tmp-thread.tar.gz" | tar -xf - + gzip -dc "tmp-tclconfig.tar.gz" | tar -xf - + + mkdir -p "tcl${TCLVERS}/pkgs/" >/dev/null 2>/dev/null + mv "itcl-fossil" "tcl${TCLVERS}/pkgs/itcl" + mv "thread-fossil" "tcl${TCLVERS}/pkgs/thread" + cp -r "tclconfig-fossil" "tcl${TCLVERS}/pkgs/itcl/tclconfig" + cp -r "tclconfig-fossil" "tcl${TCLVERS}/pkgs/thread/tclconfig" + mv "tclconfig-fossil" "tcl${TCLVERS}/tclconfig" + + tar -cf - "tcl${TCLVERS}" | gzip -c > "../../${SRC}" + echo "${FOSSILDATE}" > "../../${SRC}.date" - mv tcl "tcl${TCLVERS}" + cd .. - tar -cf - "tcl${TCLVERS}" | gzip -c > "../${SRC}" - ) + rm -rf "${workdir}" + ) || exit 1 else rm -f "${SRC}.tmp" wget -O "${SRC}.tmp" "${SRCURL}" || exit 1 mv "${SRC}.tmp" "${SRC}" fi @@ -77,21 +130,10 @@ . "${patchscript}" ) fi done - # Patch Win32 builds to always provide DllMain if we are building KitDLL - if [ "${KITTARGET}" = "kitdll" ]; then - ## DllMain is needed when building KitDLL - for filetopatch in win/tclWin32Dll.c win/tclWinInit.c; do - echo "Undefining STATIC_BUILD in \"${filetopatch}\"" - - sed 's@STATIC_BUILD@NEVER_STATIC_BUILD@g' "${filetopatch}" > "${filetopatch}.new" && cat "${filetopatch}.new" > "${filetopatch}" - rm -f "${filetopatch}.new" - done - fi - for dir in unix win macosx __fail__; do if [ "${dir}" = "__fail__" ]; then # If we haven't figured out how to build it, reject. exit 1 @@ -111,32 +153,32 @@ echo "Running: ${MAKE:-make} install" ${MAKE:-make} install || ( # Work with Tcl 8.6.x's TCLSH_NATIVE solution for # cross-compile installs - echo "Running: ${MAKE:-make} install TCLSH_NATIVE=\"${TCLKIT:-tclkit}\"" - ${MAKE:-make} install TCLSH_NATIVE="${TCLKIT:-tclkit}" + echo "Running: ${MAKE:-make} install TCLSH_NATIVE=\"${TCLSH_NATIVE}\"" + ${MAKE:-make} install TCLSH_NATIVE="${TCLSH_NATIVE}" ) || ( # Make install can fail if cross-compiling using Tcl 8.5.x # because the Makefile calls "$(TCLSH)". We can't simply # redefine TCLSH because it also uses TCLSH as a build target sed 's@^$(TCLSH)@blah@' Makefile > Makefile.new cat Makefile.new > Makefile rm -f Makefile.new - echo "Running: ${MAKE:-make} install TCLSH=\"../../../../../../../../../../../../../../../../../$(which "${TCLKIT:-tclkit}")\"" - ${MAKE:-make} install TCLSH="../../../../../../../../../../../../../../../../../$(which "${TCLKIT:-tclkit}")" + echo "Running: ${MAKE:-make} install TCLSH=\"../../../../../../../../../../../../../../../../../$(which "${TCLSH_NATIVE}")\"" + ${MAKE:-make} install TCLSH="../../../../../../../../../../../../../../../../../$(which "${TCLSH_NATIVE}")" ) || ( # Make install can fail if cross-compiling using Tcl 8.5.9 # because the Makefile calls "${TCL_EXE}". We can't simply # redefine TCL_EXE because it also uses TCL_EXE as a build target sed 's@^${TCL_EXE}@blah@' Makefile > Makefile.new cat Makefile.new > Makefile rm -f Makefile.new - echo "Running: ${MAKE:-make} install TCL_EXE=\"../../../../../../../../../../../../../../../../../$(which "${TCLKIT:-tclkit}")\"" - ${MAKE:-make} install TCL_EXE="../../../../../../../../../../../../../../../../../$(which "${TCLKIT:-tclkit}")" + echo "Running: ${MAKE:-make} install TCL_EXE=\"../../../../../../../../../../../../../../../../../$(which "${TCLSH_NATIVE}")\"" + ${MAKE:-make} install TCL_EXE="../../../../../../../../../../../../../../../../../$(which "${TCLSH_NATIVE}")" ) || exit 1 mkdir "${OUTDIR}/lib" || exit 1 cp -r "${INSTDIR}/lib"/* "${OUTDIR}/lib/" rm -rf "${OUTDIR}/lib/pkgconfig"