在Windows下编译less.exe

如何将Linux系统下的文本查看器less编译到Windows上?

一、背景

GNU less 是一个很好用的命令行文本查看器,在Linux系统上默认安装,其提供了包括文件查看、字符串搜索在内的许多功能,并且在打开大文件(例如1GB大小的基因组数据)时速度极快。

由于工作环境限制,笔者需要经常在Windows系统的电脑下查看文本文件。windows系统自带了记事本、写字板等文本查看器,但是如上所述,打开大文件时这些软件的速度很慢。此外,笔者也安装了vscode、 GVIM 、busybox 等软件,但是这些软件也不尽然能够满足笔者的需求(例如,vscode本质上是个浏览器,因此速度更慢;GVIM提供了和Linux vim一致的使用体验,但是在打开大文件时依然很慢;busybox自带了一个精简版的less,勉强可用,但诸多细节依然不及完整版less)。因此,笔者萌生了编译windows版less的想法。

二、材料

1、编译器安装

编译less需要C++编译器和perl解释器。本文将以MinGW-w64 为例介绍C++编译器的安装,以Strawberry Perl 为例介绍perl解释器的安装。读者也可以选择其他编译器和解释器,但大致思路是相同的。

(1)MinGW-64

MinGW-w64 是一个大型项目,旨在将GNU Linux上的GCC编译器移植到Windows等系统上。熟悉Linux GCC编译器的同学应该很容易上手MinGW-64的编译器,二者在许多地方是相似的。

下载地址:

Github 存储库

根据Windows系统的对应架构选择合适的编译器版本并下载整合包,例如笔者所下载的就是 x86_64-12.2.0-release-win32-seh-msvcrt-rt_v10-rev2.7z 这个文件。下载后将其解压到D盘根目录(“解压文件到目标路径”; 读者也可以选择其他位置,但环境变量相应的需要改动 ),然后编辑系统环境变量(此电脑→属性→高级系统设置→环境变量),在 Path 这个变量中新建一条记录 D:\mingw64\bin 。修改环境变量的目的是方便后续在命令行中访问MinGW编译器,其应该与MinGW的安装路径一致。

现在打开Windows命令提示符(也可以用Windows Powershell),输入下列指令:

1
gcc --version

如果看到以下输出

1
2
3
4
gcc (x86_64-win32-seh-rev2, Built by MinGW-W64 project) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the sourcefor copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

则说明安装成功。

如果提示“gcc不是内部或外部命令,也不是可运行的程序或批处理文件”,则检查环境变量是否设置正确,或者环境变量是否与MinGW的安装路径一致。

(2)Strawberry Perl

Strawberry Perl 是Perl解释器在Windows系统上的实现。其安装方法很简单。只需要点击 官网链接 ,下载安装包,然后运行安装包,其会自动完成安装的过程,并配置好环境变量。

安装完成后,重启Windows命令提示符,输入下列指令:

1
perl -v

如果看到类似下面的输出

1
2
3
4
5
6
7
8
9
10
This is perl 5, version 32, subversion 1 (v5.32.1) built for MSWin32-x64-multi-thread

Copyright 1987-2021, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

则说明安装成功

2、less程序源代码

见 GNU less的官网 。网站上列出了一个FTP服务器(http://ftp.gnu.org/gnu/less/ ),点击访问,并下载最新版源代码压缩包。笔者所下载的版本是version 608(http://ftp.gnu.org/gnu/less/less-608.tar.gz )。

下载后在任意目录下解压,然后通过Windows命令提示符访问对应位置。整个源代码包的结构如下:

1
2
3
4
5
6
7
8
9
D:\linux\gcc\source\less-608>ls
COPYING Makefile.o2e brac.c configure defines.wn input.c lessecho.man line.c mkhelp.py output.c regexp.h version.c
INSTALL Makefile.o9c ch.c configure.ac edit.c install.sh lessecho.nro linenum.c mkinstalldirs pattern.c screen.c wide.uni
LICENSE Makefile.o9u charset.c cvt.c filename.c jump.c lesskey.c lsystem.c mkutable pattern.h scrsize.c xbuf.c
Makefile.aut Makefile.wnb charset.h decode.c fmt.uni less.h lesskey.h main.c optfunc.c pckeys.h search.c xbuf.h
Makefile.dsb Makefile.wng cmd.h defines.ds forwback.c less.hlp lesskey.man mark.c option.c position.c signal.c
Makefile.dsg Makefile.wnm cmdbuf.c defines.h.in funcs.h less.man lesskey.nro mkfuncs.pl option.h position.h tags.c
Makefile.dsu NEWS command.c defines.o2 help.c less.nro lesskey_parse.c mkfuncs.py opttbl.c prompt.c ttyin.c
Makefile.in README compose.uni defines.o9 ifile.c lessecho.c lglob.h mkhelp.pl os.c regexp.c ubin.uni

less的源代码包中提供了3个适用于windows系统的Makefile,分别是Makefile.wnb, Makefile.wng, Makefile.wnm ,他们对应于三种不同的C++编译器,分别是Bolarnd C++ 、MinGW-w64和Microsoft Visual C++ 。在这三个Makefile中,均标注了各自的编译方法,因此只需要按照其给出的方法编译即可。

三、编译方法

如前所述,less的源代码包中提供了编译所需的Makefile文件,因此我们直接编译即可。

我们使用的编译器是MinGW-w64,编译指令如下:

1
mingw32-make -f Makefile.wng REGEX_PACKAGE=regcomp-local

参数REGEX_PACKAGE指出了编译过程中应该链接到哪一个regex库。根据Makefile中的说明,我们指定REGEX_PACKAGE=regcomp-local即可,编译器会使用less源代码包自带的regex。

这里还有一个小插曲:

regex是一个正则表达式处理库,在Linux上自带,但是Windows上没有。默认编译选项指定REGEX_PACKAGE=posix,这会导致编译器从系统中链接regex库。笔者最开始采取的方法是另外安装regex,然而在网上只找到一个2.7版的regex库,编译过程中发现其与编译器不兼容。经过许多摸索,终于发现参数REGEX_PACKAGE的用法,遂设置REGEX_PACKAGE=regcomp-local,并一次编译成功。

编译完成后,当前目录下会出现三个新的exe文件,分别是less.exe, lessecho.exe, lesskey.exe 。输入下列指令

1
less.exe --version

当看到下面的输出时,表明安装成功:

1
2
3
4
5
6
7
less 608 (Spencer V8 regular expressions)
Copyright (C) 1984-2022 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Home page: https://greenwoodsoftware.com/less

四、使用

我们可以将less.exe, lessecho.exe, lesskey.exe这几个可执行文件的路径加入到系统的环境变量PATH当中,这样以后需要打开大文件时,只需要运行 less <filename> 即可。

less提供了多个参数,其中比较有用的参数有两个:

1
2
3
4
-N .........  --LINE-NUMBERS
Display line number at start of each line.
-S ........ --chop-long-lines
Chop (truncate) long lines rather than wrapping.

参数 -N 表示开启行号显示,参数 -S 表明长段落不换行显示(此时需要配合左右方向键进行浏览)。对于一些大文件,例如群体基因组变异文件VCF、制表符分隔的表格文件TSV等,这两个参数是极有用的。