Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1912485
  • 博文数量: 376
  • 博客积分: 2147
  • 博客等级: 大尉
  • 技术积分: 3642
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-06 10:47
文章分类

全部博文(376)

文章存档

2019年(3)

2017年(28)

2016年(15)

2015年(17)

2014年(182)

2013年(16)

2012年(115)

我的朋友

分类: 嵌入式

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

 

#############################################################################
                复制代码

 

                示例
                /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

 转自:http://blog.chinaunix.net/uid-21674024-id-135361.html

参考:

阅读(2111) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~