LinuxSir.cn,穿越时空的Linuxsir!

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

ebuild中的两个问题

[复制链接]
发表于 2008-2-24 10:56:05 | 显示全部楼层 |阅读模式
昨天学习了一下写ebuild,有两个疑问,
文档中说变量DISTDIR是默认的安装包的存放路径(/usr/portage/distfiles),我用的时候发现是指向/var/tmp/portage/...里的,后来只好自己定义了。
还有在src_unpack()里,unpack 命令是解压什么格式的,是tar.gz还是tar.bz2的。
谢谢!
发表于 2008-2-24 14:01:01 | 显示全部楼层
Post by robin_-2004;1819486
昨天学习了一下写ebuild,有两个疑问,
文档中说变量DISTDIR是默认的安装包的存放路径(/usr/portage/distfiles),我用的时候发现是指向/var/tmp/portage/...里的,后来只好自己定义了。
还有在src_unpack()里,unpack 命令是解压什么格式的,是tar.gz还是tar.bz2的。
谢谢!


你可以看看已有的ebuild,一般是继承已有的eclass,再添加需要的特殊命令,比如打补丁什么的。
好像unpack的所用的格式我从来没有遇到过,应该是在继承的eclass里已经考虑了。
回复 支持 反对

使用道具 举报

发表于 2008-2-24 15:25:14 | 显示全部楼层
DISTDIR就是/usr/portage/distfiles,我可以保证,至少在src_unpack和src_install里,其他函数里应该也用不到
你可以用qgrep -H DISTDIR查看一下tree里现有ebuild的用法
unpack可以根据后缀自动调用正确的程序解压缩
grep -n '^[^*(#"0-9]\+)$' /usr/lib/portage/bin/ebuild.sh | head -n 8
333:                    tar)
336:                    tgz)
343:                    ZIP|zip|jar)
346:                    gz|Z|z)
369:                    RAR|rar)
372:                    LHa|LHA|lha|lzh)
375:                    a|deb)
378:                    lzma)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-25 14:25:54 | 显示全部楼层
谢谢大家的帮助!我自制的包能装上了。
这里还有些疑问,
在src_unpack()中,unpack pkg.tar.gz是到DISTDIR中去查找安装包。于是我在前面加了一句cp就成功了。我的src_unpack():

  1. src_unpack()
  2. {
  3.         #MYDISTDIR是我定义的安装包存放地址
  4.         cp -v ${MYDISTDIR}/myfvwm-1.0.tar.gz ${DISTDIR}/
  5.         unpack myfvwm-1.0.tar.gz
  6. }
复制代码


疑问是:
1.官方的ebuild中unpack前并没有拷贝原安装包,不知道是系统为它做好了吗?是哪一步执行的?
2.对于我机器上DISTDIR,它的指向还是不大明却?
这是我用zhcon-0.2.6.ebuild做得测试:

  1. src_unpack() {
  2. #        echo ${MY_P}
  3.         echo pkg
  4.         echo ${A}
  5.         echo distdir
  6.         echo ${DISTDIR}#上面几行是我加的
  7.         unpack ${A}   #在这之前并没有拷贝
  8.         cd "${S}"
  9.         epatch "${DISTDIR}"/zhcon-0.2.5-to-0.2.6.diff.gz
  10.         epatch "${FILESDIR}"/zhcon-0.2.5.make-fix.patch
  11.         epatch "${FILESDIR}"/${P}.sysconfdir.patch
  12.         epatch "${FILESDIR}"/${P}.configure.in.patch
  13.         eautoreconf
  14. }
复制代码

前面几个echo是我改了的,
当我emerge -v zhcon后

  1. These are the packages that would be merged, in order:

  2. Calculating dependencies   ... done!
  3. [ebuild   R   ] app-i18n/zhcon-0.2.6  0 kB

  4. Total: 1 package (1 reinstall), Size of downloads: 0 kB

  5. >>> Verifying ebuild Manifests...

  6. >>> Emerging (1 of 1) app-i18n/zhcon-0.2.6 to /
  7. * zhcon-0.2.5.tar.gz RMD160 SHA1 SHA256 size ;-) ...                     [ ok ]
  8. * zhcon-0.2.5-to-0.2.6.diff.gz RMD160 SHA1 SHA256 size ;-) ...           [ ok ]
  9. * checking ebuild checksums ;-) ...                                      [ ok ]
  10. * checking auxfile checksums ;-) ...                                     [ ok ]
  11. * checking miscfile checksums ;-) ...                                    [ ok ]
  12. * checking zhcon-0.2.5.tar.gz ;-) ...                                    [ ok ]
  13. * checking zhcon-0.2.5-to-0.2.6.diff.gz ;-) ...                          [ ok ]
  14. >>> Unpacking source...
  15. pkg            #这几句是我在ebuild中加的echo
  16. zhcon-0.2.5.tar.gz zhcon-0.2.5-to-0.2.6.diff.gz
  17. distdir
  18. #这是DISTDIR所指向的路径
  19. /var/tmp/portage/app-i18n/zhcon-0.2.6/distdir
  20. >>> Unpacking zhcon-0.2.5.tar.gz to /var/tmp/portage/app-i18n/zhcon-0.2.6/work
  21. >>> Unpacking zhcon-0.2.5-to-0.2.6.diff.gz to /var/tmp/portage/app-i18n/zhcon-0.2.6/work
  22. /var/tmp/portage/app-i18n/zhcon-0.2.6/distdir/
  23. * Applying zhcon-0.2.5-to-0.2.6.diff.gz ...
  24.   [ ok ]
  25. * Applying zhcon-0.2.5.make-fix.patch ...
  26.   [ ok ]
  27. * Applying zhcon-0.2.6.sysconfdir.patch ...
  28.   [ ok ]
  29. * Applying zhcon-0.2.6.configure.in.patch ...
  30.   [ ok ]
  31. .......
复制代码

谢谢!
回复 支持 反对

使用道具 举报

发表于 2008-2-25 15:24:46 | 显示全部楼层
Post by robin_-2004;1819853


  1. src_unpack()
  2. {
  3.         #MYDISTDIR是我定义的安装包存放地址
  4.         cp -v ${MYDISTDIR}/myfvwm-1.0.tar.gz ${DISTDIR}/
  5.         unpack myfvwm-1.0.tar.gz
  6. }
复制代码


你应该把你的文件放到/usr/portage/distfiles里
然后你的ebuild里完全不需要写src_unpack这个函数

Post by robin_-2004;1819853

疑问是:
1.官方的ebuild中unpack前并没有拷贝原安装包,不知道是系统为它做好了吗?是哪一步执行的?
2.对于我机器上DISTDIR,它的指向还是不大明却?

1. ebuild fetch阶段就已经把文件下载到/usr/portage/distfiles里了
2. DISTDIR在ebuild里(注意是ebuild里)确实是/var/tmp/portage/${CATEGORY}/${PVR}/distdir
不过那里面的文件实际上是符号连接,指向/usr/portage/distfiles里的同名文件

记住:如果你不需要打补丁,你就不需要在ebuild里写src_unpack函数。你要做的只是把你的源代码放进/usr/portage/distfiles

这个命令可以显示当前的portage树里有多少文件没有定义src_unpack
find /usr/portage -name "*.ebuild" | xargs -I {} sh -c "if ! grep src_unpack '{}' >/dev/null 2>&1 ; then echo '{}'; fi"
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-25 16:34:05 | 显示全部楼层
DISTDIR的指向终于弄懂了!
再问一下:
Post by zhllg;1819870

记住:如果你不需要打补丁,你就不需要在ebuild里写src_unpack函数。你要做的只是把你的源代码放进/usr/portage/distfiles

是不是不打补丁,都不用在ebuild里写src_unpack,这是我写的一个ebuild

  1. DESCRIPTION="convate gb18030 encoding to utf8"
  2. HOMEPAGE=""
  3. SRC_URI=""

  4. LICENSE="GPL-2"
  5. SLOT="0"
  6. KEYWORDS="~x86"
  7. IUSE=""

  8. MYDISTDIR="/mnt/e/distfiles"
  9. DEPEND=""
  10. RDEPEND=""

  11. src_unpack()
  12. {
  13.         mkdir ${S}
  14. #        echo ${MYDISTDIR}
  15.         cp -v ${MYDISTDIR}/conv.gz ${S}/conv.gz
  16.         gzip -d ${S}/conv.gz
  17. }
  18. src_install()
  19. {
  20.         dobin conv
  21. }
复制代码

当我把src_unpack()注释掉后,系统就找不到我的包了,emerge conv后

  1. Calculating dependencies   ... done!
  2. >>> Verifying ebuild Manifests...

  3. >>> Emerging (1 of 1) app-portage/conv-0.1 to /
  4. * checking ebuild checksums ;-) ...                                      [ ok ]
  5. * checking auxfile checksums ;-) ...                                     [ ok ]
  6. * checking miscfile checksums ;-) ...                                    [ ok ]
  7. >>> Unpacking source...
  8. >>> Source unpacked.
  9. >>> Compiling source in /var/tmp/portage/app-portage/conv-0.1 ...
  10. >>> Source compiled.
  11. >>> Test phase [not enabled]: app-portage/conv-0.1

  12. >>> Install conv-0.1 into /var/tmp/portage/app-portage/conv-0.1/image/ category app-portage
  13. !!! dobin: conv does not exist
  14. >>> Completed installing conv-0.1 into /var/tmp/portage/app-portage/conv-0.1/image/

  15. * checking 0 files for package collisions
  16. >>> Merging app-portage/conv-0.1 to /
  17. --- /usr/
  18. --- /usr/bin/
  19. >>> Safely unmerging already-installed instance...
  20. No package files given... Grabbing a set.
  21. <<<          obj /usr/bin/conv
  22. --- replaced dir /usr/bin
  23. --- replaced dir /usr
  24. >>> Original instance of package unmerged safely.
  25. >>> app-portage/conv-0.1 merged.

  26. >>> No packages selected for removal by clean
  27. >>> Auto-cleaning packages...

  28. >>> No outdated packages were found on your system.
  29. * GNU info directory index is up-to-date.
复制代码

不知道系统建立连接的时候是在哪里?我自己写的几个ebuild注释掉src_unpack()后都是这样。
谢谢!
回复 支持 反对

使用道具 举报

发表于 2008-2-25 16:45:25 | 显示全部楼层
首先,转编码不需要安装任何其他的软件,你的系统里已经有了iconv

其次,如果你只有一个文件,大可不必用ebuild来安装。
如果你确实想要。你应该把这个文件放到一个tar包里,你应确保解压缩后,能得到一个目录,这个目录的名字等于pkgname-version,否则你需要在ebuild里重新定义WORKDIR变量。
dobin等命令的起始目录是WORKDIR

如果有任何ebuild的变量或者命令不明白,请看man 5 ebuild
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-25 17:33:26 | 显示全部楼层
感谢版主!问题解决了。
原来是A变量是空的,把SRC_URI定义一下就好了。
说一下,conv是我看电子书用的,每次都要用iconv和split命令,还要去查忘了的参数。我写conv完全是图个方便。在这里写ebuild是作实验的,呵呵
回复 支持 反对

使用道具 举报

发表于 2008-2-25 17:41:34 | 显示全部楼层
ebuild skeleton /usr/portage/skel.ebuild
初学ebuild可以以这个为基础
回复 支持 反对

使用道具 举报

发表于 2008-2-25 18:14:28 | 显示全部楼层
难得发现有学习ebuild的贴子,先赞一个
楼主可以参考一下以下的文章,英文好的就算了,有篇常用错误那章很值得一看
http://man.ddvip.com/linux/gentoo/gentoo_dev/index.html  
http://man.ddvip.com
过年抽点时间学了一下ebuild只是没有实战,至少目前看ebuild文件不像以前那么苦涩了
学习中.....
回复 支持 反对

使用道具 举报

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

本版积分规则

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