如何构建带有调试信息的 LuaTeX 二进制文件?

如何构建带有调试信息的 LuaTeX 二进制文件?

我想构建一个包含调试信息的 LuaTeX 二进制文件,以便可以在调试器(如 gdb)中运行,并且可以在源代码方面逐步执行程序。我的目标是调试 LuaTeX 可执行文件,纯粹是为了了解其内部结构。

我不明白格式是如何工作的,而且它似乎妨碍了调试环境的设置。

这是我尝试过的。

  • 已编译luahbtex。非常简单,可直接从 repo 运行。
  • 更改/usr/local/texlive/2021/bin/x86_64-linux/lualatex链接以指向已编译的luahbtex
  • lualatex mwe.tex抱怨找不到 的texmf.cnf位置luahbtex。我复制texmf.cnf并更改TEXMFROOT/usr/local/texlive/2021
  • 我跑了fmtutil -user --all

我依然能看到

$ lualatex mwe.tex
This is LuaHBTeX, Version 1.13.0 (TeX Live 2021)
 restricted system commands enabled.

(Fatal format file error; I'm stymied)

如果我将我的复制luahbtex/usr/local/texlive/2021/bin/x86_64-linux,它就会起作用,但更改系统范围的可执行文件不是很方便。

答案1

笔记:这个答案涉及一种特殊情况,即你只想编译一个可执行文件luahbtex 并保留原始文件,同时不复制其他可执行文件/帮助脚本,而不是编译/安装整个 TeXLive,这是提问者这个问题 正在尝试做(但没有成功)。

因为这种方法不受脚本官方支持,您可能会遇到几个难以理解的错误。如果一切都失败了,只需按照官方方法操作并消耗几 GB 的额外硬盘空间/等待几个小时。

官方的方法大致是

  • 下载 TeXLive 源代码
  • 读取名为的文件README.*尤其 README.2building并且README.3installing(如上所述,您需要单独下载大量支持文件,并且必须使用前请先安装)

1. 构建可执行文件luahbtex

可以简单地下载 TeXLive 源代码并./Build --debug在其中运行。

注意:构建后,请先检查二进制文件是否具有调试符号。(例如gdb <executable>)。上次我尝试时/inst/bin/x86_64-pc-linux-gnu/luahbtex没有调试符号,/Work/texk/web2c但有。

可选地设置TL_MAKE_FLAGS环境变量。例如-j5

或者,仅编译 LuaTeX:(当前编译命令中有两个错误需要修复。)

改编文件中的“4.6 构建一个引擎”部分README.2building,运行:

set -e # bash: fail on error, just in case

# fix bug 1
mkdir Work

cd Work        
../configure --without-x --disable-shared --disable-all-pkgs \
    --enable-luahbtex --disable-synctex -C CFLAGS=-g CXXFLAGS=-g
make -j5

# fix bug 2 pplib manually
cd libs/pplib
make -j5
cd ../..

cd texk/web2c
make -j5 luahbtex

在 4 核机器上,编译时间不超过 5 分钟,其中配置部分占用大部分时间。

  • 注意:mkdir WorkREADME.2building 中缺少 bug 1:。需要手动添加。

  • 注意:错误 2:由于某种原因,仅编译 LuaTeX 不会编译 pplib。因此您需要先手动编译 pplib。

    否则你会收到错误消息

    ../../../texk/web2c/luatexdir/luamd5/md5lib.c:197:10: fatal error: utilsha.h: No such file or directory
      197 | #include "utilsha.h"
          |          ^~~~~~~~~~~
    compilation terminated.
    

    还讨论了https://www.mail-archive.com/[电子邮件保护]/msg04722.html但没有解决方案。

要进行构建luahbtex,请将所有出现的更改luatexluahbtex。(并且由于另一个错误,您需要运行make -j5 luahbtex 再次在它完成后,因为出于某种原因,它目前构建luaharfbuzz harfbuzz。)否则,您会收到错误消息

In file included from ../../../texk/web2c/luatexdir/luaharfbuzz/src/luaharfbuzz/blob.c:1:
../../../texk/web2c/luatexdir/luaharfbuzz/src/luaharfbuzz/luaharfbuzz.h:4:10: fatal error: hb.h: No such file or directory
    4 | #include <hb.h>
      |          ^~~~~~
compilation terminated.

(关于区别,解释如下man luatex

luahbtex 变体可以使用 HarfBuzz 引擎进行字形塑造,而不是 LuaTeX 的内置塑造器。

2. 使用可执行文件

2.1. 复制到全局位置

这是最简单的方法,但不要盲目从互联网上复制粘贴代码。

sudo mv -i /usr/bin/luahbtex /usr/bin/luahbtex__backup
sudo cp ./luahbtex /usr/bin/luahbtex
mktexfmt lualatex

可执行文件使用被调用的文件名来确定要做什么,因此luahbtexlualatex有所不同。(参见luatex 和 lualatex 二进制文件之间的区别更多细节)

2.2. 复制到全局位置,但不覆盖默认文件

实际上,可能可以修改 user-local fmtutil.cnf,但我不想弄清楚这一点

这基本上是一次大规模的黑客攻击,它不应该像这样工作。

cp ./luahbtex /usr/bin/luahbtex__debug
cd /usr/bin
sudo ln -rs luahbtex__debug  lualatex__debug

然后您需要编辑fmtutil.cnf以指定lualatex__debug可以从中生成的格式文件luahbtex__debug。为此,请执行

vim $(kpsewhich fmtutil.cnf)

添加行

lualatex__debug luahbtex__debug language.dat,language.dat.lua lualatex.ini

您可以运行fmtutil -sys --listcfg检查编辑是否成功。

然后您需要执行以下操作。

cd ~/.texlive/texmf-var/web2c/luahbtex/
ln -rs ../luahbtex__debug/lualatex__debug.fmt .

(原因:通过,可执行文件 每次在生成时都会 strace output在中查找 fmt 文件 。)~/.texlive/texmf-var/web2c/luahbtex/lualatex__debug.fmt~/.texlive/texmf-var/web2c/luahbtex__debug/lualatex__debug.fmt

然后可执行文件就可以用作lualatex__debug

2.3. 完全不进行全局修改

(不起作用!)

此方法不受官方支持因此,这些信息大多是通过反复试验得出的,可能随时会失效。此外,在编辑任何内容之前,请阅读文件顶部的注释。

由于脚本检测可执行文件位置的方式,要使事情正确完成相当复杂/脆弱。(无论如何它不打算以这种方式使用)

  • 虽然你必须使用新的lualatex可执行文件来生成格式文件,但你必须使用旧的 mktexfmt,否则会失败

    Can't locate mktexlsr.pl in @INC (@INC contains: X/inst/tlpkg X/inst/texmf-dist/scripts/texlive /usr/lib/perl5/5.34/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/5.34/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/5.34/core_perl /usr/share/perl5/core_perl) at X/mktexfmt line 23.
    BEGIN failed--compilation aborted at X/mktexfmt line 25.
    

    (因为根据https://github.com/conda-forge/texlive-core-feedstock/issues/19#issuecomment-384236207,需要安装一些额外的mktexfmt使(别名)起作用的事情fmtutil

  • 如果没有这个,使用全局 TeX Live,也可以mktexfmt通过确保正在使用一个来使用全局。

    不像什么评论声称,这是不够设置$PATH

    这是因为,当找不到格式文件时,将会执行以下操作:

    • luahbtex会跑mktexfmt lualatex.fmt
    • 它依次运行luahbtex -ini -jobname=lualatex -progname=lualatex lualatex.ini以制作格式文件,但luahbtex在包含以下内容的文件夹中进行搜索,kpsewhich因为来自文件$(kpsewhich -var-value=TEXMFROOT)/tlpkg/TeXLive/TLUtils.pm
    sub prepend_own_path {
      my $bindir = dirname(Cwd::abs_path(which('kpsewhich')));
      if (win32()) {
        $bindir =~ s!\\!/!g;
        $ENV{'PATH'} = "$bindir;$ENV{PATH}";
      } else {
        $ENV{'PATH'} = "$bindir:$ENV{PATH}";
      }
    }
    

    所以实际的其位置kpsewhich(如果是符号链接,则是其原始位置)很重要。

    我不知道如何修复这个。cp $(which kpsewhich) .,在当前文件夹中创建一个名为 bash 脚本kpsewhich来调用真实的脚本,,, cp /usr/share/texmf-dist/web2c/texmf.cnf .全部 export PATH="$(realpath .):$PATH"失败 mktexfmt lualatex

相关内容