Как установить интерпретатор схемы STk 4.0.1 из исходного кода в Ubuntu 20.04 - PullRequest
0 голосов
/ 13 июля 2020

Я хочу иметь возможность использовать схему STK при просмотре видео.

Моя проблема похожа на Установка интерпретатора схемы STK на Ubuntu Mate , однако предоставленные ответы не помогли решить проблему проблема для меня.

Я использую

Ubuntu 20.04

GNU Make 4.2.1

g cc 9.3.0

Я пошел на https://teachyourselfcs.com/#programming и получил Berkeley Computer Science 61A от видео Брайана Харви из https://archive.org/details/ucberkeley-webcast-PL3E89002AA9B9879E?sort=titleSorter

Язык программирования, используемый для класса, - это схема STK. . Итак, я пошел и получил исходный код из http://kaolin.unice.fr/STk/Distrib/STk-4.0.1.tar.gz

. Я извлек файлы в домашний каталог моего пользователя и был готов к

./configure
make
checkinstall

* Я использую ' checkinstall 'вместо' install ', потому что он создает файл .deb, который отображается в диспетчере пакетов. По моему опыту, это упрощает дальнейшее удаление.

Когда я сделал «make», это не сработало. Получил:

make Tcl
make[1]: Entering directory '/home/USER/STk-4.0.1/Tcl'
make[1]: *** No rule to make target 'unix'.  Stop.
make[1]: Leaving directory '/home/USER/STk-4.0.1/Tcl'
make: *** [Makefile:81: tcl-dir] Error 2

Я вижу, что в папке Tcl возникла какая-то проблема. Когда я заглянул в папку, в ней были файлы с именами configure и make, так что я подумал, что, возможно, причина того, что у нее нет цели make, заключается в том, что ее тоже нужно было настроить. t завершено, последняя строка сказала:

checking system version (for dynamic loading)... ./configure: 1: Syntax error: Unterminated quoted string

, поэтому я открыл файл «configure» в текстовом редакторе и поискал «системная версия». Нашел его в строке 3222. Там было написано:

system=MP-RAS-`awk '{print $3}' /etc/.relid'`

Я изменил его на

system=MP-RAS-`awk '{print $3}' /etc/.relid`

, удалив 'after /etc/.relid.

Сохранил файл и попробовал

./configure
make

снова из основной каталог.

На этот раз make снова остановился, но в новом месте. Последние несколько строк были:

make[2]: Entering directory '/home/en/STk-4.0.1/Tk/unix'
gcc -c -O2 -DSTk_CODE -DSCM_CODE -DLINUX -DUSE_STKLOS -DLINUX  -DUSE_HASH -DUSE_POSIX -DUSE_SOCKET -DUSE_REGEXP -DUSE_PROCESS -DUSE_HTML -DUSE_BASE64 -DUSE_LOCALE -DUSE_PIXMAP -DUSE_JPEG -I../../Src  -I. -I./../generic -I./../bitmaps -I../../Tcl/  -DHAVE_UNISTD_H=1 -DHAVE_LIMITS_H=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TIME_H=1 -DTIME_WITH_SYS_TIME=1      ./../generic/tk3d.c
In file included from ./../generic/tkInt.h:21,
                 from ./../generic/tk3d.h:18,
                from ./../generic/tk3d.c:16:
./../generic/tk.h:75:11: fatal error: X11/Xlib.h: No >such file or directory
   75 | # include <X11/Xlib.h>
      |           ^~~~~~~~~~~~
compilation terminated.
make[2]: *** [Makefile:475: tk3d.o] Error 1
make[2]: Leaving directory '/home/en/STk-4.0.1/Tk/unix'
make[1]: *** [Makefile:12: libtk.a] Error 2
make[1]: Leaving directory '/home/en/STk-4.0.1/Tk'
make: *** [Makefile:83: tk-dir] Error 2

Быстрый поиск показал, что отсутствующий файл X11 / xlib.h предоставляется пакетом libx11-dev, поэтому

sudo apt install libx11-dev

и повторите попытку.

.configure
make

make снова остановился, но дальше на этот раз. он сказал:

io.c: In function ‘file_data_available’:>io.c:77:38: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_cnt’
   77 | #    define READ_DATA_PENDING(fp) (fp->_cnt)
      |                                      ^~
io.c:115:6: note: in expansion of macro ‘READ_DATA_PENDING’
  115 |     (READ_DATA_PENDING(PORT_FILE(port)))      );
      |      ^~~~~~~~~~~~~~~~~
make[1]: *** [<builtin>: io.o] Error 1
make[1]: Leaving directory '/home/en/STk-4.0.1/Snow'
make: *** [Makefile:91: snow-dir] Error 2

Теперь я застрял. Я не знаю, что означает fp->_cnt и откуда оно взялось. Я думаю, что это последнее, что заставит его работать, потому что, если я удалю разделы кода в файле io.c, вызывающие эту проблему, он будет работать без ошибок, но я считаю, что просто удалить его - плохая идея.

вот разделы кода c из io. c, которые могут иметь отношение


#ifdef _STDIO_USES_IOSTREAM  /* GNU libc */
#  if defined(_IO_STDIO_H) || defined (linux)
#    define READ_DATA_PENDING(fp) (max(0,(fp)->_IO_read_end - (fp)->_IO_read_ptr))
#  else
#    define READ_DATA_PENDING(fp) (max(0,(fp)->_egptr - (fp)->_gptr))
#  endif
#endif
#if (!defined (READ_DATA_PENDING)) && defined __SLBF
#  define READ_DATA_PENDING(fp) (max(0,fp->_r))
#endif
#if !defined (READ_DATA_PENDING)
#  ifdef WIN32
#    define READ_DATA_PENDING(fp) (1)
#  else 
#    define READ_DATA_PENDING(fp) (fp->_cnt)
#  endif
#endif

, а затем

static int file_data_available(SCM port)
{
  return ( (PORT_UNGETC(port) != EOF)           ||
       ((port == STk_stdin) && (bufidx < count))    ||
       (READ_DATA_PENDING(PORT_FILE(port)))      );
}

...