• 通用makefile及解析(转)


    转载来源:http://www.cppblog.com/prayer/archive/2009/06/01/86402.html

    ######################################
    # Copyright (c) 1997 George Foot (george.foot@merton.ox.ac.uk)
    # All rights reserved.
    ######################################
    #目标(可执行文档)名称,库(譬如stdcx,iostr,mysql等),头文件路径
    DESTINATION := test
    LIBS := 
    INCLUDES := .


    RM := rm -f
    #C,CC或CPP文件的后缀
    PS=cpp
    # GNU Make的隐含变量定义
    CC=g++
    CPPFLAGS = -g -Wall -O3 -march=i486
    CPPFLAGS += $(addprefix -I,$(INCLUDES))
    CPPFLAGS += -MMD

    #以下部分无需修改
    SOURCE := $(wildcard *.$(PS))
    OBJS := $(patsubst %.$(PS),%.o,$(SOURCE))
    DEPS := $(patsubst %.o,%.d,$(OBJS))
    MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
    MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.$(PS),$(MISSING_DEPS)))

    .PHONY : all deps objs clean rebuild

    all : $(DESTINATION)

    deps : $(DEPS)
             $(CC) -MM -MMD $(SOURCE)


    objs : $(OBJS)

    clean :
             @$(RM) *.o
             @$(RM) *.d
             @$(RM) $(DESTINATION)

    rebuild: clean all 

    ifneq ($(MISSING_DEPS),)
    $(MISSING_DEPS) :
             @$(RM) $(patsubst %.d,%.o,$@)
    endif

    -include $(DEPS)

    $(DESTINATION) : $(OBJS)
             $(CC) -o $(DESTINATION) $(OBJS) $(addprefix -l,$(LIBS))
    #结束

      • 原作者是Gorge Foot,写这个Makefile的时候还是一个学生
      • ":="赋值,和"="不同的是,":="在赋值的同时,会将赋值语句中所有的变量就地展开,也就是说,A:=$(B)后,B的值的改变不再影响A
      • 隐含规则。GUN Make在不特别指定的情况下会使用诸如以下编译命令:$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@,这也是为什么这个Makefile最后一个命令没有添加$(CPPFLAGS)的原因,因为缺省是包含这个变量的
      • 函数和变量很相似:"$ (函数名,空格,一列由逗号分隔的参数)"
      • SOURCES = $(wildcard *.cpp) 列出工作目录下文件名满足"*.cpp"条件的文件,以空格分隔,并将列表赋给SOURCE变量
      • patsubst函数:3个参数。功能是将第三个参数中的每一项(由空格分隔)符合第一个参数描述的部分替换成第二个参数制定的值
      • addprefix函数:2个参数。将源串(第2个参数,由空格分隔)中的每一项添加前缀(第1个参数)
      • filter-out函数:2个参数。从第二串中过滤掉包含在第一个串中的项
      • $(CC) -MM -MMD $(SOURCE) : 对每个源文件生成依赖(dependence,Make通过依赖规则来判断是否需要重新编译某个文件),"D"生成".d"文件,-MM表示去掉 depends里面的系统的头文件(使用<>包含的头文件)(若使用-M则全部包含,事实上,系统头文件被修改的可能性极小,不需要执行依赖检查)
      • .PHONY,不检查后面制定各项是否存在同名文件
      • ifneg...else...endif,Makefile中的条件语句
      • -include $(DEPS) : 将DEPS中的文件包含进来,"-"表示忽略文件不存在的错误
      • @$(RM) *.o : 开头的"@"表示在Make的时候,不显示这条命令(GNU Make缺省是显示的)
      • all : 作为第一个出现的目标项目,Make会将它作为主要和缺省项目("make"就表示"make all")
      • deps : 只生成依赖文件(.d文件)
      • objs : 为每一个源码程序生成或更新 '.d' 文件和'.o'文件
      • clean : 删除所有'.d','.o'和可执行文件
      • rebuild : clean然后重建
      • 内部变量$@, $< $^ : 分别表示目标名(:前面的部分,比如all),依靠列表(:后面的部分)中的第一个依靠文件,所有依靠文件
  • 相关阅读:
    2Windows程序设计 Unicode
    C语言指针与字符串(高阶篇三十二)
    C语言指针与函数(高阶篇三十三)
    1Windows程序设计 学习第一个窗口
    C语言链表实践(高阶篇三十七)
    3Windows程序设计 窗口与消息
    C语言双重指针与数组(高阶篇三十五)
    AspNetCore缓存技术
    k8s安装教程
    C# Winform 委托实现B页面给A页面赋值
  • 原文地址:https://www.cnblogs.com/haiyupeter/p/2674419.html
Copyright © 2020-2023  润新知