加载中…
个人资料
散人
散人
  • 博客等级:
  • 博客积分:0
  • 博客访问:15,610
  • 关注人气:4
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

9 shell/makefile之实践篇[一]

(2011-09-13 14:43:33)
标签:

linux

在这之前一直不怎么理解shell中 "$变量" , '$变量'  ,$变量,$(变量)在具体的区别,为此特意查找了一些资料。

变量语法:

     变量名=变量值
     [注]:等号两边不能留空格,否则代表变量包含空格;若变量本身就包含空格,则整个字符串都要用双引号括起来。
引用变量:
     $变量名 或  ${变量名}(强调变量)

 $?    最近一次命令执行后返回状态  0 成功 other  错误代码

 $<     依懒文件名(输入文件)

 $*     参数传递过程中的变量保存

 $#     参数传递过程中的变量个数

 $@     目标文件名(生成文件)

 $$     makefile中引用shell中变量的用法

           Makefile内容如下:

         规则的命令行。是规则所要执行的动作(任意的shell命令或者是可在shell下执行的程   序)。它限定了make执行这条规则时所需要的动作.下面for循环中的执行的动作都是在shell完成解析的。

          target:
              for i in * ; do\  i为shell变量

                   echo "$$i";\ $$i表示makefile中引用shell中的变量i
              done

 

#脚本完成2进制到10进制的转换,传入参数为2进制数据 , 注意事项就是字符串变量的整型操作,

#!/bin/bash
arg=1                  #等号左右无空格
bcd=0
num=`echo $1 | wc -c`  #得到2进制的个数
num=$((--num))         #$((变量))表示对变量进行整型操作,而非字符串操作,运算如C语言
#echo "len of char $num"
while [ $num -ge 1 ]   #循环获取相应的2进制位
do
  rval=`echo $1 | cut -b $num`
  #echo "cut $rval"
  num=$((num-1))
  if [ $rval -ne 0 ] ; then
      bcd=$((bcd += `expr "$arg" "*" 1`)) #利用1*2^0+1*2^1的原理累计得到10进制
  fi
  arg=$((arg*2))
done

echo "bcd=$bcd" #显示计算得到的10进制数

 

 $变量 :

"$变量":

'$变量':

$(变量):   命令替换作用

           MAKE = make
           RM = rm -rf
           MKDIR = mkdir -p
           CP = cp -a
           MV = mv

           $(MAKE) -C  PATH     用法      

 

还有就是创建sh脚本的时候用vim创建的脚本和windows右键创建一个sh的脚本效果不一样   

 

vim  test.sh

for d in * ; do
   if [ -d $d ] && ([ $d = src ] || [ $d = test ]); then
      echo "$d"
      make -C $d
   fi
done

 

进入目录src和test后执行编译。()不能用[]替换,否则出错。

 

for d in * ; do
   if [ -d $d ] && [ $d = $1 ]; then
      echo "$d"
      make -C $d
   fi
done

遍历所有文件,进入目录,执行脚本时传入指定的参数作为目录,如sh  tesh.sh  src或test

 

一  makefile举列

LIB = libjbos.a
INCPATH = ../../target/include/jb_os
LIBPATH = ../../target/lib

install: clean
@for i in $$(ls|grep .c); do\
     echo "$$i";\
     ckcore-elf-gcc -ggdb -Wpointer-arith -Wundef -Wall -Wstrict-prototypes -pipe -ffunction-     sections -DJ_DEVTOOLS=J_GXOS\# -DJ_DEVTOOLS=J_GXOS 为代码引用makefile宏定义
     -I ../include \
     -I ../../target/include \
     -I ../../target/include/gx \
     -L ../../target/lib/gx \
     -c $$i -o $${i%.c}.o;\
done
ar  rcs $(LIB) $$(ls|grep .o)
@if [ ! -e $(INCPATH) ]; then\
     echo "创建目录";\
     mkdir  $(INCPATH);\
fi
cp -rf ../include/*  $(INCPATH)
cp -rf ./$(LIB)      $(LIBPATH)

 

clean:
     echo  $$(ls|grep .c)           #搜索当前目录下所有的.c文件
     @for i in $$(ls|grep .c); do\  #遍历.c文件

          echo "$$i";\
          if [ -f "$(PWD)/$${i%.c}" ]; then\  #当前.c文件的二进制目标是否存在
               rm -rf $(PWD)/$${i%.c};\       #删除之

               rm -rf $(PWD)/$${i%.c}.o;\
               rm -rf $(PWD)/$${i%.c}.d;\
          fi;\
     done

 二  如果上述makefile的功能需要在shell脚本中实现,代码之实现了clean的相关功能(注意makefile和shell脚本的语法区别):

     for i in $(ls|grep .c); do
          echo "$i"
          echo $PWD
          if [ -f "$PWD/${i%.c}" ]; then  在if条件语句中变量之外最好加" " ,一般情况下可以不加
               echo "rm -rf $PWD/${i%.c}"
               rm -rf $PWD/${i%.c}
          fi
     done

 

二例  上述makefile的改进区别在执行make目标之前得到所有的.c文件,然后得到理论上的所有.o文件

INCPATH := ../../target/include/jb_os
LIBPATH := ../../target/lib
CFLAG := -ggdb -Wpointer-arith -Wundef -Wall -Wstrict-prototypes -pipe -ffunction-sections -DJ_DEVTOOLS=J_GXOS

C_SOURCES := $(shell ls | grep .c )  #list all .c
O_SOURCES := $(subst .c ,.o ,$(C_SOURCES))#list all .o#subst 字符串替换函数

%.o: %.c 
          @ckcore-elf-gcc $(INCFLAG) $(LIBFLAG) -c $< -o $@

#install 的依赖之一$(O_SOURCES) 为所有的.o文件 而.o的以来为.c文件,故先执行编译环节

install: clean $(O_SOURCES)
          @ar  rcs $(LIB) $$(ls|grep .o)
          @if [ ! -e $(INCPATH) ]; then\
                    echo "***************************create dir****************************";\
                    mkdir  $(INCPATH);\
          fi
          cp -rf ../include/*  $(INCPATH)
          cp -rf ./$(LIB)   $(LIBPATH)
 
clean:
          @rm -rf $(INCPATH)
          @rm -rf $(LIBPATH)/$(LIB)
          @rm -rf libjbos.a

          @for i in $$(ls|grep .c); do\
                    rm -rf $(PWD)/$${i%.c};\
                    rm -rf $(PWD)/$${i%.c}.o;\
                    rm -rf $(PWD)/$${i%.c}.d;\
          done

经过修改之后,流程比之前的makefile更加清晰,而且如果.c文件没有修改的话.o将不会跟更新。

 

最后写一下看代码的一点经验,大家有时候碰到遇到一些变量或则函数并不是在C代码里的,查找起来非常不方便,如果遇到这种情况请使用find ./ -name "*" | xargs grep -i 待查询的字符。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有