分类: 嵌入式
2013-02-18 17:41:10
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目录)
注:汉字部分是在源码上添加的注释。
#!/bin/sh
#
# A tool to simplify Makefiles that need to put something
# into the ROMFS
#
# Copyright (C) David McCullough, 2002,2003
#
#############################################################################
# Provide a default PATH setting to avoid potential problems...
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:$PATH"
usage()
{
cat << !EOF >&2
$0:
[options] [src] dst
-v :
output actions performed.
-e env-var :
only take action if env-var is set to "y".
-o option :
only take action if option is set to "y".
-p perms :
chmod style permissions for dst.
-a text :
append text to dst.
-A pattern :
only append text if pattern doesn't exist in file
-l link : dst is a link to 'link'.
-s sym-link : dst is a sym-link to 'sym-link'.
if "src" is not provided, basename is run on dst to determine the source in the current directory.
multiple -e and -o options are ANDed together. To achieve an OR affect use a single -e/-o with 1 or more y/n/"" chars in the condition.
if src is a directory, everything in it is copied recursively to dst with special files removed (currently CVS dirs).
!EOF
exit 1
}
#############################################################################
用法:
见以上
setperm()
{
if [ "$perm" ]
then
[ "$v" ] && echo "chmod ${perm} ${ROMFSDIR}${dst}"
chmod ${perm} ${ROMFSDIR}${dst}
fi
}
#############################################################################
file_copy()
{
if [ -d "${src}" ]
then
[ "$v" ] && echo "CopyDir ${src} ${ROMFSDIR}${dst}"
(
cd ${src}
V=
[ "$v" ] && V=v
find . -print | grep -E -v '/CVS' | cpio -p${V}dumL ${ROMFSDIR}${dst}
)
else
rm -f ${ROMFSDIR}${dst}
[ "$v" ] && echo "cp ${src} ${ROMFSDIR}${dst}"
cp ${src} ${ROMFSDIR}${dst}
setperm ${ROMFSDIR}${dst}
fi
}
#############################################################################
file_append()
{
touch ${ROMFSDIR}${dst}
if [ -z "${pattern}" ] && grep -F "${src}" ${ROMFSDIR}${dst} > /dev/null
then
[ "$v" ] && echo "File entry already installed."
elif [ "${pattern}" ] && egrep "${pattern}" ${ROMFSDIR}${dst} > /dev/null
then
[ "$v" ] && echo "File pattern already installed."
else
[ "$v" ] && echo "Installing entry into ${ROMFSDIR}${dst}."
echo "${src}" >> ${ROMFSDIR}${dst}
fi
setperm ${ROMFSDIR}${dst}
}
#############################################################################
hard_link()
{
rm -f ${ROMFSDIR}${dst}
[ "$v" ] && echo "ln ${src} ${ROMFSDIR}${dst}"
ln ${src} ${ROMFSDIR}${dst}
}
#############################################################################
sym_link()
{
rm -f ${ROMFSDIR}${dst}
[ "$v" ] && echo "ln -s ${src} ${ROMFSDIR}${dst}"
ln -sf ${src} ${ROMFSDIR}${dst}
}
#############################################################################
#
# main program entry point
#
if [ -z "$ROMFSDIR" ]
then
echo "ROMFSDIR is not set" >&2
usage
exit 1
fi
# 测试是否设置了ROMFSDIR变量,外部在调用romfs-inst.sh时必须设置了ROMFSDIR变量
v=
option=y
pattern=
perm=
func=file_copy
src=
dst=
while getopts 've:o:A:p:a:l:s:' opt "$@"
do
case "$opt" in
v) v="1"; ;;
o) option="$OPTARG"; ;;
e) eval option=\"\$$OPTARG\"; ;;
p) perm="$OPTARG"; ;;
a) src="$OPTARG"; func=file_append; ;;
A) pattern="$OPTARG"; ;;
l) src="$OPTARG"; func=hard_link; ;;
s) src="$OPTARG"; func=sym_link; ;;
*) break ;;
esac
#
# process option here to get an ANDing effect
#
case "$option" in
*[yY]*) # this gives OR effect, ie., nYn
;;
*)
[ "$v" ] && echo "Condition not satisfied."
exit 0
;;
esac
# 判断此处是否要执行动作。该判断是通过检查$option变量完成的,只要$option含有y或Y字符,那就认为要执行。因为这是在while循环中,如果命令行中含有多个o或e选项,意味着只要遇到一个就执行了,结果下来就是一个or操作。
done
shift `expr $OPTIND - 1`
# 经过shift语句,所有带选项的参数都将被移走,将只剩下最后1个或2个(正常情况下)参数,即$#值将从原来的$OPTIND或$OPTIND + 1变成不是1就是2,而$1和$2变为要被处理的文件
case $# in
1)
dst="$1"
if [ -z "$src" ]
then
src="`basename $dst`"
# 命令行中没有src参数,源文件 = 执行romfs-inst.sh时当前目录 + $dst中基本文件名
fi
;;
2)
if [ ! -z "$src" ]
then
echo "Source file already provided" >&2
exit 1
fi
src="$1"
dst="$2"
;;
# 命令行为中有src参数,此时src指出的文件必须不存在
*)
usage
;;
esac
$func
exit 0
#############################################################################
复制代码
示例
ROMFSINST= romfs-inst.sh
进入此处时当前目录是
ROMFSDIR=
$(ROMFSINST) -s ../var/tmp/log /dev/log
建立符号链接,执行linux命令,ln -sf
$(ROMFSINST) -s ./bin /sbin
建立符号链接,执行linux命令,ln -sf
$(ROMFSINST) /etc/profile,(
把当前目录下的/etc/profile下除CVS目录的所有文件复制到ROMFS文件系统上。
执行CopyDIr
/CVS' | cpio -pdumL
$(ROMFSINST) /etc/rc,(
删除ROMFS文件系统上的rc文件,把位于当前目录下的rc复到到文件系统上。
rm
cp
转自:http://blog.chinaunix.net/uid-21674024-id-135361.html
参考: