• Makefile 学习与使用


    Makefile 学习与使用

    • $@ 目标文件
    • $^ 所有依赖文件
    • $< 第一个依赖文件
    • $? 修改后的依赖文件

    VPATH和vpath

    • VPATH = dir1 dir2...
      在当前目录下找不到文件时会到VPATH下逐个寻找
    • vpath [file] [dir1 dir2...]
      1. 依次在dir下寻找file
      2. 将含有file的文件夹置空
      3. 清楚所有已设置的vpath

    example

    .c file in src,

    .h file in include

    nothing in current directory

    vpath %.c src
    vpath %.h include
    main:main.o list1.o list2.o
        gcc -o $@ $<
    main.o:main.c
        gcc -o $@ $^
    list1.o:list1.c list1.h
        gcc -o $@ $<
    list2.o:list2.c list2.h
        gcc -o $@ $<
    

    等同于:

    VPATH=src include
    main:main.o list1.o list2.o
        gcc -o $@ $<
    main.o:main.c
        gcc -o $@ $^
    list1.o:list1.c list1.h
        gcc -o $@ $<
    list2.o:list2.c list2.h
        gcc -o $@ $<
    

    Makefile 隐含规则

    Makefile 条件判断

    • ifeq (a,b)
    • ifneq 'a' 'b'
    • ifdef a
    • ifndef a
    • else endif

    Makefile 伪目标

    .PHONY:clean
    clean:
      rm -rf *.o test
    

    Makefile 函数

    • 字符串处理函数
      $(patsubst %.c,%.o,1.c 2.c 3.c).c file 替换成.o file

    $(subst fuck,like,fuck you)输出like you

    $(strip a b c)输出abc

    $(filter %.c %.o,1.c 2.o 3.s)过滤.c & .o file输出1.c 2.o

    $(filter-out 1.c 2.o ,1.o 2.c 3.s)输出3.s

    $(sort foo bar foo lost)输出bar foo lost而且去重

    $(word num,text1 text2 text3)输出the NO.num text

    • 文件名操作函数
      $(dir file/directory...)获取目录名

    $(notdir file/directory...)获取文件名

    $(suffix file/directory...)获取文件后缀

    $(basename file/directory...)获取文件前缀

    $(addsuffix suffix,file/directory...)给文件或目录添加后缀

    $(addprefix prefix,file/directory...)给文件或目录添加前缀

    $(join a b,1 2 3)连接函数,输出a1 b2 3

    $(wildcard *.c *.h)通配符函数

    • 其他常用函数
      $(foreach var,list,text) 把参数list中的单词逐一取出放到参数var所指定的变量中,然后再执行text所包含的表达式。

    $(if condition,then-part [,else-part])

    $(call expression,parm1,parm2,parm3,...)

    Makefile 命令回显

    @cmd

    Makefile 文件包含

    include filenames出错退出
    -include filenames出错也不退出

  • 相关阅读:
    集合之Map和List线程安全问题
    vue直接赋值后数据不更新
    使用sysmon事件映射ATT&CK
    blackhat议题"通过RPC防火墙拦截横向渗透"
    大数据Hadoop之——新一代流式数据湖平台 Apache Hudi
    【云原生】MySQL on k8s 环境部署
    【云原生】Presto/Trino on k8s 环境部署
    【云原生】Flink on k8s 讲解与实战操作
    【云原生】Spark on k8s 讲解与实战操作
    【云原生】Elasticsearch + Kibana on k8s 讲解与实战操作
  • 原文地址:https://www.cnblogs.com/mxdon/p/14279298.html
Copyright © 2020-2023  润新知