Emacs 버전 26.1 빌드 해 보았다 (Termux on Android)

emacs
termux

#1

Emacs 버전 26.1.x 빌드 해 보았다 (Termux on Android)

tags : Termux Emacs 빌드

** 설치했는데, 조속히 문제가 나와 버렸습니다. 원인은 termux-packages의 emacs 패키지 (emacs-25.3) 패치를 수중에 넣으 확장* .patch 않은 패치를 캡처 잊어 위해, 즉 자신의 잘못했습니다, 죄송합니다. 본문 패치 2018/02/21 수정했습니다. **

서론

Emacs26에서 도입되는 부분에서 대망되어 줄 번호 표시 (구현에 따르면 (https://lists.gnu.org/archive/html/emacs-devel/2017-06/msg00318.html) 상당히 빠른 것 같습니다. 정말 인색 같은 느낌이 흡족 안티 뉴스 쓰기 자세는 100 % 웃기 라는게 있다는 것입니다. 격하는 자신은 실은 기다리고있었습니다. 별도로 행 번호가 필요 그런 게 아니라, 어쩐지 모양이 캇코이에서 .Basic 나 COBOL 세대 랍니다 내)을 시도 싶어서 Termux에서 빌드했습니다.

기초 지식

나는 특히 Android 라든지에 대해 잘 모르기 때문에 [Terux 설명서 패키지 관리 (https://termux.com/package-management.html) 단계가 기본입니다. 즉,

  1. 빌드 도구 설치
  2. 소스 구하기 및 수정
  3. configure를위한 환경 준비
  4. configure하고 make

…라고하는 흐름입니다.

또한 매뉴얼에는 특히 실려 있지만 Termux 패키지의 공식 저장소] (https://github.com/termux/termux-packages)는 (아마) 저장소의 응용 프로그램을 Docker에서 빌드하기 위해 필요한 patch 나 스크립트가 있으며, 이들은 Termux에서 앱을 소스에서 빌드 할 때 매우 도움이들 수 있습니다.

전 준비

빌드 도구 설치

설명서에 따라 빌드 도구를 설치합니다.

[~/src/emacs] pkg install autoconf automake bison bzip2 \
              clang cmake coreutils diffutils \
              flex gawk git grep gzip libtool \
              make patch perl sed silversearcher-ag \
              tar termux-exec wget
Hit:1 https://termux.net stable InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
Reading package lists... Done
Building dependency tree
Reading state information... Done
.....

의존 패키지 설치

공식 저장소에는 [Emacs-25.3 빌드 용 스크립트 (https://github.com/termux/termux-packages/blob/master/packages/emacs/build.sh)가 있습니다. 그것을 다운로드합니다. 안을 들여다 보면ncurses``gnutls``libxml2라는 패키지가 필요 것 같습니다. 버전이 다르기 때문에 필요 충분 않겠지 만 우선 설치해야합니다. 단, 바이너리 실행뿐만 아니라 빌드에서 실시하고 있으므로 -dev 대해서 패키지, 즉ncurses-dev``gnutls-dev``libxml2-dev를 설치합니다.

[~/src/emacs]$ pkg install ncurses-dev gnutls-dev libxml2-dev
Hit:1 https://termux.net stable InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
.....

그 밖에도 내 환경에 설치되어 있고, 소의 Termux에 들어 있지 않은 패키지가 필요한 경우에는 configure와 make에서 오류가 발생, 그래서 당신은 그 패키지를pkg install 설치 하여 configure에서 적용될 수면 괜찮습니다.

빌드

드디어 빌드하고 있습니다.

소스의 취득

소스에서 emacs-26.0.91.tar.gz (http://git.savannah.gnu.org/cgit/emacs.git/snapshot/emacs-26.0.91.tar.gz)을 다운로드하여 압축을 풉니 해당 폴더로 이동합니다.

[~/src/emacs]$ tar xvfz emacs-26.0.91.tar.gz 2>&1|head -20                                     emacs-26.0.91/                                                                            emacs-26.0.91/.dir-locals.el                                                              emacs-26.0.91/.gitattributes                                                              emacs-26.0.91/.gitignore                                                                  emacs-26.0.91/.gitlab-ci.yml                                                              emacs-26.0.91/BUGS                                                                        emacs-26.0.91/CONTRIBUTE                                                                  emacs-26.0.91/COPYING                                                                     emacs-26.0.91/ChangeLog.1                                                                 emacs-26.0.91/ChangeLog.2                                                                 emacs-26.0.91/ChangeLog.3                                                                 emacs-26.0.91/GNUmakefile
.....
[~/src/emacs]$ cd emacs-26.0.91
[~/src/emacs/emacs-26.0.91]

Termux 빌드 환경 준비

Termux에서 빌드하려면 다음을 수행합니다. 본래라면 대상--prefix에는$ PREFIX를 지정 합니다만, 과연 그것은 무서운 때문에--prefix = $ HOME에서 실시했습니다. 따라서 설치 된 Emacs를 실행하기 위해PATH~ / bin도 추가하고 있습니다.

[~/src/emacs/emacs-26.0.91]$ export PREFIX=/data/data/com.termux/files/usr
[~/src/emacs/emacs-26.0.91]$ export LD_PRELOAD=${PREFIX}/lib/libtermux-exec.so
[~/src/emacs/emacs-26.0.91]$ export PATH=$HOME/bin:$PATH

소스 수정

patch에 의한 수정합니다. 다음 patch 파일 내용의 99 %는 [공식 저장소 Emacs 패키지 ()의* .patch에서 받았습니다.

diff -u -r ../emacs-26.0.91.orig/lib-src/emacsclient.c ./lib-src/emacsclient.c
--- ../emacs-26.0.91.orig/lib-src/emacsclient.c	2018-01-14 06:07:12.000000000 +0900
+++ ./lib-src/emacsclient.c	2018-02-20 14:00:42.209932042 +0900
@@ -1287,7 +1287,7 @@
               }
             else
 #endif
-              tmpdir = "/tmp";
+              tmpdir = "@[email protected]/tmp";
           }
 	socket_name_storage =
 	  xmalloc (strlen (tmpdir) + strlen (server_name) + EXTRA_SPACE);
diff -u -r ../emacs-26.0.91.orig/lib-src/pop.c ./lib-src/pop.c
--- ../emacs-26.0.91.orig/lib-src/pop.c	2018-01-14 06:07:12.000000000 +0900
+++ ./lib-src/pop.c	2018-02-20 14:00:42.209932042 +0900
@@ -71,6 +71,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <stdbool.h>
 
 #ifdef KERBEROS
 # ifdef HAVE_KRB5_H
@@ -129,6 +130,23 @@
 char pop_error[ERROR_MAX];
 bool pop_debug = false;
 
+#ifdef __ANDROID__
+static char* getpass(const char* prompt) {
+	printf("%s\n", prompt);
+	static char chars[128];
+	int len = 0;
+	while (true) {
+		char c = fgetc(stdin); 
+		if (c == '\r' || c == '\n' || c == 0) break; 
+		chars[len++] = c;
+		if (len == sizeof(chars)-1) break;
+	} 
+	chars[len] = 0;
+	return chars;
+}
+#endif
+
+
 /*
  * Function: pop_open (char *host, char *username, char *password,
  * 		       int flags)
diff -u -r ../emacs-26.0.91.orig/lisp/cus-start.el ./lisp/cus-start.el
--- ../emacs-26.0.91.orig/lisp/cus-start.el	2018-01-14 06:07:12.000000000 +0900
+++ ./lisp/cus-start.el	2018-02-20 14:23:37.279931517 +0900
@@ -284,12 +284,12 @@
 				 (setq tmp (replace-regexp-in-string
 					    "\n\\'" "" tmp))
 				 ;; Handles "getconf: Unrecognized variable..."
-				 (file-directory-p tmp)
+				 (File-directory-p tmp)
 				 tmp))
 			  "/tmp"))
 		     (t
 		      (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP")
-			  "/tmp"))))
+			  "@[email protected]/tmp"))))
 	      :initialize custom-initialize-delay)
 	     ;; fns.c
 	     (use-dialog-box menu boolean "21.1")
diff -u -r ../emacs-26.0.91.orig/lisp/international/ucs-normalize.el ./lisp/international/ucs-normalize.el
--- ../emacs-26.0.91.orig/lisp/international/ucs-normalize.el	2018-01-14 06:07:12.000000000 +0900
+++ ./lisp/international/ucs-normalize.el	2018-02-20 14:00:42.219932042 +0900
@@ -111,6 +111,9 @@
 
 (eval-when-compile (require 'cl-lib))
 
+;;; add for regexp-opt-charset
+(eval-when-compile (require 'regexp-opt))
+                   
 (declare-function nfd "ucs-normalize" (char))
 
 (eval-when-compile
diff -u -r ../emacs-26.0.91.orig/lisp/loadup.el ./lisp/loadup.el
--- ../emacs-26.0.91.orig/lisp/loadup.el	2018-01-14 06:07:12.000000000 +0900
+++ ./lisp/loadup.el	2018-02-20 14:30:30.789931359 +0900
@@ -393,7 +393,12 @@
       (message "Warning: Change in load-path due to site-init will be \
 lost after dumping")))
 
-(setq current-load-list nil)
+;; On an emacs that runs undumped, i.e. Android, this causes bogus 
+;; entries to appear in load-history. Commenting this out causes an entry
+;; for loadup.el with a bogus filename to appear instead, but since it
+;; neither provides nor requires anything, it appears to be safe.
+;;(setq current-load-list nil)
+
 ;; Avoid storing references to build directory in the binary.
 (setq custom-current-group-alist nil)
 
@@ -453,7 +458,10 @@
       ;; Mainly cosmetic, but helpful for Guix.  (Bug#20330)
       ;; Do this here, rather than earlier, so that the above code
       ;; can invoke Git commands and the like.
-      (setq exec-path nil)
+      
+      ;; Termux patch: Keep exec-path when running undumped:
+      ;; (setq exec-path nil)
+
       (message "Dumping under the name emacs")
       (condition-case ()
 	  (delete-file "emacs")
diff -u -r ../emacs-26.0.91.orig/lisp/net/tramp.el ./lisp/net/tramp.el
--- ../emacs-26.0.91.orig/lisp/net/tramp.el	2018-01-14 06:07:12.000000000 +0900
+++ ./lisp/net/tramp.el	2018-02-20 14:32:40.759931310 +0900
@@ -127,7 +127,7 @@
   :require 'tramp)
 
 (defcustom tramp-encoding-shell
-  (or (tramp-compat-funcall 'w32-shell-name) "/bin/sh")
+  (or (tramp-compat-funcall 'w32-shell-name) "@[email protected]/bin/sh")
   "Use this program for encoding and decoding commands on the local host.
 This shell is used to execute the encoding and decoding command on the
 local host, so if you want to use `~' in those commands, you should
diff -u -r ../emacs-26.0.91.orig/lisp/server.el ./lisp/server.el
--- ../emacs-26.0.91.orig/lisp/server.el	2018-01-14 06:07:12.000000000 +0900
+++ ./lisp/server.el	2018-02-20 14:35:42.759931240 +0900
@@ -226,7 +226,7 @@
 		 (function-item :tag "Use pop-to-buffer" pop-to-buffer)
 		 (function :tag "Other function")))
 
-(defcustom server-temp-file-regexp "^/tmp/Re\\|/draft$"
+(defcustom server-temp-file-regexp "^@[email protected]/tmp/Re\\|@[email protected]/draft$"
   "Regexp matching names of temporary files.
 These are deleted and reused after each edit by the programs that
 invoke the Emacs server."
@@ -264,7 +264,7 @@
 ;; does not read the init file.
 (defvar server-socket-dir
   (and (featurep 'make-network-process '(:family local))
-       (format "%s/emacs%d" (or (getenv "TMPDIR") "/tmp") (user-uid)))
+       (format "%s/emacs%d" (or (getenv "TMPDIR") "@[email protected]/tmp") (user-uid)))
   "The directory in which to place the server socket.
 If local sockets are not supported, this is nil.")
 
diff -u -r ../emacs-26.0.91.orig/lisp/subr.el ./lisp/subr.el
--- ../emacs-26.0.91.orig/lisp/subr.el	2018-01-14 06:07:12.000000000 +0900
+++ ./lisp/subr.el	2018-02-20 14:37:40.379931196 +0900
@@ -3142,7 +3142,7 @@
   (declare (advertised-calling-convention (name buffer command) "23.1"))
   (start-file-process
    name buffer
-   (if (file-remote-p default-directory) "/bin/sh" shell-file-name)
+   (if (file-remote-p default-directory) "@[email protected]/bin/sh" shell-file-name)
    (if (file-remote-p default-directory) "-c" shell-command-switch)
    (mapconcat 'identity args " ")))
 
@@ -3186,7 +3186,7 @@
   (declare (advertised-calling-convention
             (command &optional infile buffer display) "24.5"))
   (process-file
-   (if (file-remote-p default-directory) "/bin/sh" shell-file-name)
+   (if (file-remote-p default-directory) "@[email protected]/bin/sh" shell-file-name)
    infile buffer display
    (if (file-remote-p default-directory) "-c" shell-command-switch)
    (mapconcat 'identity (cons command args) " ")))
diff -u -r ../emacs-26.0.91.orig/lisp/term.el ./lisp/term.el
--- ../emacs-26.0.91.orig/lisp/term.el	2018-01-14 06:07:12.000000000 +0900
+++ ./lisp/term.el	2018-02-20 14:40:45.919931125 +0900
@@ -1538,7 +1538,7 @@
 	;; do the decoding by hand on the parts that are made of chars.
 	(coding-system-for-read 'binary))
     (apply 'start-process name buffer
-	   "/bin/sh" "-c"
+	   "@[email protected]/bin/sh" "-c"
 	   (format "stty -nl echo rows %d columns %d sane 2>/dev/null;\
 if [ $1 = .. ]; then shift; fi; exec \"[email protected]\""
 		   term-height term-width)
diff -u -r ../emacs-26.0.91.orig/src/Makefile.in ./src/Makefile.in
--- ../emacs-26.0.91.orig/src/Makefile.in	2018-01-14 06:07:12.000000000 +0900
+++ ./src/Makefile.in	2018-02-20 14:00:42.219932042 +0900
@@ -532,7 +532,8 @@
                 lisp.mk $(etc)/DOC $(lisp) \
                 $(lispsource)/international/charprop.el ${charsets}
 ifeq ($(CANNOT_DUMP),yes)
-	ln -f temacs$(EXEEXT) [email protected]
+	rm -f [email protected]
+	ln -s temacs$(EXEEXT) [email protected]
 else
 	LC_ALL=C $(RUN_TEMACS) -batch $(BUILD_DETAILS) -l loadup dump
   ifneq ($(PAXCTL_dumped),)
@@ -736,7 +737,8 @@
 bootstrap-emacs$(EXEEXT): temacs$(EXEEXT)
 	$(MAKE) -C ../lisp update-subdirs
 ifeq ($(CANNOT_DUMP),yes)
-	ln -f temacs$(EXEEXT) [email protected]
+	rm -f  [email protected]
+	ln -s temacs$(EXEEXT) [email protected]
 else
 	$(RUN_TEMACS) --batch $(BUILD_DETAILS) --load loadup bootstrap
   ifneq ($(PAXCTL_dumped),)
diff -u -r ../emacs-26.0.91.orig/src/callproc.c ./src/callproc.c
--- ../emacs-26.0.91.orig/src/callproc.c	2018-01-14 06:07:12.000000000 +0900
+++ ./src/callproc.c	2018-02-20 14:00:42.229932042 +0900
@@ -1612,7 +1612,7 @@
     dir_warning ("arch-independent data dir", Vdata_directory);
 
   sh = getenv ("SHELL");
-  Vshell_file_name = build_string (sh ? sh : "/bin/sh");
+  Vshell_file_name = build_string (sh ? sh : "@[email protected]/bin/sh");
 
   Lisp_Object gamedir = Qnil;
   if (PATH_GAME)
diff -u -r ../emacs-26.0.91.orig/src/editfns.c ./src/editfns.c
--- ../emacs-26.0.91.orig/src/editfns.c	2018-01-14 06:07:12.000000000 +0900
+++ ./src/editfns.c	2018-02-20 14:00:42.229932042 +0900
@@ -1440,7 +1440,7 @@
   if (!pw)
     return Qnil;
 
-  p = USER_FULL_NAME;
+  p = "unknown";
   /* Chop off everything after the first comma. */
   q = strchr (p, ',');
   full = make_string (p, q ? q - p : strlen (p));
diff -u -r ../emacs-26.0.91.orig/src/filelock.c ./src/filelock.c
--- ../emacs-26.0.91.orig/src/filelock.c	2018-01-14 06:07:12.000000000 +0900
+++ ./src/filelock.c	2018-02-20 14:00:42.229932042 +0900
@@ -127,14 +127,14 @@
 static time_t boot_time;
 static bool boot_time_initialized;
 
-#ifdef BOOT_TIME
+#if defined(BOOT_TIME) && !defined(__ANDROID__)
 static void get_boot_time_1 (const char *, bool);
 #endif
 
 static time_t
 get_boot_time (void)
 {
-#if defined (BOOT_TIME)
+#if defined (BOOT_TIME) && !defined(__ANDROID__)
   int counter;
 #endif
 
@@ -170,7 +170,7 @@
 	}
     }
 
-#if defined (BOOT_TIME)
+#if defined (BOOT_TIME) && !defined(__ANDROID__)
 #ifndef CANNOT_DUMP
   /* The utmp routines maintain static state.
      Don't touch that state unless we are initialized,
@@ -232,7 +232,7 @@
 #endif
 }
 
-#ifdef BOOT_TIME
+#if defined(BOOT_TIME) && !defined(__ANDROID__)
 /* Try to get the boot time from wtmp file FILENAME.
    This succeeds if that file contains a reboot record.
 
diff -u -r ../emacs-26.0.91.orig/src/keyboard.c ./src/keyboard.c
--- ../emacs-26.0.91.orig/src/keyboard.c	2018-01-14 06:07:12.000000000 +0900
+++ ./src/keyboard.c	2018-02-20 14:00:42.239932042 +0900
@@ -8916,7 +8916,6 @@
   ptrdiff_t keys_start;
 
   Lisp_Object current_binding = Qnil;
-  Lisp_Object first_event = Qnil;
 
   /* Index of the first key that has no binding.
      It is useless to try fkey.start larger than that.  */
@@ -9026,6 +9025,7 @@
 
   starting_buffer = current_buffer;
   first_unbound = bufsize + 1;
+  Lisp_Object first_event = mock_input > 0 ? keybuf[0] : Qnil;
 
   /* Build our list of keymaps.
      If we recognize a function key and replace its escape sequence in

이 patch 파일을 어딘가에 작성하여 소스 폴더에서 patch를 적용합니다.

[~/src/emacs/emacs-26.0.91]$ perl -pe "s{\@TERMUX_PREFIX\@}{$PREFIX}g" ../emacs-26.0.91.patch | patch -p1
patching file lib-src/emacsclient.c
patching file lib-src/pop.c
patching file lisp/cus-start.el
patching file lisp/international/ucs-normalize.el
patching file lisp/loadup.el                                                       patching file lisp/net/tramp.el
patching file lisp/server.el
patching file lisp/subr.el
patching file lisp/term.el
patching file src/Makefile.in
patching file src/callproc.c
patching file src/editfns.c
patching file src/filelock.c
patching file src/keyboard.c

build.sh에서 유용

다음은 configure 옵션을받습니다. 조금 전의build.sh를 source로 가져옵니다.

[~/src/emacs/emacs-26.0.91]$ source /path/to/file/build.sh
[~/src/emacs/emacs-26.0.91]$ echo $TERMUX_PKG_EXTRA_CONFIGURE_ARGS
--without-x --with-xpm=no --with-jpeg=no --with-png=no --with-gif=no --with-tiff=no --without-gconf --without-gsettings --with-gnutls --with-xml2 emacs_cv_sanitize_address=yes emacs_cv_prog_cc_nopie=no ac_cv_lib_elf_elf_begin=no gl_cv_func_dup2_works=no

이 스크립트에서 받고 싶은 것은 먼저TERMUX_PKG_EXTRA_CONFIGURE_ARGS입니다. 단,이 스크립트는 HOST에서 빌드하기위한 것이므로 clang없이 gcc를 사용 설정되어 있습니다. 그러나 Termux에서는 clang을 사용하기 때문에, 따라서 configure 인수를 추가합니다.

[~/src/emacs/emacs-26.0.91]$ TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" emacs_cv_prog_cc_no_pie=no"
[~/src/emacs/emacs-26.0.91]$ export TERMUX_PKG_EXTRA_CONFIGURE_ARGS
[~/src/emacs/emacs-26.0.91]$ echo $TERMUX_PKG_EXTRA_CONFIGURE_ARGS
--without-x --with-xpm=no --with-jpeg=no --with-png=no --with-gif=no --with-tiff=no --without-gconf --without-gsettings --with-gnutls --with-xml2 emacs_cv_sanitize_address=yes emacs_cv_prog_cc_nopie=no ac_cv_lib_elf_elf_begin=no gl_cv_func_dup2_works=no emacs_cv_prog_cc_no_pie=no

그리고 필요한 것은export CANNOT_DUMP = yes입니다. 이것은 터미널에 붙여 넣기 적용합니다.

[~/src/emacs/emacs-26.0.91]$ export CANNOT_DUMP=yes
[~/src/emacs/emacs-26.0.91]$ echo $CANNOT_DUMP
yes

또한 설명서에 따라 Termux 버전 Autoconf 파일을 소스 트리에 복사합니다.

[~/src/emacs/emacs-26.0.91]$ find . -name 'config.sub' -exec chmod u+w '{}' \; -exec cp -f "${PREFIX}/share/libtool/build-aux/config.sub" '{}' \;
[~/src/emacs/emacs-26.0.91]$ find . -name 'config.guess' -exec chmod u+w '{}' \; -exec cp -f "${PREFIX}/share/libtool/build-aux/config.guess" '{}' \;

configure

개발 버전 소스는 configure 스크립트 및 기타 필요한 파일이 없습니다. 다음 명령을 만듭니다。

[~/src/emacs/emacs-26.0.91]$ autoreconf -ivf
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /data/data/com.termux/files/usr/bin/autoconf --force
autoreconf: running: /data/data/com.termux/files/usr/bin/autoheader --force
autoreconf: configure.ac: not using Automake
autoreconf: Leaving directory `.'

끝나면 configure합니다.

덧붙여서 Emacs26 판매 하나는 Emacs 버전 mailutils 대신 GNU mailutils이 기본이 된 것입니다 만, GNU mailutils는 Termux 패키지 제공되지 않고, 빌드도 힘들었다. 게다가 빌드 통해서했지만 아마도 제대로 움직이지 않는다 (적어도/ etc / passwd 엉킴 부분은 다시해야) 때문에 무시합니다. 나는 새로운 기능의 행 번호가보고 싶습니다.

[~/src/emacs/emacs-26.0.91]$ ./configure --prefix="${HOME}" CC=clang CXX=clang++ ${TERMUX_PKG_EXTRA_CONFIGURE_ARGS} --without-pop --without-lcms2
checking for xcrun... no
checking for GNU Make... make
checking build system type... aarch64-unknown-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
Aborted
checking whether the C compiler works... yes
.....

또한 디버깅 기능을 활성화하기 위해CFLAGSCFLAGS = '- O0 -g3'./configure --enable-checking = 'yes, glyphs'--enable-check-lisp-object-type 등을 지정하고자하는 사람은 먼저 CFLAGS를 지정하지 않고 make하여 elisp 파일의 컴파일을 끝낸 후 다시 CFLAGS를 지정해 configure와 make를 다시 것이 갑자기 빠릅니다. 디버깅 emacs는 elisp 컴파일 단계에 ** 엉뚱 ** 시간이 걸렸습니다.

make & install

make합니다.

[~/src/emacs/emacs-26.0.91]$ make -j4
make -C lib all
make info-real info-dir
make[1]: Entering directory '/data/data/com.termux/files/home/src/emacs/emacs-26.0.91/lib'
  GEN      alloca.h
make[1]: Entering directory '/data/data/com.termux/files/home/src/emacs/emacs-26.0.91'
make -C doc/lispref info
  GEN      dirent.h
make[2]: Entering directory '/data/data/com.termux/files/home/src/emacs/emacs-26.0.91/doc/lispref'
.....

make가 오르면 설치합니다.

[~/src/emacs/emacs-26.0.91]$ make install
make -C lib all
make[1]: Entering directory '/data/data/com.termux/files/home/src/emacs/emacs-26.0.91/lib'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/data/data/com.termux/files/home/src/emacs/emacs-26.0.91/lib'
make -C lib-src all
.....

후 Termux에서 Emacs를 편리하게 사용하기 위해 패키지 버전의 Emacs에 [site-lisp.el (https://github.com/termux/termux-packages/blob/master/packages/emacs/site- init.el)라는 파일이 포함되어 있기 때문에, 똑같은$ HOME / share / emacs / 25.3 / lisp / emacs-lisp / site-init.el 만들어두면 화면의 탭이나 핀치 인 / 아웃 에서 콘솔 마우스와 동등한 것으로 할 수있어, 만들어두면 편리 하겠지요.

; Enable terminal mouse events:
(xterm-mouse-mode 1)
(global-set-key [mouse-4] 'scroll-down-line)
(global-set-key [mouse-5] 'scroll-up-line)

설치했기 때문에 실행 해 봅니다. 다음은 전부터있는global-hl-line-mode과 새로운 기능의display-line-numbers-mode를 실행 한 화면입니다.

체결

나는 Termux 공식 저장소에없는 내 빌드 응용 프로그램을 몇 개 사용하고 있습니다 만, 역시 결함 조사를 위해 디버그 옵션에서 빌드 해 두지 않으면 おかない입니다. 이번에도 상용 응용 프로그램이므로 속도도 중요 합니다만, 디버깅 옵션 지정에서 빌드했습니다. 이제 잠시 사용해보십시오. 끝났