您的位置:首页 > 其它

Makefile学习

2014-12-03 13:44 162 查看
http://blog.chinaunix.net/uid-26404201-id-3334234.html1.:=和=的区别  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工具  xdcmake  http://alphamailpost.blog.163.com/blog/static/20111808120127261018264/  http://blog.csdn.net/lvwx369/article/details/76952453.$(MAKE)使用
SUBDIRS=foobarbaz
subdirs:
  fordirin$(SUBDIRS);do\
    $(MAKE)-C$$dir;\
  done
  这个实例执行foobarbaz目录下的makefile
4.忽略makefile中编译错误  在执行makefile中常常会出错,出错会导致makefile退出,但有些错误时无关紧要的,可以忽略,怎么处理呢?  可以在执行命令前加入符号‘-’  如:-rm123.txt  正常情况下,如果不存在123.txt文件,执行时会出错,  加了‘-’会忽略这个错误,makefile会继续往下执行;二.常见Makefile写法http://blog.csdn.net/ghostyu/article/details/77551771、目标名称,摆脱手动设置目标名称[cpp] viewplaincopyTARGET = $(notdir $(CURDIR))  all:$(TARGET)      CMD....  $(CURDIR)表示Makfile当前目录全路径$(notdir$(path))表示把path目录去掉路径名,只留当前目录名这样就可以得到Makefile当前目录名称,用目录名作为目标程序名是一个不错的选择2、使用include,把所有Makefile共享的设置包含进来[cpp] viewplaincopyBASE_DIR = /root/DM36x  include $(BASE_DIR)/Rules.make    XDC_PATH = $(DMAI_INSTALL_DIR)/packages  [cpp] viewplaincopyDMAI_INSTALL_DIR在Rules.make中已经设置过,这样,需要使用DMAI_INSTALL_DIR变量的时候只要include 这个Rules.make接可以了  3、遍历遍历所有特定的源文件[cpp] viewplaincopySOURCES = $(wildcard *.c)  HEADERS = $(wildcard *.h)  如果当前目录先有main.c func.c func.h 这样SOURCES变量就等于main.c func.cHEADERS变量就等于func.h这样就每次添加源文件后就不需要重新修改makefile了4、替换文件名称[cpp] viewplaincopyOBJFILES = $(SOURCES:%.c=%.o)  如果SOURCES等与3中的main.c和func.c这样OBJFILES就等于main.ofunc.o 同样摆脱了手动修改编译的中间文件名5、交叉编译设置[cpp] viewplaincopyVERBOSE = @  COMPILE.c = $(VERBOSE) $(MVTOOL_PREFIX)gcc $(C_FLAGS) $(CPP_FLAGS) -c  LINK.c = $(VERBOSE) $(MVTOOL_PREFIX)gcc $(LD_FLAGS)  6、编译[cpp] viewplaincopy$(OBJFILES):    %.o: %.c $(HEADERS)         @echo Compiling $@ from $<..        $(COMPILE.c)  -o $@ $<  7、[cpp] viewplaincopyinstall:    $(if $(wildcard $(TARGET)), install_$(TARGET))  install_$(TARGET):      @install -d $(EXEC_DIR)      @install $(TARGET) $(EXEC_DIR)      @install $(TARGET).txt $(EXEC_DIR)      @echo      @echo Installed $(TARGET) binaries to $(EXEC_DIR)..  先判断当前目录是否有$(TARGET),如果有,就执行伪目标install_$(TARGET),这个展开了就相当于install_app,如果$(TARGET)等于app的话   

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: