【第22期】观点:IT 行业加班,到底有没有价值?

bootloader---10.一个通用的Makefile

原创 2016年08月29日 13:53:36
 每次添加了一个文件就要改Makefile,效率太低了,绝对不能容忍!所以必须写一个通用的Makefile,以下的这个Makefile是从u-boot-1.1.6的编译部分修改而来,效果还不错。
一、通用Makefile

点击(此处)折叠或打开

  1. CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-

  2. AS = $(CROSS_COMPILE)as
  3. LD = $(CROSS_COMPILE)ld
  4. CC = $(CROSS_COMPILE)gcc
  5. CPP = $(CC) -E
  6. AR = $(CROSS_COMPILE)ar
  7. NM = $(CROSS_COMPILE)nm
  8. STRIP = $(CROSS_COMPILE)strip
  9. OBJCOPY = $(CROSS_COMPILE)objcopy
  10. OBJDUMP = $(CROSS_COMPILE)objdump
  11. RANLIB = $(CROSS_COMPILE)RANLIB

  12. TEXT_BASE = 0x33D80000
  13. gccincdir := $(shell $(CC) -print-file-name=include)
  14. PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
  15. PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -malignment-traps
  16. PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__ -march=armv4 -mapcs-32

  17. CFLAGS += $(DBGFLAGS) $(OPTFLAGS)
  18. CFLAGS += $(PLATFORM_RELFLAGS)
  19. CFLAGS += -D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE)
  20. CFLAGS += -I$(CURDIR)/include
  21. CFLAGS += -fno-builtin -ffreestanding -nostdinc -isystem $(gccincdir) -pipe
  22. CFLAGS += $(PLATFORM_CPPFLAGS)
  23. CFLAGS += -Wall -Wstrict-prototypes

  24. LDSCRIPT := $(CURDIR)/u-boot.lds
  25. AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CFLAGS)
  26. LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)

  27. OBJS := start.o
  28. ALL = u-boot.bin System.map u-boot.dis

  29. all: $(ALL)

  30. u-boot.bin: u-boot
  31. $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

  32. u-boot.dis: u-boot
  33. $(OBJDUMP) -d $< > $@

  34. u-boot: $(OBJS) $(LDSCRIPT)
  35. $(LD) $(LDFLAGS) $(OBJS) -Map u-boot.map -o u-boot

  36. System.map: u-boot
  37. @$(NM) $< | \
  38. grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
  39. sort > System.map

  40. %.o: %.S
  41. $(CC) $(AFLAGS) -c -o $@ $<
  42. %.o: %.c
  43. $(CC) $(CFLAGS) -c -o $@ $<

  44. clean:
  45. find $(OBJTREE) -type f \
  46. \( -name 'core' -o -name '*.bak' -o -name '*~' \
  47. -o -name '*.o' -o -name '*.a' \) -print \
  48. | xargs rm -f
  49. rm -f $(ALL) u-boot System.map u-boot.map
每次添加一个文件时,只需把OBJS修改一下就可以了。

里面还有几个编译选项不太明白是什么意思,先放着,等有时间查一下手册
其中L15:gccincdir := $(shell $(CC) -print-file-name=include) ;是要显示当前gcc所查找include的完整路径: /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/include

L16 $(CC) $(CFLAGS) -print-libgcc-file-name ;要显示libgcc的完整路径
/opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/libgcc.a

2. u-boot.lds链接脚本

点击(此处)折叠或打开

  1. OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
  2. /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
  3. OUTPUT_ARCH(arm)
  4. ENTRY(_start)
  5. SECTIONS
  6. {
  7. . = 0x00000000;

  8. . = ALIGN(4);
  9. .text :
  10. {
  11. start.o (.text)
  12. *(.text)
  13. }

  14. . = ALIGN(4);
  15. .rodata : { *(.rodata) }

  16. . = ALIGN(4);
  17. .data : { *(.data) }

  18. . = ALIGN(4);
  19. .got : { *(.got) }

  20. . = .;
  21. __u_boot_cmd_start = .;
  22. .u_boot_cmd : { *(.u_boot_cmd) }
  23. __u_boot_cmd_end = .;

  24. . = ALIGN(4);
  25. __bss_start = .;
  26. .bss : { *(.bss) }
  27. _end = .;
  28. }
链接地址可以直接在Makefile中修改:TEXT_BASE = 0x33D80000

注意:代码中的tab在粘贴的时候可能丢失了,上传一个, 用的时候将Makefile.txt改名为Makefile就可以了。
二、中间文件输出到单独的目录
2.1 修改Makefile将生成的中间文件都放在单独的目录下,这样代码和编译出来的东东都很清晰了。

点击(此处)折叠或打开

  1. CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-

  2. AS    = $(CROSS_COMPILE)as
  3. LD    = $(CROSS_COMPILE)ld
  4. CC    = $(CROSS_COMPILE)gcc
  5. CPP    = $(CC) -E
  6. AR    = $(CROSS_COMPILE)ar
  7. NM    = $(CROSS_COMPILE)nm
  8. STRIP    = $(CROSS_COMPILE)strip
  9. OBJCOPY = $(CROSS_COMPILE)objcopy
  10. OBJDUMP = $(CROSS_COMPILE)objdump
  11. RANLIB    = $(CROSS_COMPILE)RANLIB

  12. TEXT_BASE = 0x33D80000
  13. gccincdir := $(shell $(CC) -print-file-name=include)
  14. PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
  15. PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -malignment-traps
  16. PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__ -march=armv4 -mapcs-32

  17. #OPTFLAGS= -O0 
  18. #OPTFLAGS= -O1 
  19. #OPTFLAGS= -O2 
  20. #OPTFLAGS= -O3 
  21. OPTFLAGS= -Os 
  22. CFLAGS += $(DBGFLAGS) $(OPTFLAGS) 
  23. CFLAGS += $(PLATFORM_RELFLAGS) 
  24. CFLAGS += -D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE)        
  25. CFLAGS += -I$(CURDIR)/include
  26. CFLAGS += -fno-builtin -ffreestanding -nostdinc -isystem $(gccincdir) -pipe 
  27. CFLAGS += $(PLATFORM_CPPFLAGS) 
  28. CFLAGS += -Wall -Wstrict-prototypes

  29. LDSCRIPT := $(CURDIR)/u-boot.lds
  30. AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CFLAGS)
  31. LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)

  32. OBJDIR = ./obj/
  33. # Attempt to create a output directory.
  34. $(shell [ -d ${OBJDIR} ] || mkdir -p ${OBJDIR})

  35. SRCS := $(wildcard *.*.S)
  36. OBJS := $(addprefix $(OBJDIR), $(patsubst %.S, %.o, $(patsubst %.c, %.o, $(SRCS))))

  37. ALL = $(OBJDIR)u-boot.bin $(OBJDIR)System.map $(OBJDIR)u-boot.dis

  38. all:        $(ALL)
  39. $(OBJDIR)u-boot.bin: $(OBJDIR)u-boot
  40.     $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

  41. $(OBJDIR)u-boot.dis: $(OBJDIR)u-boot
  42.     $(OBJDUMP) -d $< > $@

  43. $(OBJDIR)u-boot:    $(OBJS) $(LDSCRIPT)
  44.     $(LD) $(LDFLAGS) $(OBJS) $(PLATFORM_LIBS) -Map $@.map -o $@

  45. $(OBJDIR)System.map: $(OBJDIR)u-boot
  46.     @$(NM) $< | \
  47.         grep -'\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
  48.         sort > $@

  49. $(OBJDIR)%.o: %.S
  50.     $(CC) $(AFLAGS) --o $@ $<
  51. $(OBJDIR)%.o: %.c
  52.     $(CC) $(CFLAGS) --o $@ $<

  53. clean:
  54.     find $(OBJTREE) -type f \
  55.         \( -name 'core' --name '*.bak' --name '*~' \
  56.         --name '*.o' --name '*.a' --name '*.map' \) -print \
  57.         | xargs rm -f
  58.     rm -f $(ALL) $(OBJDIR)u-boot $(OBJDIR)System.map $(OBJDIR)u-boot.map
2.2 连接脚本也要改: 将start.o 改为 obj/start.o
2.3  Makefile 中的第41-42行
SRCS := $(wildcard *.c *.S)
OBJS := $(addprefix $(OBJDIR), $(patsubst %.S, %.o, $(patsubst %.c, %.o, $(SRCS))))
SRCS中是 sdram.c  start.S 既有.S文件,又有.c文件,OBJS要把.c和.S全部者替换成.o,但是Makefile中的patsubst函数一次只能替换一个,(即一次只能将.S替换成.o,或者将.c替换成.o)。为了在一个语句中替换两次需要把patsubst执行后的结果,交给patsubst再次处理即可。
版权声明:本文为博主原创文章,转载请注明出处。 举报

相关文章推荐

bootloader---4.分析u-boot Makefile最后连接的过程

bootloader---4.分析u-boot Makefile最后连接的过程

Android makefile mk 重要参数解释及 通用模板编写

1. LOCAL_MODULE_TAGS解释: 控制此模块在什么情况下编译,一般为下面写法: LOCAL_MODULE_TAGS:= optional 可选择的几个值: user:指该模块只在user版本下才编译 eng: 指该模块只在eng版本下才编译 tests: 指该模块...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

AVR通用Bootloader

http://www.amobbs.com/thread-930003-1-1.html (目前最新版本是v4.5) 基本介绍 ======== 这个程序的主要目的是为了提供一个具有通...

Linux: makefile常用通用模板

不带静态库的模板: CC = g++ -g COMPILE.C = $(CC) -c VPATH = ./ CXXFLAGS = -lgcc_s MAKEEXE = $(CC) $(LDFLAGS) OBJ = CLLogger.o CLLoggerTester.o ...

基于ARM的通用bootloader的设计

收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)