makefile中PLATFORM_LIBGCC问题

lzg371 2011-10-10 05:13:58
在uboot 2010中有如下内容

# Add GCC lib
ifdef USE_PRIVATE_LIBGCC # ? 目前我很难去判定是否定义了这个变量,也很难确定这个变量在哪里定义。
ifeq ("$(USE_PRIVATE_LIBGCC)", "yes")
PLATFORM_LIBGCC = $(OBJTREE)/arch/$(ARCH)/lib/libgcc.o
# ? PLATFORM_LIBGCC是定义gcc的库吗? gcc的库怎么在这里呢? 为什么会放在这个目录,奇怪啊? 这不是系统的gcc库吗?
else
PLATFORM_LIBGCC = -L $(USE_PRIVATE_LIBGCC) -lgcc # ? -L 和-l各代表什么含义呢?
endif
else
PLATFORM_LIBGCC = -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
# lzg ? 这句就更难理解了CC和CFLAGS代表什么呢? 这句执行的结果又是什么呢?
endif
PLATFORM_LIBS += $(PLATFORM_LIBGCC)
export PLATFORM_LIBS # lzg ? PLATFORM_LIBS有什么用呢?



...全文
420 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzg371 2012-03-06
  • 打赏
  • 举报
回复
再次补充问题2:
clobber: clean
@find $(OBJTREE) -type f \( -name '*.depend' \
-o -name '*.srec' -o -name '*.bin' -o -name u-boot.img \) \
-print0 \
| xargs -0 rm -f
@rm -f $(OBJS) $(obj)*.bak $(obj)ctags $(obj)etags $(obj)TAGS \
$(obj)cscope.* $(obj)*.*~
@rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL)

@rm -f $(obj)u-boot.kwb
@rm -f $(obj)u-boot.imx
@rm -f $(obj)tools/{env/crc32.c,inca-swap-bytes}
@rm -f $(obj)arch/powerpc/cpu/mpc824x/bedbug_603e.c
@rm -f $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm
@rm -fr $(obj)include/generated
@[ ! -d $(obj)nand_spl ] || find $(obj)nand_spl -name "*" -type l -print | xargs rm -f
@[ ! -d $(obj)onenand_ipl ] || find $(obj)onenand_ipl -name "*" -type l -print | xargs rm -f

问题:
1. clobber做什么用? 我怎么从来没有用过啊?依赖是clean也很奇怪啊,因为clean从来也没有生成阿.
2. @find $(OBJTREE) -type f \( -name '*.depend' \
-o -name '*.srec' -o -name '*.bin' -o -name u-boot.img \) \
-print0 \
| xargs -0 rm -f
这里正是我所要找的那些中间文件,depend,*.srec *.bin u-boot.img,为什么clean的时候不执行,而放到这里?
3. @rm -f $(OBJS) $(obj)*.bak $(obj)ctags $(obj)etags $(obj)TAGS \
$(obj)cscope.* $(obj)*.*~
 TAGS那里定义的?*.*~是什么文件呢? 删除*.bak ctags etags TAGS escope.* 这些都是什么文件啊?
4. @rm -f $(obj)tools/{env/crc32.c,inca-swap-bytes} 这里为什么工具要删除这几个文件呢?而且其中有.c的源文件。
5. @rm -f $(obj)arch/powerpc/cpu/mpc824x/bedbug_603e.c 删除文件很少去针对一个cpu目录去删除文件,而且还只删除一个.c的源文件,就更令人称奇了。为什么这样做?
6. @rm -f $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm 这三个又是什么文件呢?为什么要删除?
7. @rm -fr $(obj)include/generated 特别注意,这是删除整个目录了,是第一次出现这样的情况。那么这个目录文件又是怎样生成的呢?为什么可以全部删除?
8. @[ ! -d $(obj)nand_spl ] || find $(obj)nand_spl -name "*" -type l -print | xargs rm -f 我分析此句的意思如下。首先, cmd1||cmd2 应该是cmd1为假才执行cmd2. 若 cmd1 執行完畢且正確執行($?=0),則 cmd2 不執行. 这里就是如果$(obj)nand_spl是目录,则执行在nand_spl目录下面是链接文件,所有的文件,删除 。这个分析对吗?@[ ! -d $(obj)nand_spl ]的含义是“如果$(obj)nand_spl是目录”,分析的对吗? 这里的*用*.*是一样的吧?


ifeq ($(OBJTREE),$(SRCTREE))
mrproper \
distclean: clobber unconfig
else
mrproper \
distclean: clobber unconfig
rm -rf $(obj)*
endif

问题
1. ifeq ($(OBJTREE),$(SRCTREE))
mrproper
distclean: clobber unconfig
目录相同执行mrproper,这个命令做什么呢? 这里执行distclean目标好像什么也不做啊?
2. distclean: clobber unconfig
rm -rf $(obj)*
这个厉害了,是删除目标的所有文件吧? 可以删除整个目录吗?我的推测因为目标是单独一个目录,这样处理反而简单。


backup:
F=`basename $(TOPDIR)` ; cd .. ; \
gtar --force-local -zcvf `LC_ALL=C date "+$$F-%Y-%m-%d-%T.tar.gz"` $$F #lzg ? gtar是什么意思? --force-local什么含义? `LC_ALL=C date "+$$F-%Y-%m-%d-%T.tar.gz"` 这个倒引号里面是两个指令吧? 中间为什么吗不用分号隔开? date 命令后面什么意思? 两个$$F又是什么意思? 回答: 试解析gtar 压缩文件,从$$F 也就是basename $(TOPDIR)文件中压缩为"$$F-%Y-%m-%d-%T.tar.gz"年月日格式的压缩文件. --force-local archive file is local even if has a colon ,我的理解是归档文件在本地,即使有一个备份,但是查阅colon的含义只有冒号的意思. -z filter the archive through gzip, 通过gzip 筛选数据. c --create create a new archive 创造一个档案文件. v --verbose verbosely list files processed 我个人觉得是详尽的列出被处理的文件. -f, --file=ARCHIVE use archive file or device ARCHIVE 用档案文件或者设备档案文件. 如果date命令有以“+”开始的参数,那么date命令将以该参数指定的格式显示当前日期和时间.数FormatString称为日期时间格式串,可以使用单引号或双引号括起来,也可以不使用任何引号。它是由以%开始的控制符以及普通字符组成的。当显示日期和时间时,普通字符原样显示,而控制符则控制日期和时间的显示格式。

问题
1. `LC_ALL=C date "+$$F-%Y-%m-%d-%T.tar.gz"` 这句倒引号里面可以执行两条指令吗? 中间为什么吗不用分号隔开? 两个$$F又是什么意思? gtar一句是什么意思?我的理解是,gtar 压缩
文件,从$$F 也就是basename $(TOPDIR)文件中压缩为"$$F-%Y-%m-%d-%T.tar.gz"年月日格式的压缩文件. 这样分析对吗?
能否给gtar的参数--force-local -zcvf 给一个生动的解释?
另外参数--force-local 一个英文解释是archive file is local even if has a colon ,我的理解是归档文件在本地,即使有一个备份,但是查阅colon的含义只有冒号的意思.
v --verbose verbosely list files processed 我个人觉得是详尽的列出被处理的文件.
-f, --file=ARCHIVE use archive file or device ARCHIVE 用档案文件或者设备档案文件.
lzg371 2012-03-06
  • 打赏
  • 举报
回复
再次补充问题:

clean:
@rm -f $(obj)examples/standalone/82559_eeprom \
$(obj)examples/standalone/atmel_df_pow2 \
$(obj)examples/standalone/eepro100_eeprom \
$(obj)examples/standalone/hello_world \
$(obj)examples/standalone/interrupt \
$(obj)examples/standalone/mem_to_mem_idma2intr \
$(obj)examples/standalone/sched \
$(obj)examples/standalone/smc91111_eeprom \
$(obj)examples/standalone/test_burst \
$(obj)examples/standalone/timer
@rm -f $(obj)examples/api/demo{,.bin}
@rm -f $(obj)tools/bmp_logo $(obj)tools/easylogo/easylogo \
$(obj)tools/env/{fw_printenv,fw_setenv} \
$(obj)tools/envcrc \
$(obj)tools/gdb/{astest,gdbcont,gdbsend} \
$(obj)tools/gen_eth_addr $(obj)tools/img2srec \
$(obj)tools/mkimage $(obj)tools/mpc86x_clk \
$(obj)tools/ncb $(obj)tools/ubsha1
@rm -f $(obj)board/cray/L1/{bootscript.c,bootscript.image} \
$(obj)board/matrix_vision/*/bootscript.img \
$(obj)board/netstar/{eeprom,crcek,crcit,*.srec,*.bin} \
$(obj)board/trab/trab_fkt $(obj)board/voiceblue/eeprom \
$(obj)board/armltd/{integratorap,integratorcp}/u-boot.lds \
$(obj)u-boot.lds \
$(obj)arch/blackfin/cpu/bootrom-asm-offsets.[chs]
@rm -f $(obj)include/bmp_logo.h
@rm -f $(obj)lib/asm-offsets.s
@rm -f $(obj)nand_spl/{u-boot.lds,u-boot-spl,u-boot-spl.map,System.map}
@rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl.map}
@rm -f $(ONENAND_BIN)
@rm -f $(obj)onenand_ipl/u-boot.lds
@rm -f $(TIMESTAMP_FILE) $(VERSION_FILE)
@find $(OBJTREE) -type f \
\( -name 'core' -o -name '*.bak' -o -name '*~' \
-o -name '*.o' -o -name '*.a' -o -name '*.exe' \) -print \
| xargs rm -f



问题
1. 对于 rm -f $(obj)examples/standalone 多个删除语句,为什么删除exmaple/standalone这个目录下面的很多文件呢? 我查过目录中有一些文件没有删除?
2. @rm -f $(obj)examples/api/demo{,.bin} demo{,.bin}这是什么意思啊?我搜索到资料说大括号一个作用常用在字串的组合上,在这里我个人分析可能是examples/api/demo 或者 examples/api/demo.bin,不知道是否正确? 这里api目录为什么也只删除这一个文件呢.
3. $(obj)tools/env/{fw_printenv,fw_setenv} 在这个目录下无法发现fw_printenv,fw_setenv,为什么删除这两个? $(obj)tools/gdb/{astest,gdbcont,gdbsend} 目录下没有astest,这个文件做什么呢?
4. rm -f $(obj)tools 删除工具下的临时文件。为什么有选择的删除?
5. @rm -f $(obj)board/cray/L1/{bootscript.c,bootscript.image} 在该目录下面有个bootscript.hush , 这里要删除bootscript.c可是源文件阿? 为什么删除?
6. @rm -f $(obj)board 为什么删除board下面的文件。integratorap,integratorcp在board/armltd目录下面没有找到?
7. @rm -f $(obj)u-boot.lds 我记得根目录下面有很多uboot的二进制文件呢,为什么只删除这一个?
8. $(obj)arch/blackfin/cpu/bootrom-asm-offsets.[chs] 这里为什么删除源文件?
9. @rm -f $(obj)include/bmp_logo.h 没有找到这个文件,为什么删除.h文件?
10. @rm -f $(obj)lib/asm-offsets.s .s是什么文件,为什么要删除?
11. @rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl.map} 以上删除的文件都各做什么用呢?
12. @rm -f $(ONENAND_BIN) ONENAND_BIN可能是$(obj)onenand_ipl/onenand-ipl-2k.bin也可能是空。删除空会引起异常吗?
13. @rm -f $(TIMESTAMP_FILE) $(VERSION_FILE) TIMESTAMP_FILE是$(obj)include/timestamp_autogenerated.h,这个文件又是做什么用呢?VERSION_FILE代表是$(obj)include/version_autogenerated.h,这个文件又是做什么用呢?
14. @find $(OBJTREE) -type f \
\( -name 'core' -o -name '*.bak' -o -name '*~' \
-o -name '*.o' -o -name '*.a' -o -name '*.exe' \) -print \
| xargs rm -f
名字 *~是什么意思啊? -o应该是or的缩写,意思是逻辑运算符 -o 我查到一篇英文文档解释是 "expr1 -o expr2 Or; expr2 is not evaluated if expr1 is true" 这里分析就是如果找到core文件就停止搜索.否则,继续寻找*.bak,如果找到*.bak停止,否则依次进行. 可是,我自己在机器上执行发现不是这个样子,而是都执行.比如我在当前目录有一个Makefile和loader.bin文件,当我输入命令 find ./ -name 'Makefile' -o 'loader.bin' 结果两个文件都出现在搜索结果上.请问应该如何正确理解呢?
lzg371 2012-03-06
  • 打赏
  • 举报
回复
补充问题:


#########################################################################
## Atmel AT91RM9200 Systems
#########################################################################

CPUAT91_RAM_config \
CPUAT91_config : unconfig
@mkdir -p $(obj)include
@echo "#define CONFIG_$(@:_config=) 1" >$(obj)include/config.h
@$(MKCONFIG) -n $@ -a cpuat91 arm arm920t cpu at91 eukrea at91

问题:
1. CPUAT91_config : unconfig
从标题看我们应该进入这个目录,但是从目标文件看,我们好像没有这样去配置啊。 那么到底用还是不用啊?unconfig本身并不存在,所以一定会执行了, 那么为什么还要这个依赖文件呢?

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧