• makefile笔记


    make
    -k:即使make程序出错也继续向下运行
    -n:将原来执行的命令输出,而不执行
    -f:指定makefile的文件名称
    -p:打印出系统缺省定义的内部规则


    下面放我项目中的一个比较详细的Makefile文件:

    #**************************************************************************
    #                                                                         *
    #   PROJECT     : MIPS port for UCOS-II                                   *
    #                                                                         *
    #   MODULE      : MakeFile                                                *
    #                                                                         *
    #   AUTHOR      :                                		          *
    #                                                                         *
    #   PROCESSOR   : MIPS 4KEc (32 bit RISC) 		                  *
    #                                                                         *
    #   Tool-chain  :  Cygnus                                                 *
    #                                                                         *
    #   DESCRIPTION :                                                         *
    #   Makefile used for building application.                               *
    #                                                                         *
    #   The default target (all) builds application in two formats :          *
    #   *.elf : Image in ELF format.                                          *
    #   *.rec : Image in S-record format.                                     *
    #                                                                         *
    #   The linker also generates a MAP file "*.map".                         *
    #                                                                         *
    #   Other targets are :                                                   *
    #   clean :    Deletes all files generated by makefile.                   *
    #   depend :   Builds dependency file.                                    *
    #                                                                         *
    #*************************************************************************/
    
    CC        = mips-elf-gcc
    LD        = mips-elf-ld
    OBJCOPY   = mips-elf-objcopy
    OBJDUMP   = mips-elf-objdump
    
    # **********************************************
    # Endianness
    # **********************************************
    
    ENDIAN  = EL
    
    ifeq ($(ENDIAN),EL)
    OFORMAT = -EL
    else
    OFORMAT = -EB
    endif
    
    # **********************************************
    # Name of application
    # **********************************************
    
    IMAGENAME = syscfg
    LSTNAME = syscfg
    
    # **********************************************
    # Type of Processor & Board
    # **********************************************
    
    Processor = mips
    
    # **********************************************
    # Directories
    # **********************************************
    ROOT      = ./../../..
    CASEROOT  = $(ROOT)/case
    SDKROOT   = $(ROOT)/sdk
    LIBROOT   = $(SDKROOT)/lib
    ARCHROOT  = $(SDKROOT)/kernel/$(Processor)
    SRCDIR    = $(SDKROOT)/kernel $(ARCHROOT) $(SDKROOT)/kernel/zlib
    			
    INCDIR    = $(SDKROOT)/include
    ifeq ($(WIFI),1)
    BINDIR    = $(SDKROOT)/bin/wifi
    LSTNAME = syscfg_wifi
    else
    BINDIR    = $(SDKROOT)/bin
    endif
    LINKDIR   = .
    
    VPATH     = $(SRCDIR)
    
    # **********************************************
    # Image file names and map file
    # **********************************************
    
    IMAGE_ELF = $(IMAGENAME).elf
    IMAGE_LST = $(LSTNAME).lst
    IMAGE_REC = $(IMAGENAME).rec
    IMAGE_BIN = $(IMAGENAME).sys
    MAP       = $(LSTNAME).map
    
    # **********************************************
    # Compiler and linker options
    # **********************************************
    ifeq ($(AMGUI),1)
    GUI_CFG = -DUSE_AMGUI
    else
    GUI_CFG = 
    endif
    
    ifeq ($(WIFI),1)
    WIFI_CFG = -DUSE_WIFI
    else
    WIFI_CFG = 
    endif
    
    INCLUDE   = -I$(SDKROOT)/kernel -I$(SDKROOT)/include -I$(SDKROOT)/inc -I$(SDKROOT)/kernel/zlib
    
    #CC_OPTS   = -g -c -G0 -fPIC -O0 $(OFORMAT) $(INCLUDE)  -mips32
    CC_OPTS   = -g -c -G0 -Os $(OFORMAT) $(INCLUDE) -mips32 -fno-builtin -mno-abicalls -fno-PIC -DHAVE_R4K_FLUSH_CACHE_ALL=1 $(GUI_CFG) $(WIFI_CFG)
    
    CC_OPTS_A = $(CC_OPTS) -D_ASSEMBLER_
    
    LD_SCRIPT = $(LINKDIR)/link.xn
    
    LD_OPTS   = -g -G0 -T $(LD_SCRIPT) -o $(IMAGE_ELF) -L$(LIBROOT)/libc --whole-archive -lmyc --no-whole-archive -Map $(MAP) $(OFORMAT)
    
    # **********************************************
    # Files to be compiled
    # **********************************************
    
    SRC_C  = $(foreach dir, $(SRCDIR), $(wildcard $(dir)/*.c))
    SRC_S  = $(foreach dir, $(SRCDIR), $(wildcard $(dir)/*.S))
    SRC    = $(SRC_C) $(SRC_S)
    
    OBJ_C  = $(notdir $(patsubst %.c, %.o, $(SRC_C)))
    OBJ_S  = $(notdir $(patsubst %.S, %.o, $(SRC_S)))
    OBJ    = $(OBJ_C) $(OBJ_S)
    
    # **********************************************
    # Rules
    # **********************************************
    
    .PHONY : all
    all : $(IMAGE_BIN)
    
    $(IMAGE_BIN) : $(IMAGE_ELF)
    	$(OBJCOPY) -O binary $(IMAGE_ELF) $(BINDIR)/$(IMAGE_BIN)	
    	$(OBJDUMP) -D $(IMAGE_ELF) > $(IMAGE_LST)	
    #	cp *_api.a $(LIBROOT)
    	rm $(LINKDIR)/*.o 
    	@echo 恭喜你编译成功
    		
    $(IMAGE_ELF) : $(OBJ)
    	$(LD) $(OBJ) $(LIBROOT)/flash_api.a $(LIBROOT)/carddet_api.a $(LIBROOT)/drm_api.a  $(LIBROOT)/charge_api.a $(LD_OPTS) 
    
    $(OBJ_C) : %.o : %.c 
    	$(CC) $(CC_OPTS) -o $@ $<
    
    $(OBJ_S) : %.o : %.S
    	$(CC) $(CC_OPTS_A) -o $@ $<
    
    .PHONY : clean depend
    
    clean :
    	rm -f $(LINKDIR)/$(IMAGENAME).* $(BINDIR)/$(IMAGENAME).* $(BINDIR)/depend.mk
    	rm $(LINKDIR)/*.o
    depend :
    	$(CC) $(INCLUDE) -M $(SRC) > $(BINDIR)/depend.mk
    
    
    -include depend.mk
    

    依赖关系
    目标名,加冒号,后面跟空格或Tab,例如
    main: main.o f1.o f2.o
    main.o: main.c def1.h
    f1.o: f1.c def1.h def2.h
    f2.o: f2.c def2.h def3.h


    默认时,make程序只更新makefile中的第一个目标
    使用一个特殊的目标all,更新多个目标文件
    all: main hello ...




    规则
    目标: [依赖模块][;命令]
    或者
    目标: [依赖模块]
    命令
    命令
    ......
    如果命令写在一行的话,"命令"之前用分号";"隔开
    如果分成多行书写的话,后继的行务必以Tab字符为先导
    (对应makefile而言,空格字符和Tab字符是不同的)
    !!!makefile文件中的行尾加上空格键的话,也会导致make命令失败




    Sample——myMakefile
    +--------------------------------------+
    |main: main.o f1.o f2.o
    | gcc -o main main.o f1.o f2.o
    |main.o: main.c def1.h
    | gcc -c main.c
    |f1.o: f1.c def1.h def2.h
    | gcc -c f1.c
    |f2.o: f2.c def2.h def3.h
    | gcc -c f2.c
    +--------------------------------------+
    $make -f myMakefile




    宏——makefile
    宏标识符=值列表
    1.宏标识符通常全部大写
    2.通过$(宏标识符)或者${宏标识符}来访问这个标识符所代表的值
    3.也可以通过make命令来传递宏的值,例如:$make CC=gcc --host=i386
    4.分为用户自定义宏,和系统内部定义的宏


    常用系统宏变量
    $@ 目标文件名
    $< 规则中的第一个文件名
    $^ 规则中所有相关文件的名称
    $? 规则中日期比目标新的文件列表,用空格分开
    $@(D) 目标文件的目录部分
    $@(F) 目标文件的文件名部分
    $* 去掉后缀的目标文件名,例如,pro.o则$*表示pro


    all: 表示编译所有的内容
    clean: 表示清楚目标
    distclean: 表示清楚所有的内容
    install: 表示进行安装的内容

  • 相关阅读:
    Java Mybatis 传参方式
    html Js跨域提交数据方法,跨域提交数据后台获取不到数据
    uuidgen
    shell 案例
    docker搭建tomcat环境
    redis主从+哨兵模式(借鉴)
    ansible-playbook 案例
    NFS
    mysql -sql语句
    定时任务crontab命令
  • 原文地址:https://www.cnblogs.com/p2liu/p/6048767.html
Copyright © 2020-2023  润新知