深入剖析C#继承机制6

来源:互联网 发布:淘宝交易有没有风险 编辑:程序博客网 时间:2024/06/10 02:09

分析并解读Makefile

---> soho2.8.1/uClinux/uC-src/Makefile
        第一句不知道什么意思:
 CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; /
    else if [ -x /bin/bash ]; then echo /bin/bash; /
    else if [ -x /usr/bin/bash ]; then echo /usr/bin/bash; /
    else if [ -x /usr/local/bin/bash ]; then echo /usr/local/bin/bash; /
    else echo sh; fi ; fi ; fi ; fi)

       
尝试的结果如下:
[chyy@localhost:~/soho2.8.1/uClinux/uC-src]# echo $BASH
/bin/bash
[chyy@localhost:~/soho2.8.1/uClinux/uC-src]# echo $$BASH
3785BASH
[chyy@localhost:~/soho2.8.1/uClinux/uC-src]# $($$BASH)
-bash: 3785BASH: command not found
        如果直接执行:
[chyy@localhost:~/soho2.8.1/uClinux/uC-src]# $(3785BASH)
-bash: 3785BASH: command not found
[chyy@localhost:~/soho2.8.1/uClinux/uC-src]# $(/bin/bash)
[chyy@localhost:~/soho2.8.1/uClinux/uC-src]# ps
[chyy@localhost:~/soho2.8.1/uClinux/uC-src]# id
        蓝色一句执行成功,执行了该句以后,用ps检查发现,Bash被执行了两遍,而且无论执行什么命令,都不会显示出结果。(待跟踪:执行了bash以后,为什么不会打印出命令结果
       
注意:makefile文件中的$符号,其意义是执行括号中的函数。而执行的shell中的“if -x”的意思是查看某个文件是否存在。

---> http://www.douzhe.com/docs/bbsjh/12/1039.html
2.6
函数 (Functions)
makefile
里的函数跟它的变量很相似——使用的时候,你用一个 $ 符号跟开括号,函 数名,空格后跟一列由逗号分隔的参数,最后 用关括号结束。例如,在 GNU Make 有一个叫 'wildcard' 的函 数,它有一个参数,功能是展开成一列所有符合由其参数 描述的文 件名,文件间以空格间隔。你可以像下面所示使用这个命令:
SOURCES = $(wildcard *.c)
这行会产生一个所有以 '.c' 结尾的文件的列表,然后存入变量 SOURCES 里。
        makefile文件示例:soho2.8.1/src/router/Makefile
ifneq ($(wildcard ../cy_conf.mak),)
  include ../cy_conf.mak
endif


---> soho2.8.1/src/router/Makefile
       
该文件中有下面两句
include .config
ifneq ($(wildcard ../cy_conf.mak),)
  include ../cy_conf.mak
endif

        
其中cy_conf.mak可以控制哪个模块是否编译,但是.config文件似乎也有控制模块是否编译的语句,比如PPP模块,在两个文件中都出现了,cy_conf.mak中是:
PPPD_SUPPORT=1
CONFIG_PPPD=y

        .config
中是:
CONFIG_PPP=y
        待跟踪:这两个配置文件的作用到底是什么,有什么区别?
        
从后面的一些语句来看,这两个配置都可以指导模块编译,如:
# uClibc wrapper
ifeq ($(
CONFIG_UCLIBC),y)
export PLATFORM := $(PLATFORM)-uclibc
endif

ifeq ($(IGMP_PROXY_SUPPORT),1)
CONFIG_IGMPPROXY=y
endif
        CONFIG_XXX形式出现的变量都在.config中定义,以XXX_SUPPORT形式出现的变量都在cy_conf.mak中出现,似乎.config文件是基本的配置文件,因为Makefile文件中有如下语句:
CONFIG_IPTABLES=y
obj-y += led
obj-y += nvram
obj-$(CONFIG_HTTPD) += httpd
obj-$(CONFIG_RC) += rc
......
obj-$(CONFIG_UPGRADEFIRMWARE) += upgrade_firmware
         为了验证,将.config中属于“Options”那一部分的模块全部屏蔽,并重新编译:
#CONFIG_VENDOR=broadcom
#CONFIG_UDHCPD=y
#CONFIG_DHCPRELAY=y
#CONFIG_PPP=y
#CONFIG_UPNP=y
......
#CONFIG_NTP=y
#CONFIG_DNSMASQ=y
......
#CONFIG_SNMPD=y
#CONFIG_ZEBRA=y
#CONFIG_FREESWAN=y
#CONFIG_TC=y
#CONFIG_PING=y
#CONFIG_EMAILALERT=y
#CONFIG_UPGRADEFIRMWARE=y

       
编译以前的image大小是:
[chyy@localhost:~]# ll /tftpboot/chyy/
total 12620
-rw-r--r-- 1 chyy sslvpn     594 May  9 00:06 default.scriptinfo.txt
lrwxrwxrwx 1 chyy sslvpn      32 May  9 00:06 image.bin -> /tftpboot/chyy/image.bin.default
-rwxr-xr-x 1 chyy sslvpn 4931680 May  9 00:06 image.bin.default
lrwxrwxrwx 1 chyy sslvpn      34 May  9 00:06 image.flash -> /tftpboot/chyy/image.flash.default
-rw-r--r-- 1 chyy sslvpn
3966671 May  9 00:06 image.flash.default
-rw-r--r-- 1 chyy sslvpn 3966671 May  9 00:06 image.flash.default.part1

      
观察重新编译后生成的image文件大小:
[chyy@localhost:~/soho2.8.1/src]# ll /tftpboot/chyy/
total 12620
-rw-r--r-- 1 chyy sslvpn     594 May  9 00:36 default.scriptinfo.txt
lrwxrwxrwx 1 chyy sslvpn      32 May  9 00:36 image.bin -> /tftpboot/chyy/image.bin.default
-rwxr-xr-x 1 chyy sslvpn 4931680 May  9 00:36 image.bin.default
lrwxrwxrwx 1 chyy sslvpn      34 May  9 00:36 image.flash -> /tftpboot/chyy/image.flash.default
-rw-r--r-- 1 chyy sslvpn
3966639 May  9 00:36 image.flash.default
-rw-r--r-- 1 chyy sslvpn 3966639 May  9 00:36 image.flash.default.part1
        可以认为没有什么效果。

Ctrl-C

一个GNU make高手的个人网页:

---> http://xhbdahai.cublog.cn/
       
下载了翻译后的《GNU Make中文手册》,包括HTML版本和PDF版本
        
学习了“$(MAKE) -C”伪目标的用法!(很有收获,推荐)
        

Ctrl-C

 

END