LinuxSir.cn,穿越时空的Linuxsir!

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

有没有不依赖服务器的版本控制软件?

[复制链接]
发表于 2006-3-30 15:27:39 | 显示全部楼层 |阅读模式
冒出这个想法是因为希望大家共享 SlackBuild 脚本。如果这个问题太白痴了,别笑话我,呵呵。另外,为什么 Pat 不用 Makefile 替代那些编译脚本?最近用 Makefile 的方式写了俩编译脚本,感觉比 shell script 方便,而且出错的机会也小些。
发表于 2006-3-30 15:50:19 | 显示全部楼层
能不能贴个样本出来看看?

版本控制的问题,看看这篇文章。

http://www.linux.com/article.pl?sid=06/03/02/174227

不过我还是不太理解你的意思。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-31 02:59:07 | 显示全部楼层
不好意思,小弟是个菜鸟,菜鸟的问题是比较难理解。

CVS这样的版本控制软件需要个服务器,下源码都得连上这个服务器。分享 SlackBuild 这种小东西,有没有什么不需要服务器的版本控制软件?有点像 P2P 类型的。唉,我也就是突发奇想。高手们别笑话了。

Makefile 的问题是顺便一问。在尝试把我的 SlackBuild 脚本变成 Makefile 。现在我这个小小的库里只有 4 个软件:kmplayer kaffeine fcitx amarok 。还在找错误中,我自己都不信任。学学走走吧。

昨天才第一次看了一下 Makefile 的写法。说实在的,不懂。只是觉得 make 可以帮忙排除掉一些错误比较方便。写了个很初级的,当个示例,明白我意思就得了(我知道我写得很烂)。

目录结构是
slackbuilds/{chinese,multimedia,mk,distfiles,packages}
kaffeine 就是 slackbuilds/multimedia/kaffeine

make fetch 下载源码
make extract 解压源码,放在 /tmp/work 底下
make build 编译
make package 打成 Slackware 包。
现在基本还是一步步来,装个软件要用 make fetch build package clean 以后再搞一条龙的服务吧。

这是 kaffeine 的 Makefile :

  1. # $Id: Makefile,v 1.1 2006/03/30 18:15:08 shannleon Exp $

  2. NAME    = kaffeine
  3. VERSION = 0.8
  4. EXT     = tar.bz2
  5. SITE    = http://jaist.dl.sourceforge.net/sourceforge/kaffeine

  6. PREFIX  = /opt/kde

  7. OPTS    = --without-dvb
  8. OPTS    += --without-gstreamer
  9. OPTS    += --without-oggvorbis
  10. OPTS    += --without-lame

  11. include ../../mk/slack.build.mk
复制代码

这是真正干活的:

  1. # $Id: slack.build.mk,v 1.1 2006/03/30 18:15:46 shannleon Exp $

  2. NAME        ?=
  3. VERSION        ?=
  4. EXT        ?= tar.bz2
  5. SITE        ?=
  6. #----------------------------------------------------------------------
  7. ARCH        ?= i686
  8. CPU        ?= athlon64
  9. BUILD        ?= 1yjs
  10. CC        ?= gcc
  11. CXX        ?= g++
  12. CFLAGS        ?= -march=${ARCH} -mtune=${CPU} -O2 -pipe
  13. CXXFLAGS        ?= ${CFLAGS}
  14. PREFIX        ?= /usr
  15. OPTS        +=
  16. #----------------------------------------------------------------------
  17. REALNAME        = ${NAME}-${VERSION}
  18. FULLNAME        = ${REALNAME}.${EXT}
  19. PORTNAME        = $(subst -,_,${NAME})
  20. PORTVERSION        = $(subst -,,${VERSION})
  21. PKGNAME                = ${PORTNAME}-${PORTVERSION}-${ARCH}-${BUILD}.tgz
  22. DISTFILES        = ${CWD}/../../distfiles
  23. PACKAGES        = ${CWD}/../../packages
  24. FETCHCMD        ?= /usr/bin/wget
  25. TAR                ?= /bin/tar
  26. #----------------------------------------------------------------------
  27. CWD        = $(shell pwd)
  28. TMPDIR        = /tmp/work
  29. SRCDIR        = ${TMPDIR}/${REALNAME}
  30. PKGDIR        = ${TMPDIR}/package-${NAME}
  31. DOCDIR        = ${PKGDIR}/usr/doc/${REALNAME}
  32. #----------------------------------------------------------------------

  33. ## RULES
  34. #
  35. .PHONY: fetch extract build package clean

  36. all:

  37. ##### fetch
  38. #
  39. fetch: ${FETCHCMD}
  40. ifneq ($(shell [[ -f ${DISTFILES}/${FULLNAME} ]] && echo 0),0)
  41.         @echo " ==> Fetching ${DISTFILES}/${FULLNAME} "
  42.         cd ${DISTFILES} && \
  43.         ${FETCHCMD} ${SITE}/${FULLNAME}
  44.         @echo " ==> Done fetching "
  45. endif

  46. ##### extract
  47. #
  48. extract: ${DISTFILES}/${FULLNAME}
  49. ifneq ($(shell [[ -d ${SRCDIR} ]] && echo 0),0)
  50.         @echo " ==> Extracting ${DISTFILES}/${FULLNAME} "
  51.         mkdir ${TMPDIR}
  52. ifeq (${EXT},tar.bz2)
  53.         ${TAR} jxvf ${DISTFILES}/${FULLNAME} -C ${TMPDIR}
  54. else
  55.         ${TAR} zxvf ${DISTFILES}/${FULLNAME} -C ${TMPDIR}
  56. endif
  57.         @echo " ==> Done extracting "
  58. endif

  59. ##### build
  60. #
  61. build: extract ${SRCDIR}
  62.         @echo " ==> Building ${REALNAME} "

  63.         cd ${SRCDIR} &&                                        \
  64.         CC="${CC}" CXX="${CXX}"                                \
  65.         CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}"        \
  66.         ./configure --prefix=${PREFIX} ${OPTS} &&        \
  67.         make &&                                                \
  68.         make install DESTDIR=${PKGDIR}

  69.         mkdir -p ${DOCDIR}
  70.         cp $(wildcard ${SRCDIR}/[A-Z]*) ${DOCDIR}

  71.         @echo " ==> Done building "

  72. ##### package
  73. #
  74. package: ${PKGDIR} slack-desc
  75.         @echo " ==> Making ${PACKAGES}/${PKGNAME} "
  76.         cd ${PKGDIR} &&                                                        \
  77.         find . | xargs file | grep "current ar archive"                        \
  78.         | cut -f 1 -d : | xargs strip --strip-debug 2>/dev/null;        \
  79.         find . | xargs file | grep "executable" | grep "ELF"                \
  80.         | cut -f 1 -d : | xargs strip --strip-unneeded 2>/dev/null;        \
  81.         find . | xargs file | grep "shared object" | grep "ELF"                \
  82.         | cut -f 1 -d : | xargs strip --strip-unneeded 2>/dev/null;        \
  83.         /bin/true

  84.         mkdir ${PKGDIR}/install
  85.         cat slack-desc > ${PKGDIR}/install/slack-desc

  86. ifeq ($(shell [[ "`id -u`" = "0" ]] && echo 0),0)
  87.         cd ${PKGDIR} &&                \
  88.         chown -R root.root . &&        \
  89.         /sbin/makepkg -l y -c n ${PACKAGES}/${PKGNAME}
  90. endif
  91.         @echo " ==> Done making package "

  92. ##### clean
  93. #
  94. clean: ${TMPDIR}
  95.         @echo " ==> Cleaning up ${TMPDIR} "
  96.         rm -rf ${TMPDIR}
  97.         @echo " ==> Done cleaning "
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-3-31 09:22:13 | 显示全部楼层
Makefile感觉在流程控制上不如脚本,
脚本的话,每一条命令都检查错误,实在是不行
两者结合会比较好

slackware算是保守主义吧,而且一个东西,用了那么多年,不大可能一下子推倒重来的
回复 支持 反对

使用道具 举报

发表于 2006-3-31 11:02:27 | 显示全部楼层
孰优孰劣,我说不出,只能说,这个的可行性比pkgsrc高,没有把整个包管理系统推倒重来,只是改变一下打包过程,最终的成品还是标准的Slackware package,殊途同归。Slackware包制作的过程好像也没有个官方的标准,这个和deb与rpm不同。Slackware开发者与社群交流并不多,一般人很难对Pat施加影响,包管理系统也基本固定了,Pat估计也没有变的想法。现在社区开发的包管理改进,比如swaret和slapt-get,都没被纳入官方的发行,只要在社区推广,被用户接受就可以了。

shannleon你对Slackware的包管理系统的改进做了不少探索,我倒觉得你可以像fanx那样,自己做个发行版,基于Slackware,但把你的探索成果加入其中,包管理是发行版的根基,用户很难动摇。但根难动,老根上发新芽不是没可能。很多发行版不就是从已有发行版fork而出的吗。

分享 SlackBuild ,在论坛贴我看也够了,Arch版不就是那么做的吗。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-31 12:58:16 | 显示全部楼层
还是看好 pkgsrc 的,可毕竟是 BSD 的东西,使用起来中间也碰到不少问题。有些 Makefile 里把路径写死了。
没有把 swaret 或 slapt-get 加进去是不是有鼓励竞争的意味?一旦加入其中之一那就成事实上的标准了。同时加两个可能又会造成点混乱。
我现在这个东西对我个人能用,但是你看看也知道没有到可以大量使用的地步。更况且,我反对有一点点不一样的东西就做新的发行版。
有对熟悉的朋友请帮忙挑挑上面的 Makefile 的毛病,多谢了 :^)
回复 支持 反对

使用道具 举报

发表于 2006-3-31 13:05:08 | 显示全部楼层
你少了一步gzip manpage。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-31 13:11:00 | 显示全部楼层
请多多挑关于 make 的问题,因为我不懂。打包过程没完善,连权限都没管。也巧,我实验的这几个软件都没有 man pages ,呵呵。
比如,检查一个文件是否存在该怎么做?我上面的完全是临时办法
  1. ifneq ($(shell [[ -f filename ]] && echo 0),0)
  2. endif
复制代码
GNU 的 make 该怎么检查?BSD 的 make 好象可以 .if exists(filename)
回复 支持 反对

使用道具 举报

发表于 2006-3-31 13:37:52 | 显示全部楼层
直接用shell的test命令。或者$(wildcard),也会检查目录或文件是否存在的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-31 18:03:50 | 显示全部楼层
刚又看一遍 make 的 info pages,发现自己真白痴,带着 shell 的思想去写 Makefile。好多 make 的好处都没有用到。重新写了一遍,感觉好多了 :^)。
回复 支持 反对

使用道具 举报

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

本版积分规则

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