Jun
12
正如前面日志中写到的,我们在编写.spec脚本的时候,应该尽量使用对应操作系统平台的标准宏命令。但有些时候,标准的宏中定义的写法未必可以满足我们的要求,此时就需要给标准的宏添加参数。下面以maildrop这个套件为例说明。
一、举例
maildrop是一个邮件投递代理(MDA)软件,其可搭配postfix实现过滤和强大的功能。maildrop的邮箱大小限额是用off_t来表示,而off_t在32平台上是32位有符号整数。所以最大只能为2^31次方。也就是最大2GB。如果要突破这个限制,需要在编译的时候增加下述的环境变量:
二、获取可用的参数
这里,我们先假设不知道在编译的时候可以使用那些参数。那您可以这样获得:
最后可以看到:
三、修改.spec文件
原来的maildrop.spec文件内容如下:
可以看到,它使用的就是标准的%configure宏。
先看看标准宏的定义:
标准宏中,是没有考虑到CPPFLAGS变量的。所以,修改的方法有两种:一是修改上面的标准宏,但这样会对其他不需要使用到该变量的rpm有影响;二是在.spec文件中使用。
修改maildrop.spec内容如下:
也就是说,把CPPFLAGS的定义放在%configure前面,并用export输出到其他子程序中。
※注意:由于一些不明的原因,对变量的定义时,建议把export单独拿出来,这只是习惯而已。
四、编译
经过上面的修改,在编译的时候就可以自动引用CPPFLAGS环境变量了:
输出:
编译的时候,使用Ctrl+S可以暂停屏幕输出,方便查看设置是否正确。Ctrl+Q继续。
※2007-11-24 修改一处错误
原写为:
改为:
意思是,在加入新变量定义的同时,把原默认定义也一同继承过来。否则,会丢失原来默认定义的设置,造成严重的问题。对于其他的环境变量,建议也使用相同的做法。(除非你要摒弃原默认的所有定义)
一、举例
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
# ./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
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L
nonstandard directory
CPPFLAGS C/C++ preprocessor flags, e.g. -I
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 --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}
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="${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'
......
+ 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;
意思是,在加入新变量定义的同时,把原默认定义也一同继承过来。否则,会丢失原来默认定义的设置,造成严重的问题。对于其他的环境变量,建议也使用相同的做法。(除非你要摒弃原默认的所有定义)
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