Jun 12

[原]关于rpm打包的一个补充 雷阵雨

linuxing , 11:36 , 基础知识 » RPM , 评论(1) , 引用(0) , 阅读(32114) , Via 本站原创 | |
   正如前面日志中写到的,我们在编写.spec脚本的时候,应该尽量使用对应操作系统平台的标准宏命令。但有些时候,标准的宏中定义的写法未必可以满足我们的要求,此时就需要给标准的宏添加参数。下面以maildrop这个套件为例说明。
一、举例
  maildrop是一个邮件投递代理(MDA)软件,其可搭配postfix实现过滤和强大的功能。maildrop的邮箱大小限额是用off_t来表示,而off_t在32平台上是32位有符号整数。所以最大只能为2^31次方。也就是最大2GB。如果要突破这个限制,需要在编译的时候增加下述的环境变量:
引用
CPPFLAGS="-D_FILE_OFFSET_BITS=64"

二、获取可用的参数
  这里,我们先假设不知道在编译的时候可以使用那些参数。那您可以这样获得:
# cd maildrop-2.0.1
# ./configure --help

最后可以看到:
引用
Some influential environment variables:
 CC          C compiler command
 CFLAGS      C compiler flags
 LDFLAGS     linker flags, e.g. -L if you have libraries in a
             nonstandard directory
 CPPFLAGS    C/C++ preprocessor flags, e.g. -I if you have
             headers in a nonstandard directory
 CPP         C preprocessor
 CXX         C++ compiler command
 CXXFLAGS    C++ compiler flags
 CXXCPP      C++ preprocessor
 F77         Fortran 77 compiler command
 FFLAGS      Fortran 77 compiler flags

三、修改.spec文件
原来的maildrop.spec文件内容如下:
引用
%setup -q
%configure --with-devel --enable-userdb --enable-maildirquota \
          --enable-syslog=1 --with-trashquota \
          --enable-restrict-trusted=0 \
          --enable-sendmail=/usr/sbin/sendmail

可以看到,它使用的就是标准的%configure宏。
先看看标准宏的定义:
vi /usr/lib/rpm/macros

引用
%configure \
 CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \
 CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \
 FFLAGS="${FFLAGS:-%optflags}" ; export FFLAGS ; \
 ./configure --host=%{_host} --build=%{_build} \\\
       --target=%{_target_platform} \\\
       --program-prefix=%{?_program_prefix} \\\
       --prefix=%{_prefix} \\\
       --exec-prefix=%{_exec_prefix} \\\
       --bindir=%{_bindir} \\\
       --sbindir=%{_sbindir} \\\
       --sysconfdir=%{_sysconfdir} \\\
       --datadir=%{_datadir} \\\
       --includedir=%{_includedir} \\\
       --libdir=%{_libdir} \\\
       --libexecdir=%{_libexecdir} \\\
       --localstatedir=%{_localstatedir} \\\
       --sharedstatedir=%{_sharedstatedir} \\\
       --mandir=%{_mandir} \\\
       --infodir=%{_infodir}

标准宏中,是没有考虑到CPPFLAGS变量的。所以,修改的方法有两种:一是修改上面的标准宏,但这样会对其他不需要使用到该变量的rpm有影响;二是在.spec文件中使用。
修改maildrop.spec内容如下:
引用
%setup -q
CPPFLAGS="${CPPFLAGS} -D_FILE_OFFSET_BITS=64";export CPPFLAGS;
%configure --with-devel --enable-userdb --enable-maildirquota \
          --enable-syslog=1 --with-trashquota \
          --enable-restrict-trusted=0 \
          --enable-sendmail=/usr/sbin/sendmail

也就是说,把CPPFLAGS的定义放在%configure前面,并用export输出到其他子程序中。
※注意:由于一些不明的原因,对变量的定义时,建议把export单独拿出来,这只是习惯而已。
四、编译
经过上面的修改,在编译的时候就可以自动引用CPPFLAGS环境变量了:
# rpmbuild -bb maildrop.spec

输出:
引用
......
+ CPPFLAGS=-D_FILE_OFFSET_BITS=64
+ export CPPFLAGS
+ CFLAGS='-O2 -g -pipe -m32 -march=i386 -mtune=pentium4'
+ export CFLAGS
+ CXXFLAGS='-O2 -g -pipe -m32 -march=i386 -mtune=pentium4'
......

编译的时候,使用Ctrl+S可以暂停屏幕输出,方便查看设置是否正确。Ctrl+Q继续。

※2007-11-24 修改一处错误
原写为:
引用
CPPFLAGS="-D_FILE_OFFSET_BITS=64";export CPPFLAGS;

改为:
引用
CPPFLAGS="${CPPFLAGS} -D_FILE_OFFSET_BITS=64";export CPPFLAGS;

意思是,在加入新变量定义的同时,把原默认定义也一同继承过来。否则,会丢失原来默认定义的设置,造成严重的问题。对于其他的环境变量,建议也使用相同的做法。(除非你要摒弃原默认的所有定义)
Tags: ,
hello
2013/04/09 16:51
你好,冒昧请教一下,我在制作rpm包的时候,./configure操作时提示找不到头文件或者静态库,error:can't find **.h -add search path to CPPFLAGS and return configure.export CPPFLAGS=-I/usr/local/include ,类似这样的,但是在BUILDROOT目录下我确实能找到这个文件。我即使在configure之前加上export这步也是不起作用。你遇到这种问题吗?
linuxing 回复于 2013/04/09 17:19
可能你的宏变量有问题吧,输出CPPFLAGS变量看看。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]