LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1326|回复: 19

对Gentoo的包管理的问题

[复制链接]
发表于 2011-9-19 16:33:46 | 显示全部楼层 |阅读模式
今天刚接触gentoo,也接触了portage。给人的印象是能自动化帮用户编译 :emerge packagename

有几个问题
1.portage同时也解决软件的依赖性吗?

2.平常在编译时,自由度比较高,比如你可以指定要安装的软件位于哪里--prefix=/path/to/
再比如下面编译php的实例
./configure --prefix=/usr/local/php \
--with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-libxml-dir=/usr/include/libxml2/libxml --with-gd=/usr/local/gd/ \
--with-png=/usr/local/png/ --with-jpeg=/usr/local/jpeg/ --with-xpm \
--with-zlib --enable-debug --enable-magic-quotes --enable-libgcc \
--enable-ftp --enable-mbstring=all --enable-sockets --with-gnu-ld

==============================
上面的参数中包括到的依赖性库都被用户指定的,而portage没有这样给用户的选择,自动化的,也就是说它能帮软件找到相应的库,或者它有自己的一套规定存放库的规则?

另外,有些软件有自己的“开关参数”比如支不支持ldap,支不支持pam等,当然这里ldap 和pam应该都是USE中有的关键字,但是一个软件在编译时它有多少这样的参数?一个USE能全都包括进去吗?假设用户想在安装某个软件时加上一个参数(默认编译不会加上),而USE中又没有,那portage该如何处理?

3.第一次接触这种“自动化”的编译,portage的定制是不是只通过USE来的?那我就很困惑如果USE是平常编译中的“参数”的话,它能全部包括进来吗。看官网上是分GLOBAL /LOCAL
这里的LOCAL应该就是特定的某个软件特有的,如这里的PHP中的某个参数。想问一下LOCAL的USE是不是不能写在/etc/make.conf中?


请问一下gentoo的定制主要体现在哪方面,至少大家在安装软件时只emerge packagename,没有看到额外的一些东西。不管怎么样,和平常的编译各个组件软件包来比较,还是有不同的,同时也有不解的地方

刚开始用GENTOO,不是很懂,请教大家了。
发表于 2011-9-19 18:03:26 | 显示全部楼层
1、当然

2、假如你全部软件都是用portage来管理的话,那它是能自动找到相应的库的,假如是自己手动安装的那就无能为力了,portage会当作还没有安装,那就会自动安装。

3、
  1. [ebuild   R    ] media-video/mplayer-1.0_rc4_p20110322  USE="X a52 alsa ass dts dvd enca encode faac faad gif iconv ipv6 jpeg mmx mp3 network opengl osdmenu png rtc shm sse sse2 ssse3 theora tremor truetype unicode vorbis x264 xscreensaver xv xvid -3dnow -3dnowext -aalib (-altivec) -amr (-aqua) -bidi -bindist -bl -bluray -bs2b -cddb -cdio -cdparanoia -cpudetection -custom-cpuopts -debug -dga -dirac -directfb -doc -dv -dvb -dvdnav -dxr3 -esd -fbcon -ftp -ggi -gsm -jack -joystick -jpeg2k -ladspa -libcaca -libmpeg2 -lirc -live -lzo -mad -md5sum -mmxext -mng -mpg123 -nas -nut -openal -oss -pnm -pulseaudio -pvr -quicktime -radio -rar -real -rtmp -samba -schroedinger -sdl -speex -tga -toolame -twolame -v4l -v4l2 -vdpau (-vidix) -vpx (-win32codecs) -xanim -xinerama -xvmc -zoran" VIDEO_CARDS="-mga -s3virge -tdfx -vesa" 8,129 kB
复制代码
不敢说能把所有参数全包括进来了(例如软件安装在哪里就没有USE能指定),但你觉得这个USE的数量对于mplayer这个软件来说足够没有?假如真有某个功能无法用USE来指定,而用户又想自定义,那自己写个ebuild放overlay里面吧。

make.conf里面的USE是全局的,也就是说,你安装的所有软件包,假如有那个USE,那就会打开/关掉;假如没有这个USE,那就跟这个软件包没关系。
  1. ryan@timemars ~ $ cat /etc/portage/package.use
  2. app-admin/conky imlib
  3. app-arch/p7zip rar
  4. app-emulation/libvirt qemu virt-network
  5. dev-lang/php gd xml fpm mysql mysqli cjk cgi curl
  6. gnome-base/gnome-applets gstreamer
  7. media-libs/libpng apng
  8. media-video/mplayer x264 xvid aac dts -dvdnav -rar -real -quicktime -cdio -live -dv -dirac -schroedinger -speex -toolame -twolame
  9. net-misc/networkmanager dhclient nss
  10. sys-apps/portage python3
复制代码
这个是LOCAL的,针对某一个软件包进行设置。例如我全局禁了gstreamer,但又想对gnome-applets这个包使用gstreamer

gentoo的定制性嘛,一方面你可以使用USE来控制安装的软件所具有的功能,一方面你可以用package.mast、package.unmask、package.keywords等来控制安装的软件的版本,一方面你可以自己写ebuild来添加portage里面没有的软件或版本
回复 支持 反对

使用道具 举报

发表于 2011-9-19 18:33:45 | 显示全部楼层
所谓的自动化,就是脚本

楼主为什么不打开ebuild脚本看下呢,如果你愿意的话,你可以将所有configure参数通过use flag来开关,实际上,里面所有的变量你都可以去控制。当然,这样的话,等于你自己维护个portage
回复 支持 反对

使用道具 举报

发表于 2011-9-19 19:33:48 | 显示全部楼层
只要安装一遍这些问题基本上就清楚了。官方的安装手册中有详细介绍portage的章节。

作为一个成熟的发行版,如果连楼主问的这些问题都不能很好解决,也就没有存在的必要了。

portage有自己的目录规则,编译好的软件会以一种合理的目录存放。
USE参数都是ebuild脚本开发人员设置好的,全都是有人负责维护的,不存在你说的是否还有软件的某些参数没有包括进来的情形。如果你恰巧发现了,可以自己修改ebuild添加此参数,同时请告知开发者修正此bug。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-9-19 20:11:55 | 显示全部楼层
Post by timemars;2152407
1、当然

2、假如你全部软件都是用portage来管理的话,那它是能自动找到相应的库的,假如是自己手动安装的那就无能为力了,portage会当作还没有安装,那就会自动安装。

3、
  1. [ebuild   R    ] media-video/mplayer-1.0_rc4_p20110322  USE="X a52 alsa ass dts dvd enca encode faac faad gif iconv ipv6 jpeg mmx mp3 network opengl osdmenu png rtc shm sse sse2 ssse3 theora tremor truetype unicode vorbis x264 xscreensaver xv xvid -3dnow -3dnowext -aalib (-altivec) -amr (-aqua) -bidi -bindist -bl -bluray -bs2b -cddb -cdio -cdparanoia -cpudetection -custom-cpuopts -debug -dga -dirac -directfb -doc -dv -dvb -dvdnav -dxr3 -esd -fbcon -ftp -ggi -gsm -jack -joystick -jpeg2k -ladspa -libcaca -libmpeg2 -lirc -live -lzo -mad -md5sum -mmxext -mng -mpg123 -nas -nut -openal -oss -pnm -pulseaudio -pvr -quicktime -radio -rar -real -rtmp -samba -schroedinger -sdl -speex -tga -toolame -twolame -v4l -v4l2 -vdpau (-vidix) -vpx (-win32codecs) -xanim -xinerama -xvmc -zoran" VIDEO_CARDS="-mga -s3virge -tdfx -vesa" 8,129 kB
复制代码
不敢说能把所有参数全包括进来了(例如软件安装在哪里就没有USE能指定),但你觉得这个USE的数量对于mplayer这个软件来说足够没有?假如真有某个功能无法用USE来指定,而用户又想自定义,那自己写个ebuild放overlay里面吧。

make.conf里面的USE是全局的,也就是说,你安装的所有软件包,假如有那个USE,那就会打开/关掉;假如没有这个USE,那就跟这个软件包没关系。
  1. ryan@timemars ~ $ cat /etc/portage/package.use
  2. app-admin/conky imlib
  3. app-arch/p7zip rar
  4. app-emulation/libvirt qemu virt-network
  5. dev-lang/php gd xml fpm mysql mysqli cjk cgi curl
  6. gnome-base/gnome-applets gstreamer
  7. media-libs/libpng apng
  8. media-video/mplayer x264 xvid aac dts -dvdnav -rar -real -quicktime -cdio -live -dv -dirac -schroedinger -speex -toolame -twolame
  9. net-misc/networkmanager dhclient nss
  10. sys-apps/portage python3
复制代码
这个是LOCAL的,针对某一个软件包进行设置。例如我全局禁了gstreamer,但又想对gnome-applets这个包使用gstreamer

gentoo的定制性嘛,一方面你可以使用USE来控制安装的软件所具有的功能,一方面你可以用package.mast、package.unmask、package.keywords等来控制安装的软件的版本,一方面你可以自己写ebuild来添加portage里面没有的软件或版本

非常感谢你的解答
1.我想问一下,从以前手工编译到转到GENTOO下来,如果一个软件的ebuild中,默认编译参数已被合理设计,如果你发现没有实现某个功能(这在手工编译下很常见,特别是编译几个组件为一套整体时),你的作法是不是在package.use中针对性的增加你想要的USE?
2.
记得以前编译postfix+sasl+mysql+...记不清了,单独按默认编译来的话,这几个软件是相互独立”的“,需要在原先基础上添加相关的支持参数再编译
那在gentoo下,如果emerge来做的话,也有可能每个软件是成功编译安装的,因为依赖性不是强制的,但最后可能几个不能相互成一整体动作
记得有人用debian的port几条安装指令就OK了,我没用过debian,相来是和gentoo里的portage一样,那如此看来,应该是gentoo的在ebuild中对上面三个软件作了修改吧,也就是说portage中的各软件,ebuild文件可以重新设定了默认参数,和直接网上下载的源代码编译用的参数不一样,请教?

3.
按你的想法,emerge某个软件时是GLOBAL USE和LOCAL USE的并集,是吗?
平常手动编译时不加任何参数也可以编译成功(不是全部),那换到GENTOO下来讲,是不是这样:emerge一个软件,在真正编译时是 默认参数方式 (+/-)GLOBAL USE (+/-)LOCAL USE。对于你的例子mplayer,它列出的USE应该是这个软件能用到的所有USE,而不是默认编译用到的,是不是?,至于当全局USE为空时,是以怎样的USE真正去编译mplayer是写在ebuild文件中的,是吧?
全局USE只是一种选择性的约束,各个软件都有自己的ebuild,以这个为准绳,全局USE只是一种额外的"监督",当这个“监督”管的USE很多时,每个软件也被约束的多


4.官网上USE强调“可选”,那么LOCAL和GLOBAL并没有严格的界限,你可以用一个LOCAL的USE标记加入到/etc/make.conf中,其他软件在编译时会忽略掉这个标记,是这样吗?
另外就像3楼说的,有专人维护,USE“足够”多供用户使用~
回复 支持 反对

使用道具 举报

发表于 2011-9-19 21:16:18 | 显示全部楼层
Please
  1. man portage
复制代码
or refer to Gentoo Handbook :
http://www.gentoo.org/doc/zh_cn/ ... ok-amd64.xml?full=1
回复 支持 反对

使用道具 举报

发表于 2011-9-19 23:03:48 | 显示全部楼层
Post by seufy;2152413
非常感谢你的解答
1.我想问一下,从以前手工编译到转到GENTOO下来,如果一个软件的ebuild中,默认编译参数已被合理设计,如果你发现没有实现某个功能(这在手工编译下很常见,特别是编译几个组件为一套整体时),你的作法是不是在package.use中针对性的增加你想要的USE?
2.
记得以前编译postfix+sasl+mysql+...记不清了,单独按默认编译来的话,这几个软件是相互独立”的“,需要在原先基础上添加相关的支持参数再编译
那在gentoo下,如果emerge来做的话,也有可能每个软件是成功编译安装的,因为依赖性不是强制的,但最后可能几个不能相互成一整体动作
记得有人用debian的port几条安装指令就OK了,我没用过debian,相来是和gentoo里的portage一样,那如此看来,应该是gentoo的在ebuild中对上面三个软件作了修改吧,也就是说portage中的各软件,ebuild文件可以重新设定了默认参数,和直接网上下载的源代码编译用的参数不一样,请教?

3.
按你的想法,emerge某个软件时是GLOBAL USE和LOCAL USE的并集,是吗?
平常手动编译时不加任何参数也可以编译成功(不是全部),那换到GENTOO下来讲,是不是这样:emerge一个软件,在真正编译时是 默认参数方式 (+/-)GLOBAL USE (+/-)LOCAL USE。对于你的例子mplayer,它列出的USE应该是这个软件能用到的所有USE,而不是默认编译用到的,是不是?,至于当全局USE为空时,是以怎样的USE真正去编译mplayer是写在ebuild文件中的,是吧?
全局USE只是一种选择性的约束,各个软件都有自己的ebuild,以这个为准绳,全局USE只是一种额外的"监督",当这个“监督”管的USE很多时,每个软件也被约束的多


4.官网上USE强调“可选”,那么LOCAL和GLOBAL并没有严格的界限,你可以用一个LOCAL的USE标记加入到/etc/make.conf中,其他软件在编译时会忽略掉这个标记,是这样吗?
另外就像3楼说的,有专人维护,USE“足够”多供用户使用~


1、你要增加一个不存在的USE,是需要自己手动改ebuild的(就相当于要给一个写好的脚本增加一个选项,当输入了这个选项时,这个脚本要进行某些操作)。package.use是用来控制那些已经存在的USE的。

2、portage是一个包管理器系统,本质上跟debian的、fedora的包管理系统没有区别。不一样的地方是,portage把编译软件的工作从维护人员那里转移到用户那里。既然debian可以用几句命令就装好,gentoo也同样如此。

3、说并集是不准确的,在不同的地方设置的USE有一个优先级,也就是说,在优先级高的地方设置的USE会覆盖掉在优先级低的地方设置的USE。以我在2L贴的例子,我在make.conf设置了"-gstreamer",也就是全局去掉了gstreamer的支持。但是,gnome的音量控制需要gstreamer的支持,所以我在优先级更高的package.use设置了对gnome-applets使用gstreamer支持。这样,我安装其它软件的时候依然是没有gstreamer支持,但安装的gnome-applets是带有gstreamer支持的。

USE前面没有"-"号的,就是编译时会使用的USE;带有"-"号的,就是编译时不会使用的USE。每个软件包都会有默认的USE,不过并不是写在ebuild里面,而是在make.defaults这个文件里定义的。

与其说USE是约束,我觉得说是控制功能的开关更准确,你想要什么功能,就打开什么开关。以mplayer来说,你想让mplayer能解码x264的视频,但又不需要real解码的话,那就给mplayer加上"x264 -ogg"的USE。windows的做法则是在安装软件的时候,选上x264的解码器,同时去掉real解码器前面的钩。显而易见,形式上都差不多的。

4、是的,假如那个USE只有一个软件包会用到,那写在package.use里面或make.conf里面确实没区别,只不过make.conf里面写了太多的USE,有时候会显得很杂乱。。。

维护人员也不是神,你觉得那些USE不够用的话,你大可以提交一个bug,或者自己写个ebuild放到自己的overlay里面
回复 支持 反对

使用道具 举报

发表于 2011-9-20 00:29:03 | 显示全部楼层
我觉得先用过一些包的发行版比如debian什么的,再来用gentoo感触会深一些
回复 支持 反对

使用道具 举报

发表于 2011-9-20 07:51:58 | 显示全部楼层
Post by iamkr;2152422
我觉得先用过一些包的发行版比如debian什么的,再来用gentoo感触会深一些


说不定会反效果。见识了apt、yum的便利,再听说gentoo居然还要编译软件包,然后就心想“那岂不是装个软件都要打一大堆命令,还要自己解决依赖性?”
回复 支持 反对

使用道具 举报

发表于 2011-9-20 08:31:02 | 显示全部楼层
楼主的一切问题只要动手自己做个简单的ebuild就都很轻易回答。都是portage ebuild的基本知识和不牵及一些比较复杂的eclass。自己找个可以./configure; make; make install的软件来在sandbox里玩。只要不跑qmerge阶段就不能装到系统里去。

自己动手、看文档才学到知识啊。看6楼的建议。特别去注意下
  1. IUSE=“xxxx”
  2. DEPENDS="xxxx ? (catg/app)"
  3. econf = ${use_enable xxxx}
复制代码
等语法。

如果你沒兴趣学写ebuild。你就只有信任Gentoo的开发者把一切USE和依赖搞定。这就和用任何其它法行版沒区别了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表