risc-v中文社区

 找回密码
 立即注册
查看: 4155|回复: 0

makefile记录

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-11-1 19:50:38 | 显示全部楼层 |阅读模式
1. patsubst
$(patsubst PATTERN,REPLACEMENT,TEXT)
在 TEXT 中以空格分开的单词中,寻找 PATTERN,然后替换成 REPLACEMENT,然后返回替换后的单词。
2. 自动化变量
  • $@ :表示规则中的目标文件集。
  • <span class="MathJax" id="MathJax-Element-1-Frame" tabindex="0" data-mathml="" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;">%”的值就为“bar.o”,“$@”的值为“foo.a”。如果目标不是静态库文件,其值为空。
  • $< :第一个依赖文件名。
  • $? :所有比目标文件更新的依赖文件列表。以空格分隔。
  • $^ :规则的所有依赖文件列表,使用空格分隔。每个文件只出现一次。
  • +:这个变量很像+:这个变量很像^ ,也是所有依赖文件的集合。只是它不去除重复的文件。
3. @,-,,,$, include
  • @: Makefile 中的语句在执行之前都会先打印在屏幕上,再进行执行,如果在语句前面加上@,就不打印,直接执行。
  • -: 例如 -rm dir加了-以后,如果这个命令失败,也不会终止所在行,而是继续往下走。
  • $: 引用 Makefile 中定义的变量
  • $$: 应用 shell 变量
  • include: 包含其他的Makefile文件
4. shell 语句:set -e-----------------------------------------------------------
#!/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,都会根据源文件之间的实际依赖关系进行重新编译,而不是所有文件全部重新编译。
  1. CC = g++
  2. CC_FLAGS=-llapack -lblas -lgsl -lgslcblas -fopenmp -std=c++11 -g

  3. CPP_SRC_FILES = $(shell find src/ -maxdepth 1 -name "*.cpp")
  4. CPP_OBJ_FILES = $(patsubst %.cpp, %.o, $(CPP_SRC_FILES))
  5. CPP_DPT_FILES = $(patsubst %.cpp, %.d, $(CPP_SRC_FILES))

  6. EXCUTABLE = pvpc.x

  7. $(EXCUTABLE): $(CPP_OBJ_FILES)
  8.         $(CC) $^ -o $@ $(CC_FLAGS)

  9. %.o: %.cpp
  10.         $(CC) -c [        DISCUZ_CODE_1        ]lt; -o $@ $(CC_FLAGS)

  11. %.d: %.cpp
  12.         @set -e; \
  13.         rm -f $@; \
  14.         $(CC) -MM [        DISCUZ_CODE_1        ]lt; > $@.$.dtmp; \
  15.         sed 's,\(.*\)\.o\:,$*\.o $*\.d\:,g' < $@.$.dtmp > $@; \
  16.         rm -f $@.$.dtmp

  17. -include $(CPP_DPT_FILES)

  18. clean:
  19.         rm -f $(DST)
  20.         rm -f $(CPP_OBJ_FILES)
  21.         rm -f $(CPP_DPT_FILES)
  22.         rm -f $(shell find src/ -name "*.dtmp")
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-19 16:03 , Processed in 0.013924 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表