Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99366
  • 博文数量: 12
  • 博客积分: 477
  • 博客等级: 下士
  • 技术积分: 139
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-31 15:38
文章分类

全部博文(12)

文章存档

2014年(1)

2011年(2)

2010年(9)

分类: LINUX

2010-08-05 17:16:22

uClinux一般都会建立一个ROMFS文件系统,而把其它文件向该文件系统添加一般都通过$(ROMFSINST)命令,而ROMFSINST变量值就是romfs-inst.sh(这文件一般在和linux-2.6.x同级的tools目录下),执行$(ROMFSINST)就是执行romfs-inst.sh。

用法:

romfs-inst.sh [options] [src] dst

-v:输出执行时过程时信息
-e env-var:如果env-var中含有y或Y字符,就执行,否则不做任何动作
-o option:功能和-e很像,只是它不用变量而是用字符串。如果当中含有y或Y字符,就执行,否则不做任何动作
-p perms:设置目标文件的权限
-a text:把text内容添加到目标文件
-A patten:只在目标文件不存在patten,text内容才添加目标文件
-l link:不是复制文件,而是执行硬链接
-s sym-link:不是复制文件,而是执行符号链接

如果参数没给出src,那romfs-inst.sh用basename函数从dst中得到基本文件名,这基本文件名加上当前目录成为src的全文件名。
多个-e和-o选项会被执行逻辑与运算,如果不想执行逻辑与而是执行逻辑或,在条件中使用1或更多的y/n/字符的单个的-e/-o
如果src是一个目录,那当中的所有文件都会被复制过去(除了CVS目录)

注:汉字部分是在源码上添加的注释。

 

uClinux一般都会建立一个ROMFS文件系统,而把其它文件向该文件系统添加一般都通过$(ROMFSINST)命令,而ROMFSINST变量值就是romfs-inst.sh(这文件一般在和linux-2.6.x同级的tools目录下),执行$(ROMFSINST)就是执行romfs-inst.sh。

用法:

romfs-inst.sh [options] [src] dst

-v:输出执行时过程时信息
-e env-var:如果env-var中含有y或Y字符,就执行,否则不做任何动作
-o option:功能和-e很像,只是它不用变量而是用字符串。如果当中含有y或Y字符,就执行,否则不做任何动作
-p perms:设置目标文件的权限
-a text:把text内容添加到目标文件
-A patten:只在目标文件不存在patten,text内容才添加目标文件
-l link:不是复制文件,而是执行硬链接
-s sym-link:不是复制文件,而是执行符号链接

如果参数没给出src,那romfs-inst.sh用basename函数从dst中得到基本文件名,这基本文件名加上当前目录成为src的全文件名。
多个-e和-o选项会被执行逻辑与运算,如果不想执行逻辑与而是执行逻辑或,在条件中使用1或更多的y/n/字符的单个的-e/-o
如果src是一个目录,那当中的所有文件都会被复制过去(除了CVS目录)

注:汉字部分是在源码上添加的注释。

  1. #!/bin/sh
  2. #
  3. # A tool to simplify Makefiles that need to put something
  4. # into the ROMFS
  5. #
  6. # Copyright (C) David McCullough, 2002,2003
  7. #
  8. #############################################################################

  9. # Provide a default PATH setting to avoid potential problems...
  10. PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:$PATH"

  11. usage()
  12. {
  13. cat << !EOF >&2
  14. $0: [options] [src] dst
  15.     -v          : output actions performed.
  16.     -e env-var  : only take action if env-var is set to "y".
  17.     -o option   : only take action if option is set to "y".
  18.     -p perms    : chmod style permissions for dst.
  19.     -a text     : append text to dst.
  20. -A pattern  : only append text if pattern doesn't exist in file
  21.     -l link     : dst is a link to 'link'.
  22.     -s sym-link : dst is a sym-link to 'sym-link'.

  23.     if "src" is not provided,  basename is run on dst to determine the
  24.     source in the current directory.

  25. multiple -e and -o options are ANDed together.  To achieve an OR affect
  26. use a single -e/-o with 1 or more y/n/"" chars in the condition.

  27. if src is a directory,  everything in it is copied recursively to dst
  28. with special files removed (currently CVS dirs).
  29. !EOF
  30. exit 1
  31. }

  32. #############################################################################

  33. 用法:
  34. 见以上

  35. setperm()
  36. {
  37. if [ "$perm" ]
  38. then
  39. [ "$v" ] && echo "chmod ${perm} ${ROMFSDIR}${dst}"
  40. chmod ${perm} ${ROMFSDIR}${dst}
  41. fi
  42. }

  43. #############################################################################

  44. file_copy()
  45. {
  46. if [ -d "${src}" ]
  47. then
  48. [ "$v" ] && echo "CopyDir ${src} ${ROMFSDIR}${dst}"
  49. (
  50. cd ${src}
  51. V=
  52. [ "$v" ] && V=v
  53. find . -print | grep -E -v '/CVS' | cpio -p${V}dumL ${ROMFSDIR}${dst}
  54. )
  55. else
  56. rm -f ${ROMFSDIR}${dst}
  57. [ "$v" ] && echo "cp ${src} ${ROMFSDIR}${dst}"
  58. cp ${src} ${ROMFSDIR}${dst}
  59. setperm ${ROMFSDIR}${dst}
  60. fi
  61. }

  62. #############################################################################

  63. file_append()
  64. {
  65. touch ${ROMFSDIR}${dst}
  66. if [ -z "${pattern}" ] && grep -F "${src}" ${ROMFSDIR}${dst} > /dev/null
  67. then
  68. [ "$v" ] && echo "File entry already installed."
  69. elif [ "${pattern}" ] && egrep "${pattern}" ${ROMFSDIR}${dst} > /dev/null
  70. then
  71. [ "$v" ] && echo "File pattern already installed."
  72. else
  73. [ "$v" ] && echo "Installing entry into ${ROMFSDIR}${dst}."
  74. echo "${src}" >> ${ROMFSDIR}${dst}
  75. fi
  76. setperm ${ROMFSDIR}${dst}
  77. }

  78. #############################################################################

  79. hard_link()
  80. {
  81. rm -f ${ROMFSDIR}${dst}
  82. [ "$v" ] && echo "ln ${src} ${ROMFSDIR}${dst}"
  83. ln ${src} ${ROMFSDIR}${dst}
  84. }

  85. #############################################################################

  86. sym_link()
  87. {
  88. rm -f ${ROMFSDIR}${dst}
  89. [ "$v" ] && echo "ln -s ${src} ${ROMFSDIR}${dst}"
  90. ln -sf ${src} ${ROMFSDIR}${dst}
  91. }

  92. #############################################################################
  93. #
  94. # main program entry point
  95. #

  96. if [ -z "$ROMFSDIR" ]
  97. then
  98. echo "ROMFSDIR is not set" >&2
  99. usage
  100. exit 1
  101. fi
  102. # 测试是否设置了ROMFSDIR变量,外部在调用romfs-inst.sh时必须设置了ROMFSDIR变量


  103. v=
  104. option=y
  105. pattern=
  106. perm=
  107. func=file_copy
  108. src=
  109. dst=

  110. while getopts 've:o:A:p:a:l:s:' opt "$@"
  111. do
  112. case "$opt" in
  113. v) v="1";                           ;;
  114. o) option="$OPTARG";                ;;
  115. e) eval option=\"\$$OPTARG\";       ;;
  116. p) perm="$OPTARG";                  ;;
  117. a) src="$OPTARG"; func=file_append; ;;
  118. A) pattern="$OPTARG";               ;;
  119. l) src="$OPTARG"; func=hard_link;   ;;
  120. s) src="$OPTARG"; func=sym_link;    ;;

  121. *)  break ;;
  122. esac
  123. #
  124. # process option here to get an ANDing effect
  125. #
  126. case "$option" in
  127. *[yY]*) # this gives OR effect, ie., nYn
  128. ;;
  129. *)
  130. [ "$v" ] && echo "Condition not satisfied."
  131. exit 0
  132. ;;
  133. esac
  134. # 判断此处是否要执行动作。该判断是通过检查$option变量完成的,只要$option含有y或Y字符,那就认为要执行。因为这是在while循环中,如果命令行中含有多个o或e选项,意味着只要遇到一个就执行了,结果下来就是一个or操作。
  135. done

  136. shift `expr $OPTIND - 1`
  137. # 经过shift语句,所有带选项的参数都将被移走,将只剩下最后1个或2个(正常情况下)参数,即$#值将从原来的$OPTIND或$OPTIND + 1变成不是1就是2,而$1和$2变为要被处理的文件

  138. case $# in
  139. 1)
  140. dst="$1"
  141. if [ -z "$src" ]
  142. then
  143. src="`basename $dst`"
  144. # 命令行中没有src参数,源文件 = 执行romfs-inst.sh时当前目录 + $dst中基本文件名
  145. fi
  146. ;;
  147. 2)
  148. if [ ! -z "$src" ]
  149. then
  150. echo "Source file already provided" >&2
  151. exit 1
  152. fi
  153. src="$1"
  154. dst="$2"
  155. ;;
  156. # 命令行为中有src参数,此时src指出的文件必须不存在
  157. *)
  158. usage
  159. ;;
  160. esac


  161. $func

  162. exit 0

  163. #############################################################################
复制代码
 
 
 

示例

/Makefile
ROMFSINST= romfs-inst.sh
进入此处时当前目录是/vendors/Qpixel/QL201
ROMFSDIR=/romfs

$(ROMFSINST) -s ../var/tmp/log /dev/log
建立符号链接,执行linux命令,ln -sf /vendors/Qpixel/var/tmp/log /romfs/dev/log。

$(ROMFSINST) -s ./bin /sbin
建立符号链接,执行linux命令,ln -sf /vendors/Qpixel/QL201/bin /romfs/sbin。

$(ROMFSINST) /etc/profile,(/vendors/Qpixel/QL201/etc/profile是目录)
把当前目录下的/etc/profile下除CVS目录的所有文件复制到ROMFS文件系统上。
执行CopyDIr /vendors/Qpixel/QL201/profile /romfs/etc/profile,具体到命令,find . -print | grep -E -v '/CVS' | cpio -pdumL /romfs/etc/profile

$(ROMFSINST) /etc/rc,(/vendors/Qpixel/QL201/etc/rc是文件)
删除ROMFS文件系统上的rc文件,把位于当前目录下的rc复到到文件系统上。
rm /romfs/etc/rc
cp /vendors/Qpixel/QL201/rc /romfs/etc/rc
 
 
原文请见:
 
阅读(3627) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~