编译狂魔笔记

前言

版本号什么的当然是越大越好!编译当然要找 master HEAD!

——窝自己说的

本文持续更新中。一些惯例,我的 prefix 都是 $HOME/.local,会有一些环境变量默认开启,所有的软件均使用静态链接默认动态静态全开吧。

ROOT="$HOME/.local"

GCC 系列

毕竟是用来编译其它软件的,最新的 GCC 才能编译出最新算法优化过的二进制文件,所以首先解决 GCC 和它的依赖。具体的依赖见 https://gcc.gnu.org/install/prerequisites.html

GMP

The GNU Multiple Precision Arithmetic Library 官网 https://gmplib.org/ ,高精度处理库,无任何依赖。

使用 Mercurial 管理源码,一般来说我不会去编译版本管理系统,直接用包管理器下载 mercurial,然后 clone:

hg clone https://gmplib.org/repo/gmp/

需要去 gmp 目录下手动跑一下 ./.bootstrap 生成 configure。完事儿之后直接 ln -s 到 gcc 目录下就好了,不用手动编译。

MPFR

Multiple Precision Floating-Point Reliably,依赖于 GMP,但对于浮点数做了专精。官网 https://www.mpfr.org/

svn checkout https://scm.gforge.inria.fr/anonscm/svn/mpfr/trunk mpfr

同理,需要在 mpfr 目录下手动执行 ./autogen.sh 生成 configure,这里有个 autoconf-archive 的包依赖,包管理器或者手动安装均可。完事儿后链接到 gcc 目录下即可。

MPC

Multi Precision Complex 依赖于 MPFR 和 GMP,对于复数做了专精。官网 http://www.multiprecision.org/mpc/

git clone git://scm.gforge.inria.fr/anonscm/git/mpc/mpc.git

同理,需要在 mpc 目录下手动执行 autoreconf -fvim。完事儿后链接到 gcc 目录下即可。

ISL

似乎是个整数集合库,没用过不知道干啥的。官网 http://isl.gforge.inria.fr/(官网 UI 透露着一股贫穷的气息)。

git clone git://repo.or.cz/isl.git

同理,需要在 isl 目录下手动执行 autoreconf -fvim。完事儿后链接到 gcc 目录下即可。

GCC

第一个里程碑。官网 https://gcc.gnu.org/

GCC 最近彻底从 SVN 迁移到 Git 了,可喜可贺可喜可贺。GCC 自己有一个 git 服务器,如果不喜欢的话也可以用 github.com 上的 gcc-mirror(不知道为啥 GitHub 上的大了一倍)。

git clone git://gcc.gnu.org/git/gcc.git

GCC 中除了 gcc 是自依赖的,还有一个 gnat 也就是 Ada 编译器,它也是依赖自身的,也就是我们需要一个旧版本的 gnat 编译器,如果有强迫症想要装的话可以先用包管理器装一个 gnat。

确保已经将 gmp, mpfr, mpc, isl 目录链接好以及 autoreconf 生成了 configure——当然你也可以手动安装之后在 configure 中指定 --with-* 或者用环境变量 LD_RUN_PATH 来帮助 configure 寻找。

接下来就是 configure。configure 最好不要在 gcc 目录下进行——虽然允许——否则会让预处理和编译生成的文件混杂在源码中。建议在 gcc 外新建一个目录后 ../gcc/configure。我的 configure 命令为:

# CWD is $HOME/.local/src/gcc
../gcc/configure \
  --prefix=$HOME/.local/opt/gcc \
  --enable-languages=all \
  --disable-multilib
make --jobs && make install --jobs

然后 make 即可,视情况指定 --jobs。我因为不希望我的 $HOME 出现在 gcc -v 中,所以在 configure 的时候没有指定 prefix,在 configure 生成的 Makefile 中第 55 行(可能会视版本不同而变化)手动编辑了 prefix 再 make 的。

GCC 的具体编译有三个阶段:

  1. 用 bootstrap GCC(即用户指定的编译器,或默认系统自带的编译器)编译出第一版 GCC,此版 GCC 的内部仍然是 bootstrap GCC 使用的代码生成、代码优化算法生成的二进制文件。
  2. 用第一版 GCC 编译出第二版 GCC,此版 GCC 内部是新版 GCC 算法生成的二进制文件。如果需要编译静态 GCC 而传了 --with-boot-ldflags=-static,此处的 xgcc 和 xg++ 应该是静态链接的,可以在 stage_current 为 stage3 的时候测试一下 ldd prev-gcc/x{gcc,g++}
  3. 用第二版 GCC 编译出第三版 GCC,检查和第二版有无区别,如果没有差异则编译通过。同理此处也是静态链接的。

默认情况下以上三步均会被执行,可以选择跳过第三步,详细参数见 GCC 官网 configure 指令。编译期间可以在构建目录下查看文件 stage_current 确定当前的阶段。编译耗时视机器配置大概需要半小时到一小时。

最后不出意料的话,生成的主要编译器包括 gcc, g++, gdc, gfortran, gnat, gccgo。记得重点测试一下 gcc 和 g++ 可不可用,毕竟后面用得到。

其实还有一个链接库 libgccjit 此处没有编译,如果需要的话,要在 configure 阶段加上 --enable-host-shared 参数,而且不能把 gmp, mpfr, mpc 链接到 gcc 目录下,需要单独手动编译,不然会链接错误(不知道为啥)。

# GCC
export PATH="$ROOT/opt/gcc/bin${PATH:+:$PATH}"
export CPATH="$ROOT/opt/gcc/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/gcc/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LIBRARY_PATH="$ROOT/opt/gcc/lib64${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/gcc/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_RUN_PATH="$ROOT/opt/gcc/lib64${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/gcc/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/gcc/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/gcc/share/man${MANPATH:+:$MANPATH}"
export INFOPATH="$ROOT/opt/gcc/share/info${INFOPATH:+:$INFOPATH}"

Golang

Golang 编译器是我目前为止见过的最容易编译的编译器,就简单写一下吧。

官方仓库在 https://go.googlesource.com/go,github 上有镜像(但是总体积比 googlesource 上的大 1GiB 多)。

git clone https://go.googlesource.com/go.git

构建文档见 https://golang.org/doc/install/source,就是一个 ./all.bash 的事情。不过和 GCC 类似,也需要一个老版本的 go 环境。偷懒的话可以直接用包管理器安装,或者从 golang.org 上下载最新的二进制包安装,具体过程就略过了,记得设置环境变量。

go 编译好后的安装过程需要手动执行,注意目标目录不能和源码目录相同(就是不执行安装)。由于目标目录需要包含 src 目录下的包源码文件以 import,所以不在 $HOME/.local安装,而是安装到 $HOME/.local/go 中,防止 $HOME/.local/src 和 go 的包源码在同一个目录下(不好卸载)。

cd $HOME/.local/src/go/src
# CWD is $HOME/.local/src/go/src
GOROOT_BOOTSTRAP=$GOROOT GOROOT_FINAL=$HOME/.local/go ./all.bash
rsync --archive --delete --exclude=obj ../{bin,pkg,src} $HOME/.local/go

Fossil SCM 和 SQLite3

这俩一起说的原因是 Fossil SCM 依赖 SQLite3 去管理仓库元数据,而 SQLite3 则需要 Fossil 来下载管理源码。嗯,某种意义上的循环依赖。

Fossil

我连 Git 都没有编译,却编译了 Fossil 的原因是 Debian 包管理器里的 Fossil 太老了,不支持下载 sqlite3 的仓库,所以就先从官网 https://www.fossil-scm.org 下载了一套二进制包,然后获取最新的版本后重新编译。

fossil clone https://www.fossil-scm.org fossil.fossil
fossil open fossil.fossil

因为 --with-openssl=auto 只会在 auto.def 336 和 337 行硬编码的几个地方去找,自然不会包括我自己设定的目录,所以只能手动指定目录了。

# CWD is $HOME/.local/src/fossil
../fossil/configure \
  --prefix=$HOME/.local/opt/fossil \
  --with-zlib=auto \
  --with-openssl=$HOME/.local/opt/openssl \
  --json
make --jobs && make install --jobs

Readline

Readline 是一个优化命令行交互的库,被 SQLite 和 Python 依赖。官网 https://tiswww.case.edu/php/chet/readline/rltop.html

git clone https://git.savannah.gnu.org/git/readline.git
# CWD is $HOME/.local/src/build-readline
../readline/configure \
  --prefix=$HOME/.local/opt/readline \
  --enable-multibyte
make --jobs && make install --jobs
# Readline
export CPATH="$ROOT/opt/readline/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/readline/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/readline/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/readline/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/readline/man${MANPATH:+:$MANPATH}"
export INFOPATH="$ROOT/opt/readline/info${INFOPATH:+:$INFOPATH}"

Tcl/Tk

Fossil 编译期弱依赖,SQLite 编译期强依赖(生成头文件)。官网 https://www.tcl.tk/(这页面设计,还以为进了什么广告网站)。

fossil clone https://core.tcl-lang.org/tcl tcl.fossil
fossil open tcl.fossil
# CWD is $HOME/.local/src/build-tcl
../tcl/unix/configure \
  --prefix=$HOME/.local/opt/tcl \
  --enable-64bit \
  --enable-64bit-vis \
  --enable-dll-unloading \
  --enable-dtrace
make --jobs && make install --jobs
# CWD is $HOME/.local/opt/tcl/bin
ln -s tclsh9.0 tclsh

SQLite

SQLite3 是轻量级的文件数据库管理软件,官网 https://www.sqlite.org。在后面的 Python 中有一个到 SQLite 的可选依赖

fossil clone https://www.sqlite.org/src sqlite.fossil
fossil open sqlite.fossil
sed --in-place 's/TCL_CHANNEL_VERSION_2/TCL_CHANNEL_VERSION_5/g' src/tclsqlite.c
export CFLAGS='-DCONST=const -DTCL_CHANNEL_VERSION_2=TCL_CHANNEL_VERSION_5'
../sqlite/configure \
  --prefix=$HOME/.local/opt/sqlite \
  --enable-tempstore \
  --enable-memsys5 \
  --enable-memsys3 \
  --enable-all \
  --enable-fts3 \
  --enable-update-limit
make --jobs && make install --jobs

CPython 解释器及其模组

CPython 的静态编译主要分两大部分,一是解释器本身,二是各种模组。默认情况下,模组都是以动态链接的方式作为 python 的一部分的,当需要静态编译的时候,我们就必须要把所有模组直接嵌入 python 二进制中。

Zlib

Zlib 是一个比较基础的库,提供压缩和解压能力,官网在 https://zlib.net/,不做详细介绍。

git clone https://github.com/madler/zlib.git

非常基础,没有什么依赖,因此编译也很简单,直接 configure 然后 make 即可。

# CWD is $HOME/.local/src/build-zlib
../zlib/configure --prefix=$HOME/.local/opt/zlib
make -j && make install
# Zlib
export CPATH="$ROOT/opt/zlib/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/zlib/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/zlib/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/zlib/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/zlib/share/man${MANPATH:+:$MANPATH}"

OpenSSL

用于加密解密的软件包,内置大量密码学算法,官网 https://www.openssl.org/

git clone git://git.openssl.org/openssl.git
# CWD is $HOME/.local/src/openssl
../openssl/config \
  --prefix=$HOME/.local/opt/openssl \
  enable-ktls \
  enable-ec_nistp_64_gcc_128 \
  enable-egd \
  enable-weak-ssl-ciphers \
  enable-md2 \
  enable-rc5 \
  zlib-dynamic
make --jobs && make install
# OpenSSL
export PATH="$ROOT/opt/openssl/bin${PATH:+:$PATH}"
export CPATH="$ROOT/opt/openssl/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/openssl/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/openssl/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/openssl/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/openssl/share/man${MANPATH:+:$MANPATH}"

GPM

GPM 全称 General Purpose Mouse,为 console 程序提供复制粘贴的能力。是 ncurses 的可选依赖之一。

官网在 https://www.nico.schottelius.org/software/gpm/,然而上面的仓库链接失效了,用 GitHub 上的。

git clone [email protected]:telmich/gpm

GPM 和 ncurses 之间有循环依赖的问题。默认情况下 GPM 依赖 ncurses,可以选择 --without-ncurses 来消除依赖。但按 LFS,这同时会导致一些依赖这种关系的软件无法通过编译(如 w3m),大部分发行版的解决方案是在编译完 ncurses 后不传入该参数再编译一次 GPM,我这里就不进行该操作了。

GPM 的配置和编译需要在源码目录下进行,作者没有考虑过在源码目录外编译的情况(垃圾代码)。

./autogen.sh
./configure --prefix=$HOME/.local/opt/gpm --without-ncurses
make --jobs && make install --jobs
# GPM
export PATH="$ROOT/opt/gpm/bin${PATH:+:$PATH}"
export PATH="$ROOT/opt/gpm/sbin${PATH:+:$PATH}"
export CPATH="$ROOT/opt/gpm/include${CPATH:+:$CPATH}"
export LD_LIBRARY_PATH="$ROOT/opt/gpm/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/openssl/share/man${MANPATH:+:$MANPATH}"
export INFOPATH="$ROOT/opt/openssl/share/info${MANPATH:+:$MANPATH}"

NCURSES

NCURSES 即 New curses,官网 https://invisible-island.net/ncurses/,提供了丰富的终端 UI 控制接口。被大量库和应用程序所依赖,是一个很基础的系统库。

官方(似乎,至少我没找到)没有公开 Git 服务器,代码提交都以 patch 形式发布在 https://invisible-mirror.net/archives/ncurses/ 上。方便起见,这里用 GitHub 镜像 https://github.com/mirror/ncurses

configure 具体含义参考 INSTALL 文件。

../ncurses/configure \
  --prefix=$HOME/.local/opt/ncurses \
  --enable-colorfgbg \
  --enable-const \
  --enable-ext-colors \
  --enable-ext-mouse \
  --enable-ext-putwin \
  --enable-fvisibility \
  --enable-getcap \
  --enable-getcap-cache \
  --enable-hard-tabs \
  --enable-interop \
  --enable-opaque-form \
  --enable-opaque-menu \
  --enable-opaque-panel \
  --enable-pthread-eintr \
  --enable-sigwinch \
  --enable-sp-funcs \
  --enable-symlinks \
  --enable-wgetch-events \
  --enable-widec \
  --enable-xmc-glitch \
  --with-gpm \
  --with-pthread \
  --with-termlib \
  --with-ticlib \
  --without-debug
# Ncurses
export PATH="$ROOT/opt/ncurses/bin${PATH:+:$PATH}"
export CPATH="$ROOT/opt/ncurses/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/ncurses/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/ncurses/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/ncurses/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/openssl/share/man${MANPATH:+:$MANPATH}"
#export TERMINFO="$ROOT/opt/openssl/share/terminfo"  # default

GDBM

GDBM 即 DBM 的 GNU 实现,全称 GNU Database Manager。DBM 是 Unix 上的一个简单键值对数据库,GDBM 为 DBM 的扩展,也包含了兼容的接口。官网 https://www.gnu.org.ua/software/gdbm/

git clone git://git.gnu.org.ua/gdbm.git

需要用 ./bootstrap 生成和下载一下 configure 和 .po 翻译文件。另外,源码中有几个地方需要修改一下加入 extern

diff --git a/src/parseopt.c b/src/parseopt.c
index 268e080..252bb86 100644
--- a/src/parseopt.c
+++ b/src/parseopt.c
@@ -255,8 +255,8 @@ print_option_descr (const char *descr, size_t lmargin, size_t rmargin)
 }


 char *parseopt_program_name;
-char *parseopt_program_doc;
-char *parseopt_program_args;
+extern char *parseopt_program_doc;
+extern char *parseopt_program_args;
 const char *program_bug_address = "<" PACKAGE_BUGREPORT ">";
 void (*parseopt_help_hook) (FILE *stream);


Python 中包含 DBM 和 GDBM 模块,如果需要编译 Python 的 DBM 模块,编译 GDBM 的时候需要指定 --enable-libgdbm-compat

../gdbm/configure --prefix=$HOME/.local/opt/gdbm --enable-libgdbm-compat
make --jobs && make install --jobs
# GDBM
export PATH="$ROOT/opt/gdbm/bin${PATH:+:$PATH}"
export CPATH="$ROOT/opt/gdbm/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/gdbm/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/gdbm/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/gdbm/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/gdbm/share/man${MANPATH:+:$MANPATH}"
export INFOPATH="$ROOT/opt/gdbm/share/info${MANPATH:+:$MANPATH}"

Gzip

非常著名的压缩软件,基本是 Linux 标配,因此不做介绍了。官网 https://www.gzip.org/

git clone https://git.savannah.gnu.org/git/gzip.git

编译前也需要先生成 configure 文件。

# CWD is $HOME/.local/src/gzip
./bootstrap
# CWD is $HOME/.local/src/build-gzip
../gzip/configure --prefix=$HOME/.local/opt/gzip
make --jobs && make install --jobs

Bzip2

也是比较著名的压缩软件了,不多做介绍。官网 http://www.bzip.org/

git clone git://git.code.sf.net/p/bzip2/bzip2.git

由于没有 configure,所以需要在安装的时候指定 PREFIX。首先安装动态链接库,这样对象文件会使用 -fPIC 编译,在接下来的静态链接也可以直接使用。

make --makefile Makefile-libbz2_so --jobs
make install --makefile Makefile-libbz2_so --jobs PREFIX=$HOME/.local/opt/bzip2
make --jobs && make install --jobs PREFIX=$HOME/.local/opt/bzip2

如果先静态链接的话,由于编译时不会带上 -fPIC,编译出来的对象文件无法直接用于动态链接,需要重新编译一遍。

# Bzip2
export PATH="$ROOT/opt/bzip2/bin${PATH:+:$PATH}"
export CPATH="$ROOT/opt/bzip2/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/bzip2/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/bzip2/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/bzip2/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/bzip2/man${MANPATH:+:$MANPATH}"

XZ

是使用 LZMA 压缩算法的压缩软件(和库),是 Python _lzma 包的依赖,官网在 https://tukaani.org/xz/

git clone https://git.tukaani.org/xz.git
# CWD is $HOME/.local/src/xz
./autogen.sh
# CWD is $HOME/.local/src/build-xz
../xz/configure --prefix=$HOME/.local/opt/xz
make --jobs && make install --jobs
# XZ
export PATH="$ROOT/opt/xz/bin${PATH:+:$PATH}"
export CPATH="$ROOT/opt/xz/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/xz/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/xz/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/xz/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/xz/man${MANPATH:+:$MANPATH}"

LibFFI

提供到 C 的 FFI 的能力,是 _ctypes 的依赖,官网 https://sourceware.org/libffi/

git clone https://github.com/libffi/libffi.git
../libffi/configure --prefix=$HOME/.local/opt/libffi
make --jobs && make install --jobs
# LibFFI
export CPATH="$ROOT/opt/libffi/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/libffi/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/libffi/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/libffi/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export LIBRARY_PATH="$ROOT/opt/libffi/lib64${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/libffi/lib64${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/libffi/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/libffi/share/man${MANPATH:+:$MANPATH}"
export INFOPATH="$ROOT/opt/libffi/share/info${INFOPATH:+:$INFOPATH}"

CPython

解释器本身,第二个大里程碑。官网 https://www.python.org/

git clone https://github.com/python/cpython

需要注意的是,一部分依赖需要用到 pkg-config 来寻找,所以上面的依赖项 PKG_CONFIG_PATH 也要设置成适当的值。有些依赖需要手动修改 setup.py 来增加 include 路径。

for library in $(tr : ' ' <<< $LIBRARY_PATH)
do
  export LDFLAGS="-L$library $LDFLAGS"
done

../cpython/configure \
  --prefix=$HOME/.local/opt/cpython \
  --enable-shared \
  --enable-optimizations \
  --enable-loadable-sqlite-extensions \
  --enable-ipv6 \
  --enable-big-digits \
  --with-lto \
  --with-system-expat \
  --with-system-ffi \
  --with-ensurepip \
  --with-openssl
make --jobs && make install --jobs

Tmux

这里先流水账记一下。

libevent

Tmux 强依赖。

git clone https://github.com/libevent/libevent.git
# CWD is $HOME/.local/src/libevent
./autogen.sh
# CWD is $HOME/.local/src/build-libevent
../libevent/configure --prefix=$HOME/.local/opt/libevent
make --jobs && make install --jobs
# Libevent
export PATH="$ROOT/opt/libevent/bin${PATH:+:$PATH}"
export CPATH="$ROOT/opt/libevent/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/libevent/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/libevent/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export PKG_CONFIG_PATH="$ROOT/opt/libevent/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"

Libutempter

git clone git://git.altlinux.org/people/ldv/packages/libutempter.git
# CWD is $HOME/.local/src/libutempter/libutempter
make --jobs
make install --jobs DESTDIR=$HOME/.local/opt/libutempter
# Libutempter
export CPATH="$ROOT/opt/libutempter/usr/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/libutempter/usr/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/libutempter/usr/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/libutempter/usr/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/libutempter/usr/share/man${MANPATH:+:$MANPATH}"

Utf8Proc

git clone https://pithub.com:JuliaStrings/utf8proc.git
# CWD is $HOME/.local/src/utf8proc
make --jobs
make install --jobs prefix=$HOME/.local/opt/utf8proc
# Utf8Proc
export CPATH="$ROOT/opt/utf8proc/include${CPATH:+:$CPATH}"
export LIBRARY_PATH="$ROOT/opt/utf8proc/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
export LD_RUN_PATH="$ROOT/opt/utf8proc/lib${LD_RUN_PATH:+:$LD_RUN_PATH}"
export LD_LIBRARY_PATH="$ROOT/opt/utf8proc/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export MANPATH="$ROOT/opt/utf8proc/share/man${MANPATH:+:$MANPATH}"
export PKG_CONFIG_PATH="$ROOT/opt/utf8proc/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"

Tmux

git clone https://github.com/tmux/tmux.git
../tmux/configure \
  --prefix=$HOME/.local/opt/tmux \
  --enable-utempter \
  --enable-utf8proc
make --jobs && make install --jobs
# Tmux
export PATH="$ROOT/opt/tmux/bin${PATH:+:$PATH}"
export MANPATH="$ROOT/opt/tmux/share/man${MANPATH:+:$MANPATH}"

One Reply to “编译狂魔笔记”

  1. 这也tql, %%%

发表评论