我想构建一个包含调试信息的 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 Work
README.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
,请将所有出现的更改luatex
为luahbtex
。(并且由于另一个错误,您需要运行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
可执行文件使用被调用的文件名来确定要做什么,因此luahbtex
→lualatex
有所不同。(参见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
。