Makefile学习

来源:互联网 发布:邮箱注册淘宝 编辑:程序博客网 时间:2024/06/04 22:47

http://blog.chinaunix.net/uid-26404201-id-3334234.html

1. := 和 =的区别

    http://blog.chinaunix.net/uid-26404201-id-3334234.html
   先看下面的Makefile:
   #example
   B := $(A)
   A = later
   all:
     @echo $(B)
  执行make命令,我们发现什么都没输出,我们将第3行的:=换成=。
  #example
  B = $(A)
  A = later
  all:
      @echo $(B)
  执行make,输出later。
  分析:B :=$(A)时,它只会到这句语句之前去找A的值,因A没有定义所以什么都没有输出。

   B = $(A)时,虽然该语句之前A没有定义,但是在其后定义了,所以能输出later。

2. Makfe工具

   xdc make

   http://alphamailpost.blog.163.com/blog/static/20111808120127261018264/

   http://blog.csdn.net/lvwx369/article/details/7695245

3. $(MAKE)使用

  SUBDIRS=foo bar baz
  subdirs:
  for dir in $(SUBDIRS); do\
    $(MAKE) -C $$dir; \
  done

   这个实例执行foo bar baz目录下的makefile

4. 忽略makefile中编译错误

    在执行makefile中常常会出错,出错会导致makefile退出,但有些错误时无关紧要的,可以忽略,怎么处理呢?

    可以在执行命令前加入符号‘-’

    如:-rm 123.txt

    正常情况下,如果不存在123.txt文件,执行时会出错,

    加了‘-’会忽略这个错误,makefile会继续往下执行;


二. 常见Makefile写法

http://blog.csdn.net/ghostyu/article/details/7755177

1、目标名称,摆脱手动设置目标名称

[cpp] view plaincopy
  1. TARGET = $(notdir $(CURDIR))  
  2. all:$(TARGET)  
  3.     CMD....  
$(CURDIR) 表示Makfile当前目录全路径

$(notdir $(path)) 表示把path目录去掉路径名,只留当前目录名
这样就可以得到Makefile当前目录名称,用目录名作为目标程序名是一个不错的选择

2、使用include,把所有Makefile共享的设置包含进来

[cpp] view plaincopy
  1. BASE_DIR = /root/DM36x  
  2. include $(BASE_DIR)/Rules.make  
  3.   
  4. XDC_PATH = $(DMAI_INSTALL_DIR)/packages  
[cpp] view plaincopy
  1. DMAI_INSTALL_DIR在Rules.make中已经设置过,这样,需要使用DMAI_INSTALL_DIR变量的时候只要include 这个Rules.make接可以了  

3、遍历遍历所有特定的源文件

[cpp] view plaincopy
  1. SOURCES = $(wildcard *.c)  
  2. HEADERS = $(wildcard *.h)  
如果当前目录先有 main.c  func.c  func.h 

这样SOURCES变量就等于main.c  func.c

HEADERS变量就等于func.h

这样就每次添加源文件后 就不需要重新修改makefile了

4、替换文件名称

[cpp] view plaincopy
  1. OBJFILES = $(SOURCES:%.c=%.o)  
如果SOURCES等与3中的main.c和func.c

这样OBJFILES就等于main.o func.o 

同样摆脱了手动修改编译的中间文件名

5、交叉编译设置

[cpp] view plaincopy
  1. VERBOSE = @  
  2. COMPILE.c = $(VERBOSE) $(MVTOOL_PREFIX)gcc $(C_FLAGS) $(CPP_FLAGS) -c  
  3. LINK.c = $(VERBOSE) $(MVTOOL_PREFIX)gcc $(LD_FLAGS)  

6、编译

[cpp] view plaincopy
  1. $(OBJFILES):    %.o: %.c $(HEADERS)   
  2.   
  3.     @echo Compiling $@ from $<..  
  4.   
  5.     $(COMPILE.c)  -o $@ $<  

7、

[cpp] view plaincopy
  1. install:    $(if $(wildcard $(TARGET)), install_$(TARGET))  
  2. install_$(TARGET):  
  3.     @install -d $(EXEC_DIR)  
  4.     @install $(TARGET) $(EXEC_DIR)  
  5.     @install $(TARGET).txt $(EXEC_DIR)  
  6.     @echo  
  7.     @echo Installed $(TARGET) binaries to $(EXEC_DIR)..  
先判断当前目录是否有$(TARGET),如果有,就执行伪目标install_$(TARGET),这个展开了就相当于install_app,如果$(TARGET)等于app的话

    

 

0 0
原创粉丝点击