modified: Pkgfile-yczhu.md

Signed-off-by: Zhang, Guodong <gdzhang@linx-info.com>
This commit is contained in:
Zhang, Guodong
2015-09-01 09:59:24 +08:00
parent d150ac142c
commit 5e30dd388f

View File

@@ -2,19 +2,20 @@
## 1. 概述
`Pkgfile`遵循bash shell的语法规则所以它看上去像是一个bash shell脚本但不能称之为脚本因为它不能单独执行它只能作为pkgmk命令执行过程的配置文件。
`Pkgfile`文件利用自身定义的变量以及函数, 为 “pkgmk命令应该怎样去编译一个二进制包“ 制定好了规则。
pkgmk命令会根据Pkgfile中的环境设置编译出满足特定需求的二进制软件包因为./configure 命令和它的参数,以及 make 命令和它的参数都写在了`Pkgfile`中)。
从这里就可以看出Pkgfile的存在到底有什么意义试想一下如果咱们不用Pkgfile那么每次编译一个软件包的时候就需要咱们重复去写./configure的内容、make的具体内容这显然增加了咱们的工作 量,降低了工作效率。当然,这只是最显而易见的配置,与在这样的配置下体现出来的优势,其实这个文档中还有其他很多配置,比如安全性配置,打补丁等
Pkgfile遵循bash shell的语法规则所以它看上去像是一个bash shell脚本但不能称之为脚本因为它不能单独执行它只能作为pkgmk命令执行过程的配置文件。Pkgfile文件利用自身定义的变量以及函数
为 “pkgmk命令应该怎样去编译一个二进制包“ 制定好了规则。pkgmk命令会根据Pkgfile中的环境设置编译出满足特定需求的二进制软件包因为./configure 命令和它的参数,以及 make 命令和它的参数都写在了这个
文件中。从这里就可以看出Pkgfile的存在到底有什么意义试想一下如果咱们不用Pkgfile那么每次编译一个软件包的时候就需要咱们重复去写./configure的内容、make的具体内容这显然增加了咱们的工作
量,降低了工作效率。当然,这只是最显而易见的配置,与在这样的配置下体现出来的优势,其实这个文档中还有其他很多配置,比如安全性配置,打补丁等,这些知识都会随着作者使用经验的增加而添加进这个文档,
详细说明之。
本文档将会介绍Pkgfile文件的格式看懂了基本格式再加上以后使用中慢慢地体会就会理解使用pkgmk命令编译二进制软件包的所以然和Pkgfile文档给我们带来的方便。在介绍格式的过程中咱们以阅读编译
apache时用到的Pkgfile文件[点击查看](http://gitlab.rd.in.linx/linx6.0.42/applications/tree/4.2/daily-build/packages/a/apache)的形式进行。
我会以给代码添加注释的方式介绍Pkgfile文档约定注释行以```//```开头。为什么不用“#”因为Pkgfile中的注释用的是#,我用//以示区别没别的意思。对于在编译apache二进制包的Pkgfile中没有涉及到的内容会另行介绍。
`我会以给代码添加注释的方式介绍Pkgfile文档约定注释行以//开头`。为什么不用“#”因为Pkgfile中的注释用的是#,我用//以示区别没别的意思。对于在编译apache二进制包的Pkgfile中没有涉及到的内容会另行介绍。
还有一点需要明确的是当咱们拿到一个源码包需要把它编译成咱们需要的二进制包的时候需要自己动手从头到尾写一个Pkgfile文件吗答案是不需要。可以下载要编译的源码包到工作目录新建的那个用来
编译二进制包的目录切换到工作目录下之后在命令行输入命令mkpkgfile就可以生成一个Pkgfile文件然后按照特定的需求进行改动这个文件始终位于咱们在编译安装包的工作目录中。
另外下面是《鸟哥的Linux私房菜.基础学习篇第二版》第412页的一段话我觉得对咱们理解编译二进制包有一定的帮助摘抄如下
另外下面是《鸟哥的Linux私房菜.基础学习篇第二版》第412页的一段话我觉得对咱们理解编译二进制包有一定的帮助摘抄如下
是否想过如果您的Linux系统与厂商的系统一模一样那么在厂商的系统上编译出来的执行文件自然也就可以在您的系统上运行了。也就是说厂商先在他们的系统上编译好用户所需要的套件然后将编译好的
可执行套件直接发布给用户安装这样由于我们本来就使用厂商的Linux版本系统是一样的那么使用厂商提供的编译好的可执行文件就没有问题。简而言之利用类似Windows的安装方式由程序开发人员直接在
已知的系统上编译好,再将该程序供用户安装。
@@ -24,10 +25,8 @@ apache时用到的Pkgfile文件[点击查看](http://gitlab.rd.in.linx/linx6.0.4
咱们来看看编译apache二进制包时用到的Pkgfile文档我会尽最大努力把我认为需要加注释的行添加上注释。这个文档它并没有囊括Pkgfile的所有知识点对于那些没有在这个Pkgfile文档中体现出来的知识点会作另行介绍。
```bash
#!/bin/bash
//这里添加一个`#!/bin/bash`为了大家使用vim打开的时显示语法高亮无实际意义。
//其他的以#开头的行都是注释用于描述Pkgfile文档的一些基本信息。
# $Id: Pkgfile,v 1.5 2005/03/09 18:59:59 jue Exp $
#!/bin/bash // 告诉系统环境用系统中的哪个shell来执行这个文档作用跟shell脚本中的作用一样
# $Id: Pkgfile,v 1.5 2005/03/09 18:59:59 jue Exp $ //其他的以#开头的行都是注释用于描述Pkgfile文档的一些基本信息
# Description: Apache HTTP server version 2.0.x
# URL: http://httpd.apache.org/
# Depends on: apr, openssl
@@ -54,30 +53,24 @@ apache时用到的Pkgfile文件[点击查看](http://gitlab.rd.in.linx/linx6.0.4
#
#
name=apache // name在这里就是声明了一个变量此变量表示要生成的二进制包的名字。这里需要apache的二进制包所以给name变量赋值时用了apache。
// 要编译什么包,改成什么包名字就好。
version=2.4.12 // version变量表示的是所用的源码包的版本这里从网上下的apache的源码包的版本是2.4.12所以给version变量赋值时用的是2.4.12。
// 要编译的源码包是什么版本,改成对应版本号就好。
LINX_VERSION=linx // 这里加的信息表示的是,此包在凝思维护的版本号。
// 这里咱们没有对apache作任何改动所以这里咱们自己的版本为linx
// 假如哪天咱们改变了这个包里的内容那这个版本号会改成linx1还是
name=apache // name在这里就是声明了一个变量此变量表示要生成的二进制包的名字。这里需要apache的二进制包所以给name变量赋值时用了apache。要编译什么包,改成什么包名字就好。
version=2.4.12 // version变量表示的是所用的源码包的版本这里从网上下的apache的源码包的版本是2.4.12所以给version变量赋值时用的是2.4.12。要编译的源码包是什么版本,改成对应版本号就好。
LINX_VERSION=linx // 这里加的信息表示的是,同样的包在咱们公司的版本号。这里咱们没有对apache作任何改动所以这里咱们自己的版本为linx假如哪天咱们改变了这个包里的内容那这个版本号会改成linx1还是
// 这个包再改就是linx2依次类推。直到哪天人家的源码包的版本号变了咱们又会从linx开始。
release=${PKGMK_ARCH}-${LINX_VERSION}-${OS_VERSION}
// release变量声明${}是咱们熟悉的shell脚本中对变量的引用
// LINUX_VERSION这个变量是咱们在上两行中定义的
// PKGMD_ARCH和OS_VERSION是从那里来的呢这就是运行这个Pkgfile的pkgmk脚本中提供的。
// PKGMK_ARCH变量表示的是编译软件包的体系结构取自命令uname -m具体定义可在pkgmk脚本中查看, 比如x68_64ia64等。
release=${PKGMK_ARCH}-${LINX_VERSION}-${OS_VERSION} // 显然release又是变量声明${}是咱们熟悉的shell脚本中对变量的引用。LINUX_VERSION这个变量是咱们在上两行中定义的那PKGMD_ARCH和
// OS_VERSION是从那里来的呢这就是运行这个文档的环境提供的
// PKGMK_ARCH变量表示的是系统环境所使用的微处理器的类型比如x68_64ia64等。
// OS_VERSION变量表示的是操作系统的版本号比如Rocky4.2。
source=(http://www.apache.org/dist/httpd/httpd-$version.tar.gz \ // source中列出的是在编译二进制包的过程中会用到的源码包要打的补丁包等。用pkgmk命令编译需要的二进制包的过程中会在工作
$name-$version-ssl_cert.patch linx.layout apache \ // 目录下检查所有在这里列出的软件包是否存在于当前的工作目录下,如果存在,编包过程中会将这些包拷贝到在工作目录下生成的
httpd-$version-LINX-conf.patch) // work/src目录下这个目录是在编包过程中生成的开始时没有如果不存在会在URL指出的地址下载如果连URL中都没有
// 就会报错。如果不把需要用到的软件包列在source下但是在工作目录下存在也没有问题可以编出需要的软件包但这不规范。
build(){ // build部分是Pkgfile文档的核心部分所有在编译二进制包的过程中用到的命令都是在这里完成的。
cd httpd-$version // 切换到解压缩后的源代码目录下。在编译apache二进制包时解压缩的是httpd-2.4.12.tar.gz所以这里比较特殊。
// 一般情况是解压缩的源码包和要生成的二进制包是同名的所以这条命令是cd $name-$version
@@ -89,7 +82,7 @@ build(){ // buil
fi
if [ "$PKGMK_SEC" = "yes" ]; then // pkgmk命令在执行的时候可以加上选项当用了选项-s的时候$PKGMK_SEC=yes是成立的。这个选项主要用于给软件包设置安全属性。
patch -p1 < $SRC/httpd-$version-LINX-conf.patch
patch -p1 < $SRC/httpd-$version-LINX-conf.patch
fi
patch -p1 < $SRC/$name-$version-ssl_cert.patch
cat ../linx.layout >> config.layout
@@ -106,7 +99,7 @@ build(){ // buil
// 看INSTALL文件的具体内容它会给出咱们需要的信息。好在一些比较通用的选项会在用mkpkgfile生成Pkgfile的时候自动添加进去。
./configure --enable-layout=LINX \ // Apache HTTP Server允许第三方的软件包安装但是会导致软件在系统上的布局变动所以这个选项可以指定自己系统上的布局。
// 关于这点apache的官方网站 http://httpd.apache.org/docs/2.4/install.html )有介绍。
--enable-so \ // 启用DSO性能。至于什么是DSO可以查看一下DSO capability的相关资料。
--enable-modules=all \ // 启用的模块,这里启用了所有的模块。
--enable-mods-shared=all \ // 启用共享的DSO模块。
@@ -126,11 +119,11 @@ build(){ // buil
--mandir=/usr/share/man \ // 手册文档的存放目录。
--infodir=/usr/share/info \ // 信息文档目录。
--enable-nls // 加上自然语言支持模块。
// 上面列出了很多configure命令的选项如果你能看懂全部选项所代表的意思那你肯定对apache有相当的了解。我想说的是configure后面所跟的选项是针对特定的软件包的当咱们在编译一个软件包的时候
// 需要查看这个软件包的configure支持的选项才能编出满足特定需求的软件包。比如这里编apache的时候怎么知道这些选项呢首先去读一下解压缩后的源码包里的INSTALL文件这里会提供我能需要的信息。
// 如果解压缩后的源码包里的configure命令支持help选项那更好可以列出咱们需要的所有选项。
// 尽管不同的软件包有自己的configure命令的选项但是有许多基本的选项还是比较固定的这里列举几个
// 尽管不同的软件包有自己的configure命令的选项但是有许多基本的选项还是比较固定的这里列举几个
// --help 这里首推这个选项用它咱们就可以查看configure中的其他选项了。
// --prefix 制作出的Makefile会查看随此选项传递的参数当一个包在安装时可以彻底的重新安置它的结构独立的部分。
// --bindir 指定二进制文件的安装位置,这里的二进制文件定义为可以直接被用户执行的程序。
@@ -149,9 +142,9 @@ build(){ // buil
// --with-PACKAGE[=ARG] 在自由软件社区里有使用已有软件包和库的优秀传统当用configure来配置一个源码树时可以提供其他已安装软件包的信息例如这里在编译apache是用到了很多这个选项可以体会一下。
// --without-PACKAGE 有时候可能希望在编译的软件包不与系统中已经安装的软件包交互,这时可以用这个选项。
make
make
make DESTDIR=$PKG install // make install命名用来安装软件包DESTDIR是make命令的一个选项它指定了软件包要安装在什么地方。$PKG是work/pkg目录这里指定了软件包就安装在这里。
mkdir -p $PKG/etc/apache/{ssl.key,ssl.crt} // 在work/pkg/etc/apache目录下创建了2个目录
touch $PKG/etc/apache/ssl.key/server.key // 这些应该是跟apache相关的配置过程。重点是要知道这些操作都可以在Pkgfile中完成至于如何配置apache不是咱们要讲的重点。
touch $PKG/etc/apache/ssl.crt/server.crt
@@ -162,25 +155,25 @@ build(){ // buil
sed -i "$num s/ root/ httpd/g" $PKG/etc/rc.d/init.d/apache
fi
touch $PKG/var/log/apache/{error_log,access_log}
chmod 1777 $PKG/var/run
chmod 1777 $PKG/var/run
chown -R root:root $PKG
}
```
## 3.没有在apache的Pkgfile中出现的知识点
Pkgfile文档与pkgmk命令是共生共存的关于pkgmk命令的使用在文档《pkg 命令说明文档V0.2.odt》中有详细的介绍。这里主要介绍编译二进制包的时候给所编译的二进制包设置安全属性的-s-pm-pa选项。
1-s选项
Pkgfile文档与pkgmk命令是共生共存的关于pkgmk命令的使用在文档《pkg 命令说明文档V0.2.odt》中有详细的介绍。这里主要介绍编译二进制包的时候给所编译的二进制包设置安全属性的-s-pm-pa选项。
1-s选项
当执行pkgmk命令的时候加上-s选项会将软件包中属主和属组为"root:root"的文件更改为属主和属组为"sys:sys"也会将参数PKGMK_SEC会设置成yes表示要编译的是安全版的软件包这个参数会传递给Pkgfile
、post_mk和post_add三个文件即这三个文件中可以使用PKGMD_SEC变量。这三个文件中分别会用if语句判断是否$PKGMK_SEC="yes",以确定是否在编译安全版本的软件包。如果是,要进行的一些安全操作会很自
然地在if语句中完成。
2-pm选项
然地在if语句中完成。
2-pm选项
加上这个选项之后pkgmk命令会执行post_mk文件如有必要这个文件会位于工作目录的根目录下。之所以这么说是因为并不是每一个所编译的软件包都需要这个文件这个文件执行的过程中会修改软件包中
的文件的属主和访问权限、添加配置文件、以及添加post_add在安装完毕后设置该软件包的文件的扩展属性系统中其他受影响的文件的包中属性也会改变。
3-pa选项
的文件的属主和访问权限、添加配置文件、以及添加post_add在安装完毕后设置该软件包的文件的扩展属性系统中其他受影响的文件的包中属性也会改变。
3-pa选项
加上了这个选项在这个软件包安装完成后pkgmk命令会执行post_add.sh如果存在这个文件位于工作目录的根目录下执行其中的一些操作进行相应的安全设置。
## 4. 总结
这里介绍了Pkgfile文件的基本格式信息这个文件的核心部分是build()部分,具体书写应根据安装包的实际需求进行。由于书写本文档时,作者也是个新手,所以肯定有很多不完善的地方,
**在您的阅读过程中给您带来的不便敬请谅解**,在以后的工作中会继续完善这个文档。
**在您的阅读过程中给您带来的不便敬请谅解**,在以后的工作中会继续完善这个文档。