Найти предварительно скомпилированные или скомпилированные Tcl / Tk Framework для macOS - PullRequest
0 голосов
/ 14 декабря 2018

Я новичок в Tcl / Tk, но мне уже нужно развернуть .app с фреймворками Tcl / Tk в нем (потому что .app должен полагаться на свою собственную версию Tcl / Tk, а не на стандарт MacOSи старый Tcl / Tk).Может кто-нибудь указать мне, где я могу найти предварительно скомпилированные фреймворки или пошаговое руководство о том, как скомпилировать их в macOS?

Полдня поиска не была очень плодотворной в этом отношении.Я предполагаю, что мои потребности совсем не особенные, так как я вижу, что многие .apps поставляют свои собственные Tcl / Tk Frameworks.(PS: мне нужен доступ к этим фреймворкам из Perl, но это не должно иметь никакого значения.)

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Предложенный скрипт завершается с ошибкой в ​​Mojave после компиляции в течение нескольких минут со следующей ошибкой:

ERROR: version conflict for package "Tcl": have 8.5.9, need 8.6-
If running this script from 'make html', set the NATIVE_TCLSH environment
variable to point to an installed tclsh8.6 (or the equivalent tclsh86.exe
on Windows).
make[3]: *** [html-tcl] Error 1
make[2]: *** [install-strip] Error 2
make[1]: *** [install-tcl] Error 2
make: *** [install-deploy] Error 2
tclbuild.sh: line 74: cd: /Users/xl/t/tcl869cp: No such file or directory
tclbuild.sh: line 83: cd: /Users/xl/t/tcl869cp: No such file or directory
tclbuild.sh: line 84: cd: tk8.6.9: No such file or directory
tclbuild.sh: line 103: cd: /Users/xl/t/tcl869cp: No such file or directory

У меня есть последние ресурсы Tcl / Tk (8.6.9) и та же структура папоккак указано выше.

0 голосов
/ 14 декабря 2018

Вот мой скрипт сборки.Вам нужно будет внести изменения в соответствии с вашими потребностями.

  • Я внесу изменения в init.tcl, чтобы Tcl выполнял поиск в нужных местах и ​​не смотрел первым в стандартном месте MacOS.Эта часть скрипта сломается, начиная с Tcl / Tk 8.7.Он также имеет путь, который очень специфичен для моей установки (часть 'darwin 64 tcl lib').Ничего не помешает оставить его, или вы можете изменить путь для своих нужд.
  • Я делаю приложение перемещаемым, чтобы его можно было запускать из любого места.Это может быть проблемой безопасности.После установки рекомендуется выполнить дополнительную обработку для установки статических путей к библиотекам.

В настоящее время я лично рекомендую Tcl / Tk 8.6.8, но он должен быть собран сболее ранняя версия XCode (я использую инструменты командной строки XCode 9.2 в Sierra).
В MacOS Mojave все еще исправляются различные ошибки.Другие люди могут порекомендовать иначе.

Переменные:

  • macosxminver: самая ранняя версия MacOS, для которой будет скомпилирован Tcl / Tk.
  • INSTLOC: место установки,Укажите это где-нибудь, кроме вашей целевой директории, а затем скопируйте файлы в вашу целевую директорию. Обратите внимание, что каталог INSTLOC полностью удаляется сценарием.
  • sver: короткая версия Tcl.Единственное место, где это используется, находится в определении SRCDIR.Это может вам не понадобиться в зависимости от структуры каталогов SRCDIR.
  • ver: номер версии Tcl.
  • mver: основной номер версии Tcl.
  • SRCDIR: где Tcl / Tkисходные деревья расположены.Для целей этого сценария у меня есть каталог со следующей структурой:

структура каталогов:

tcl868/
  tcl8.6.8/
  tk8.6.8/

tclbuild.sh:

#!/bin/bash

macosxminver=10.9
sver=868cp
ver=8.6.8
mver=8.6
tclmver=$mver
tkmver=$mver
SRCDIR=$HOME/t/tcl${sver}
INSTLOC=$HOME/t/localB

if [[ $1 != "" ]]; then
  INSTLOC=$1
fi

if [[ -d $INSTLOC ]]; then
  rm -rf $INSTLOC
fi
mkdir $INSTLOC

cd $SRCDIR

test -d build && rm -rf build

cd $SRCDIR
cd tcl${ver}
if [[ $? -eq 0 ]]; then
  f=library/init.tcl
  if [[ ! -f $f-orig ]]; then
    cp -pf $f $f-orig
  fi
  cp -pf $f-orig $f

  ed $f << _HERE_
/issafe/
i
    foreach Dir [list \$::tcl_library [file dirname \$::tcl_library]] {
        if { [string match *Tcl.framework* \$Dir] } {
          regsub Tcl.framework \$Dir Tk.framework Dir
          if {\$Dir ni \$::auto_path} {
            lappend ::auto_path \$Dir
          }
        }
    }

    # This needs to be at the end
    # The real wish executable is in an odd place.
    # Find the tcl directory in the path.
    set Dir [file dirname [info nameofexecutable]]
    if { [string match *MacOS* \$Dir] } {
      regsub {MacOS.*} \$Dir {MacOS} Dir
      set Dir [file join \$Dir darwin 64 tcl lib]
      lappend ::auto_path \$Dir
    } else {
      set Dir [file join [file dirname [file dirname \\
           [info nameofexecutable]]] lib]
    }

.
?catch
?set Dir
.,.+4 s/^/#/
/catch
.+1,.+5 s/^/#/
w
q
_HERE_

  make -C macosx \
      PREFIX="" \
      CFLAGS_OPTIMIZE="-O2 -mmacosx-version-min=${macosxminver}" \
      INSTALL_ROOT=$INSTLOC install

  cd $SRCDIR

  chmod u+w $INSTLOC/bin/tclsh${tclmver}
  install_name_tool -change \
      "/Library/Frameworks/Tcl.framework/Versions/${tclmver}/Tcl" \
      @executable_path/../Library/Frameworks/Tcl.framework/Versions/${tclmver}/Tcl \
      $INSTLOC/bin/tclsh${tclmver}
fi

cd $SRCDIR
cd tk${ver}
if [[ $? -eq 0 ]]; then
  make -C macosx \
      PREFIX="" \
      CFLAGS_OPTIMIZE="-O2 -mmacosx-version-min=${macosxminver}" \
      INSTALL_ROOT=$INSTLOC install
  cd $SRCDIR

  chmod u+w $INSTLOC/Library/Frameworks/Tk.framework/Versions/${tkmver}/Resources/Wish.app/Contents/MacOS/Wish
  install_name_tool -change \
      "/Library/Frameworks/Tk.framework/Versions/${tkmver}/Tk" \
      @executable_path/../../../../Tk \
      $INSTLOC/Library/Frameworks/Tk.framework/Versions/${tkmver}/Resources/Wish.app/Contents/MacOS/Wish
  install_name_tool -change \
      "/Library/Frameworks/Tcl.framework/Versions/${tclmver}/Tcl" \
      @executable_path/../../../../../../../Tcl.framework/Versions/${tclmver}/Tcl \
      $INSTLOC/Library/Frameworks/Tk.framework/Versions/${tkmver}/Resources/Wish.app/Contents/MacOS/Wish
fi

cd $SRCDIR
find $INSTLOC -type f -print0 | xargs -0 chmod u+w
exit 0
...