• Makefile tips


    1. patsubst

    $(patsubst PATTERN,REPLACEMENT,TEXT)
    在 TEXT 中以空格分开的单词中,寻找 PATTERN,然后替换成 REPLACEMENT,然后返回替换后的单词。

    2. 自动化变量

    • $@ :表示规则中的目标文件集。
    • (% :当规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则的目标是“foo.a(bar.o)”,那么,“)%”的值就为“bar.o”,“$@”的值为“foo.a”。如果目标不是静态库文件,其值为空。
    • $< :第一个依赖文件名。
    • $? :所有比目标文件更新的依赖文件列表。以空格分隔。
    • $^ :规则的所有依赖文件列表,使用空格分隔。每个文件只出现一次。
    • $+ :这个变量很像 $^ ,也是所有依赖文件的集合。只是它不去除重复的文件。

    3. @,-,$,$$, include

    • @: Makefile 中的语句在执行之前都会先打印在屏幕上,再进行执行,如果在语句前面加上@,就不打印,直接执行。
    • -: 例如 -rm dir加了-以后,如果这个命令失败,也不会终止所在行,而是继续往下走。
    • $: 引用 Makefile 中定义的变量
    • $$: 应用 shell 变量
    • include: 包含其他的Makefile文件

    4. shell 语句:set -e

    下面的说明转自 https://blog.csdn.net/chen_chun_guang/article/details/44170985

    -----------------------------------------------------------
    #!/bin/bash
    
    set -e
    
    command 1
    command 2
    ...
    
    exit 0
    ----------------------------------------------------------
    
    Every script you write should include set -e at the top. This tells bash that it should exit the script if any statement returns a non-true return value. The benefit of using -e is that it prevents errors snowballing into serious issues when they could have been caught earlier. Again, for readability you may want to use set -o errexit.
    

    注意,在Makefile中使用 set -e 的话,其作用范围只有一行,所以要把它管辖范围内的后续命令都写在同一行,用分号隔开。当然,也可以用续航符

    5. 一个细致处理依赖关系的Makefile

    这是雷哥介绍的,我除了sed那句没看懂,其他部分看懂了,其作用原理就是用编译器-MM这个选项,生成每个cpp文件的依赖关系,然后用那句 sed 语句,将依赖关系转换为一批 Makefile 文件,然后 include 进来。这样,每次 make,都会根据源文件之间的实际依赖关系进行重新编译,而不是所有文件全部重新编译。

    CC = g++
    CC_FLAGS=-llapack -lblas -lgsl -lgslcblas -fopenmp -std=c++11 -g
    
    CPP_SRC_FILES = $(shell find src/ -maxdepth 1 -name "*.cpp")
    CPP_OBJ_FILES = $(patsubst %.cpp, %.o, $(CPP_SRC_FILES))
    CPP_DPT_FILES = $(patsubst %.cpp, %.d, $(CPP_SRC_FILES))
    
    EXCUTABLE = pvpc.x
    
    $(EXCUTABLE): $(CPP_OBJ_FILES)
            $(CC) $^ -o $@ $(CC_FLAGS)
    
    %.o: %.cpp
            $(CC) -c $< -o $@ $(CC_FLAGS) 
    
    %.d: %.cpp
            @set -e; 
            rm -f $@; 
            $(CC) -MM $< > $@.$$$$.dtmp; 
            sed 's,(.*).o:,$*.o $*.d:,g' < $@.$$$$.dtmp > $@; 
            rm -f $@.$$$$.dtmp
    
    -include $(CPP_DPT_FILES)
    
    clean:
            rm -f $(DST)
            rm -f $(CPP_OBJ_FILES)
            rm -f $(CPP_DPT_FILES)
            rm -f $(shell find src/ -name "*.dtmp")
    
  • 相关阅读:
    网络编程
    mysql
    python 基础
    vim 操作
    linux 基本命令
    基本库使用(urllib,requests)
    震撼功能:逐浪CMS全面支持PWA移动生成意指未来
    硬件能力与智能AI-Zoomla!逐浪CMS2 x3.9.2正式发布
    从送外卖到建站售主机还有共享自行车说起-2017年8月江西IDC排行榜与发展报告
    HTTP协议知多少-关于http1.x、http2、SPDY的相关知识
  • 原文地址:https://www.cnblogs.com/luyi07/p/15005502.html
Copyright © 2020-2023  润新知