Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1150747
  • 博文数量: 309
  • 博客积分: 6093
  • 博客等级: 准将
  • 技术积分: 3038
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-03 17:14
个人简介

linux学习记录

文章分类

全部博文(309)

文章存档

2014年(2)

2012年(37)

2011年(41)

2010年(87)

2009年(54)

2008年(88)

分类: LINUX

2008-07-24 11:03:40

   正如前面日志中写到的,我们在编写.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;

意思是,在加入新变量定义的同时,把原默认定义也一同继承过来。否则,会丢失原来默认定义的设置,造成严重的问题。对于其他的环境变量,建议也使用相同的做法。(除非你要摒弃原默认的所有定义)
阅读(1246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~