翻译:如何写 SlackBuild 脚本
时间:2009-03-02
来源:互联网
链接:http://cn.fyodor.googlepages.com/SlackBuild.html
原文链接:http://slackwiki.org/Writing_A_SlackBuild_Script
翻译有不当的,望诸位不吝赐教。谢。
edit: 用 firefox 的打印到 pdf 功能,转换成 pdf 文件了,上传。
如何写 SlackBuild 脚本.pdf (139.1 KB, 117 次查看) |
作者: helo_aBiNg 发布时间: 2009-03-02
作者: ginkgo 发布时间: 2009-03-02
对于那个 ./configure --prefix=$PKG/usr 的问题,好像 slackbuilds.org 上出过问题的。就是虽然这样打出来的包结构是对的,但是里面的程序还是有可能去 $PKG/usr 下面找自己的库,安装的过程某种意义上说是 $PKG/usr => /usr 的过程,库的路径变了,安装之后的程序就没法启动了……
忽然又想到,咱们要不要有一个合作翻译 slackwiki 的计划(或者是项目)?
作者: grissiom 发布时间: 2009-03-02
-- 来自 SlackWiki
介绍
原作者:Florian Mueller (jjdm at jjdm.org)
增删者:Robby Workman (rworkman)
翻译者:aBiNg (cn.fyodor at gmail.com) @ 2009.03.01
如果你把 slackware 作为你的主操作系统,你很可能需要安装一些官方网 (slackware.com) 上所没有的应用程序,或者来自第三方源(例如 linuxpackages.net),或者你不想用第三方包。后一种情况下,你有几个安装应用程序的途径:
- ./configure && make && make install
- 使用 checkinstall
- 使用 installwatch
- 编译并使用 makepkg 打包
- 写 SlackBuild 脚本
我将讨论最后一个选择:写 SlackBuild 脚本,它包含了前述几种方式的所有优点。你可以通过 SlackBuild 脚本自动地完成所有编译任务,并且以后升级或者打补丁也很方便。SlackBuild 脚本也是 Patrick Volkerding 编译 Slackware 所有官方程序包的方式。如果看到不同源代码的大量脚本,你会发现它们通常包括两部分:独立于程序的部分和依赖于程序的部分。
我无法教给你写一个"完美"的脚本,因为达到这个目标需要对 Slackware 系统有较深入的理解。你得综合考虑你所提交的包与发行版的其它包之间的关系,二者必须"亲密无间"。我所能教的是以 "Slackware Way" 编译一个能运行的包。
"But it takes so much time!"
我将用大概 30 分钟讨论这篇指南,用 15 分钟去创建每个文件(实际编译过程略),但相比以后节省的时间,开始花点时间是值得的。
Slackware 包的结构
见 SlackWiki http://www.slackwiki.org/Packages#Sl...Package_Layout
设置编译环境
见 SlackWiki http://www.slackwiki.org/Build_Environment
准备工作
但愿你对 Slackware 包的结构现在已经清楚了,并且你已设置了一个干净的编译环境,我们开始经由 SlackBuild 脚本的编译之旅吧。
我们拿 latex2html 作为创建包的一个例子 -- 我在我的主页上已创建过这个包。
首先,建立文件夹 <build_environment>/latex2html/。获取 latex2html 最新源码包并放到此文件夹中。需要注意的是,下面使用 wget 下载源码的方式是可选的 -- 你完全可以用自己最喜欢的浏览器打开并下载它,然后再放到正确的目录中。
$ cd $ mkdir latex2html $ cd latex2html $ wget http://saftsack.fs.uni-bayreuth.de/~latex2ht/current/latex2html-2002-2-1.tar.gz # 05.02.2005
man touch
$ touch latex2html.SlackBuild $ touch slack-desc
$ tar -xzf latex2html-2002-2-1.tar.gz || exit 1
见 Slackwiki.org 上面的页面 Slack-desc,从中你会学到如何写一个合适的 slack-desc 文件。
写 SlackBuild 脚本
这是最占时间的部分,我将一步步来讨论。当你编译更多包的时候,你只需要复制现有 SlackBuild 脚本,然后再自定义它。首先我得提醒你,你可以用任何一种方式来写你的 SlackBuild 脚本,只要它能创建一个能正常运行包即可。现在所讲述的大概就是 Pat Volkerding 创建包的方式,但是即便是 Pat 本人也有几种写官方 SlackBuild 脚本的方式。因此,倘若你觉得应该以不同方式写,尽情去发挥吧。没有问题。
初始化脚本
用自己喜欢的编译器打开 latex2html.SlackBuild 文件。下面所要做的就是一点点地充实脚本了。你当然可以完全粘贴这些内容,但在笔者看来,自己动手将会使你更加理解其中的意思。
首先,你须设定你的 shell 解释器。这个应该是 /bin/sh,因为所有 Slackware 系统肯定都装有它,它会使脚本移植性更好。同此,你应该特别注意一下其它 shell(bash, zsh等) 的语法与 sh 的兼容性,它们不一定都通用。
#!/bin/sh
#<your name> revision date yyyy/mm/dd
#Set initial variables: CWD=$(pwd) if [ "$TMP" = "" ]; then TMP=/tmp fi
# 程序名的出现的版本号 VERSION=2002-2-1 # 如果版本与 Slackware 包冲突 # 符号 - 允许在 VERSION 中使用 # 你可以设置 PKG_VERSION 成不同于 VERSION 的值。 PKG_VERSION=2002.2.1 # 包名中出现的版本号 ARCH=${ARCH:-i486} # 首数字是编译次数 # 其次字符为作者的名字缩写,一般为三字符 BUILD=${BUILD:-1_rlw} # 应用程序名 APP=latex2html # 程序安装路径(真正的目录结构创建处) PKG=$TMP/package-$APP
if [ "$ARCH" = "i486" ]; then SLKCFLAGS="-O2 -march=i486 -mtune=i686" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-O2 -fPIC" fi
解包
# 删除之前遗留的目录(可能以前编译过),并重新创建 rm -rf $PKG mkdir -p $TMP $PKG rm -rf $TMP/$APP-$VERSION # cd 到 TMP 目录 cd $TMP || exit 1 # 在 TMP 目录中解包 # 注意点:如果程序包以 tar.bz2 结尾,当执行 tar -jxvf tar -zxvf $CWD/$APP-$VERSION.tar.gz || exit 1 # 转到程序源代码目录 cd $APP-$VERSION || exit 1 # 改所有者以及权限如果必要 # 也许并不一定所有包都这样做,但没有坏处 chown -R root:root . chmod -R u+w,go+r-w,a-s .
# 设置 configure 选项 # 如果程序用 C++ 语言写的,须给 CXXFLAGS 加一行 CFLAGS="$SLKCFLAGS" \ ./configure \ --prefix=/usr \ --sysconfdir=/etc \ --localstatedir=/var \ --with-perl=/usr/bin/perl \ --enable-eps \ --enable-gif \ --enable-png \ --build=$ARCH-slackware-linux \ --host=$ARCH-slackware-linux # 编译,有错退出 make || exit # 安装所有文档到包目录,有错退出 make install DESTDIR=$PKG || exit
- --prefix=/usr
- --sysconfdir=/etc
- --localstatedir=/var
设置文件会到 /etc 目录,状态文件(例如 log 文件)会到 /var 目录,其它都到 /usr 目录。
这就是通常意义上的 Slackware 方式,但你的系统你做主,你完全可以将所有资源装到 /usr/local 或其它目录。详情参见Unix 文件系统的继承标准。
你意识到可能还有别的选项传递给 configure 脚本,对每个要编译的应该程序来说,你必须理解这些选项的意义 -- 这也是之前解压源代码的原因。直接 cd 到源代码目录运行:
./confiugre --help
./configure --help | lpr ./configure --help | less
grep DESTDIR Makefile*
顺便提个建议:在你执行 SlackBuild 脚本之前,记得一定要手动以普通用户身份执行一遍 ".configure && make && make install DESTDIR=/somedir"。它会输出程序在安装过程中究竟做了哪些"趣事"。
例如,apcupsd 会试图给 /etc/rc.d/rc.6 打补丁。嗯,这可以经由 configure 脚本选项避免掉,但在你读懂所有 Makefiles(或者检查安装过程) 之前你并不清楚。
不管怎样,如果你以普通用户身份执行这些步骤,安装程序尝试写不被允许的地方时将会有 "Permission Denied" 的提示。
安装帮助文档
# 创建帮助文档目录 mkdir -p $PKG/usr/doc/$APP-$VERSION # 复制文档到指定目录,并设置权限 cp -a BUGS Changes FAQ INSTALL LICENSE MANIFEST README TODO docs/ $PKG/usr/doc/$APP-$VERSION find $PKG/usr/doc/$APP-$VERSION -type f -exec chmod 644 {} \;
cat $CWD/$APP.SlackBuild > $PKG/usr/doc/$APP-$VERSION/$APP.SlackBuild
最后一步
# 创建 ./install 目录,并复制 slack-desc 到该目录 mkdir -p $PKG/install cat $CWD/slack-desc > $PKG/install/slack-desc
# 如果有 doinst.sh,添加之 if [ -e $CWD/doinst.sh.gz ]; then zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh fi
# 去除不必要的库文件以及二进制文件 ( cd $PKG find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null ) # 如果有 man pages,压缩之 if [ -d $PKG/usr/man ]; then ( cd $PKG/usr/man find . -type f -exec gzip -9 {} \; for i in $(find . -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done ) fi # 如果有 info pages,压缩之(同时删除 dir 文件) if [ -d $PKG/usr/info ]; then gzip -9 $PKG/usr/info/*.info rm -f $PKG/usr/info/dir fi
# 打包 cd $PKG /sbin/makepkg -l y -c n $TMP/$APP-$PKG_VERSION-$ARCH-$BUILD.tgz
DESTDIR 变量不可用
正如上面所提到的,有些程序的 Makefiles 文件不支持 DESTDIR 选项。还有一些 DESTDIR 变量在 Makefiles 中用了别的名称。例如,Qt 程序中有些是使用 INSTLL_ROOT 变量代替的。如果你懂 Makefiles,值得你花点时间精读一下它的内容并努力搞懂安装规则中的具体执行操作。糟糕的是,有时根本没有 DESTDIR 类似的变量。最好的办法就是给 Makefile.in 打补丁或类似的操作,并发送给开发者完美代码,但我知道不是所有都有能力这么做。退而求其次的就是写信给开发者,并请求在后来的版本中加入该功能。同时,现在有些变通的方法。
例1
连同别的选项这样执行 configure 脚本:
./configure --prefix=$PKG/usr
./configure --prefix=$PKG/usr \ --sysconfdir=$PKG/etc \ --localstatedir=$PKG/var
例2
这个例子将使用一种覆盖 Makefile 变量的方法,该方法在 Makefile 词条学中被称为 "macro",只基于命令行,故不必担心为了添加 DESTDIR 宏而给 Makefile 打补丁,而且还给那些不熟悉 Makefiles 语法的人带有便利。
如果 Makefile 文件中 'make install' 命令不带 DESTDIR,你可以改变预定义宏,这样:
make prefix=$PKG/usr install
重点:宏名称是分大小写的(至少 GNU make 是这样)。有些 Makefiles 使用 "PREFIX =" 宏替代通常的 "prefix =",因而 'make intall' 命令应该像这样写:
make PREFIX=$PKG/usr install
grep -i '^prefix \?=' Makefile{,.in}
你正处理的 Makefile 文件中一旦有未定义的 "PREFIX =",这种情况下就可以使用 /usr(或 /usr/local)了,再 'make PREFIX=$PKG/usr install' 安装到程序的编译位置。
给源代码打补丁
总有一些原因,迟早会让你在编译之前给源代码打补丁,并且你应该能够自动完成它。
获取补丁
大多数情况下,补丁由代码作者提供,所以我们不必在这儿讨论写补丁的问题。下载并将它放到与 SlackBuild 脚本,slack-desc 文件,以及别的相关文件相同的目录(即 $CWD)。
$ wget http://someapplication.org/files/pat...ritypatch.diff
$ gzip -9 bigsecuritypatch.diff
打补丁
现在编译 .SlackBuild 脚本,在 'configure, make, make install' 之前打好补丁。类似这样在 configure 脚本运行之前运行:
zcat $CWD/bigsecuritypatch.diff.gz | patch -p1 || exit
zcat $CWD/bigsecuritypatch.diff.gz | patch -p0 || exit
参考
- SlackBuild_Scripts
- Different_Approach_To_Buildscripts
- Building_A_Package
- Slack-desc
- Checkinstall
- Compiling
作者: windrose 发布时间: 2009-03-02
作者: lionux 发布时间: 2009-03-02
开发者不按 configure 规则来,怕是要麻烦包维护者了。
SlackWiki 词条不很多,但是,国内 Slacker 更不是很多,我觉得可以先着手重要部分,合作完成。
话说回来,国内 Slacker 估计不精通英文的怕是不多,我都觉得这篇翻译有点多余了似乎。
to windrose:
html 中有用了 <xmp></xmp> tag,论坛不支持吧?代码引用格式有的已乱了。谁熟悉 tex,帮做成 pdf,或者我自己学去吧,还是个未入门者呢。
作者: helo_aBiNg 发布时间: 2009-03-02
slackbuild是针对slackware构建,所以最好所有包都用slackbuild构建,不然可能会出现grimssion的问题,我觉得是这样的
作者: slackcode 发布时间: 2009-03-02
作者: vvoody 发布时间: 2009-03-02
作者: helo_aBiNg
to grimssion:
开发者不按 configure 规则来,怕是要麻烦包维护者了。 SlackWiki 词条不很多,但是,国内 Slacker 更不是很多,我觉得可以先着手重要部分,合作完成。 话说回来,国内 Slacker 估计不精通英文的怕是不多,我都觉得这篇翻译有点多余了似乎。 to windrose: html 中有用了 <xmp></xmp> tag,论坛不支持吧?代码引用格式有的已乱了。谁熟悉 tex,帮做成 pdf,或者我自己学去吧,还是个未入门者呢。 |
tex 谈不上熟悉但是会用一点~ 我抽空做下看?
作者: grissiom 发布时间: 2009-03-02
作者: wilsonwoo 发布时间: 2009-03-02
作者: panly 发布时间: 2009-03-04
作者: grissiom
其实貌似不按 configure 规则来的人比较少了,所以一般不会有什么问题~ 感觉上虽然英语能看,但是母语还是快一些,如果要是有谁牵头合作的话我就跟
tex 谈不上熟悉但是会用一点~ 我抽空做下看? |
使用时基本都不用去改
作者: slackcode 发布时间: 2009-03-05
作者: hao123liu 发布时间: 2009-03-16
作者: grissiom 发布时间: 2009-05-29
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28