Make 常用参数

-d, --debug=FLAGS

  • 所有支持的 FLAGS (多个 flags 用, 分开)
  • Debug Level Specification (GNU Make 4.3)
标志 名称 功能描述
a All 启用所有调试输出(等效于单独使用 -d)
b Basic 基本调试:显示目标重建决策、过期检查等核心信息
v Verbose 详细模式:比 b 更详细的执行信息
i Implicit 隐式规则:显示隐式规则搜索/应用过程
j Jobs 作业控制:输出子进程执行细节(命令/PID/退出码)
m Makefile Makefile 处理:跟踪 include/重解析过程
r Remaking 重制检查:显示 makefile 自身的重制决策
n None 禁用所有调试(特殊用途)

Make 常用变量

Make 变量赋值操作符

1
2
3
4
5
6
7
immediate = deferred
immediate ?= deferred
immediate := immediate
immediate ::= immediate
immediate :::= immediate-with-escape
immediate += deferred or immediate
immediate != immediate
  • != 用于将 shell 命令执行的结果赋给变量,等价于 variable := $(shell shell_cmd)

MAKECMDGOALS

表示执行 make 命令时用户给入的 targets, 这里执行 make 命令时 不仅包括从终端命令行执行 make, 也包括在 Makefile 规则里执行 make -f ...

Make 常用函数

info, error, warning

  • 原型
    1
    2
    3
    $(info text...)
    $(error text...)
    $(warning text...)
    • 这3个函数被放在 GNU Make 官方文件 8.13 Functions That Control Make 章节,这里把它们放在常用函数最前面,是因为它们对于验证调试 Makefile 非常有用
    • $(info text...) 相当于 printf()
    • $(error text...) 相当于 assert(0)
    • info 和 warning 的区别是前者打印在 stdout, 后者打印在 stderr
    • 原样打印,不支持转义字符如 \n
    • info, warning, error 函数打印调试 makefile 之所以比在规则里使用 echo 方便,是因为它们作为内置函数可以在 makefile 的任何地方单独出现,而不像 echo 只能在规则里出现
    • make 里的函数也会展开 expansion, 相当于 make 函数都有返回值,info, warning 函数展开后都是空字串

dir, notdir

  • 原型
    1
    2
    $(dir names...)
    $(notdir names...)
    • 这两个内置函数被放在 GNU Make 官方文档 8.3 Functions for File Names 章节的头两个,可见它们的使用之多。这一章节的函数都是专门用来拆分文件路径的。
    • $(dir names...) 只取出后面文件路径(或文件路径列表)的目录部分, 相当于 shell 里的 dirname
    • $(notdir names...) 只取出后面文件路径(或文件路径列表)的文件名部分, 相当于 shell 里的 basename

foreach

  • 原型
    1
    $(foreach var, list, text)
    • expansion 时机:var, list 在一开始就展开,而 text 是在后面才展开
    • list 是一个空白分隔的字符串
    • text 的多次展开也被空白连接成一整个长字符串

if

  • 原型
    1
    $(if condition, then-part[, else-part])
    • 如果 condition 展开后是 non-empty string, 那么条件为真
    • then-partelse-part 永远只能有一个被求值 (evaluated)
    • if 函数同样有返回值,条件真时,返回 then-part 的求值结果; 条件假时,返回 else-part 的求值结果, 如果没有 else-part, 返回空字串

or, and

  • 原型
    1
    2
    $(or condition1[,condition2[,condition3...]])
    $(and condition1[,condition2[,condition3...]])
    • 短路或(short-circuiting OR)(不是骂人🐶), 即一个挨一个展开 condition, 只要遇到一个展开为非空字串,就停止,这个函数返回的就是展开的那个字串,如果所有 condition 展开都是空,则返回空字串
    • 短路与(short-circuiting AND), 即一个挨一个展开 condition, 只要遇到一个展开为空字串,就停止,这个函数返回的就是空字串,如果所有 condition 展开都是非空字串,返回最后一个字串
    • condition 可以有 1 到 n 个

origin

  • 原型
    1
    $(origin variable)
    • variable 不需要加 $ 符号
    • 它的功能类似 shell 里的 whichtype (告诉你一个命令是不是 shell 内置命令)
    • 它的返回值有以下这些(都是字串)
      • undefined
      • default
      • environment
      • environment override
      • file
      • command line
      • override
      • automatic

用户自定义函数

像其它语言一样,在 Makefile 里也可以自己定义函数, 例如

1
rust_exports = $(NM) -p --defined-only $(1) | awk '$$2~/(T|R|D|B)/ && $$3!~/__(pfx|cfi|odr_asan)/ { printf $(2),$$3 }'

如何调用它

1
$(call rust_exports,$<,"EXPORT_SYMBOL_RUST_GPL(%s);\n")
  • 调用自定义函数使用 Make 内置函数 $(call variable,param,param,...)
  • 在这个例子里,第1个实参是 $<, 第2个实参是一个字符串,实际上是 awk printf 函数接受的格式字符串(format string)

@ 禁止回显

Make 用户手册

没有 task_struct 的 ISR

众所周知,中断上下文不能睡眠,但是这句话细说起来,还是有很多值得深究的地方。所谓中断上下文,就是中断触发后,执行中断服务例程 (Interrupt Service Routine/Interrupt Handler) 的资源,这些资源有哪些呢?少得可怜,除了执行 ISR 代码的 CPU 核心外,中断上下文甚至都没有自己的栈来保存临时变量,所有的资源都是抢占中断触发时那个进程的,显然不能让这种“抢占”持续太久,所以 Linux 内核就将 ISR 分成了 top 和 bottom 两部分,也就是硬件中断上下文软件中断上下文, 所以严格来说是,在 Linux 内核中,硬件中断上下文不能睡眠

Read more »

flowchart TD
  subgraph GPU
    slot-0[HW Run Queue]
    slot-1[HW Run Queue]
    slot-2[HW Run Queue]
  end

  sched0[drm_gpu_scheduler]
  sched1[drm_gpu_scheduler]
  sched2[drm_gpu_scheduler]

  runq00[drm_sched_rq<br>KERNEL]
  runq01[drm_sched_rq<br>HIGH]
  runq02[drm_sched_rq<br>NORMAL]
  runq03[drm_sched_rq<br>LOW]

  runq10[drm_sched_rq<br>KERNEL]
  runq11[drm_sched_rq<br>HIGH]

  runq20[drm_sched_rq<br>KERNEL]
  runq21[drm_sched_rq<br>HIGH]
  runq22[drm_sched_rq<br>NORMAL]

  entity00@{shape: docs, label: "drm_sched_entity<br>job chain"}
  entity01@{shape: docs, label: "drm_sched_entity<br>job chain"}
  entity02@{shape: docs, label: "drm_sched_entity<br>job chain"}
  entity03@{shape: docs, label: "drm_sched_entity<br>job chain"}

  entity10@{shape: docs, label: "drm_sched_entity<br>job chain"}
  entity11@{shape: docs, label: "drm_sched_entity<br>job chain"}
  entity12@{shape: docs, label: "drm_sched_entity<br>job chain"}


  entity20@{shape: docs, label: "drm_sched_entity<br>job chain"}
  entity21@{shape: docs, label: "drm_sched_entity<br>job chain"}
  entity22@{shape: docs, label: "drm_sched_entity<br>job chain"}

  entity00 --> entity01 --> entity02 --> entity03 --> runq00
  entity10 --> entity11 --> entity12 --> runq10
  entity20 --> entity21 --> entity22 --> runq02

  runq00 --> sched0
  runq01 --> sched0
  runq02 --> sched0
  runq03 --> sched0

  runq10 --> sched1
  runq11 --> sched1

  runq20 --> sched2
  runq21 --> sched2
  runq22 --> sched2

  sched0 --> slot-0
  sched1 --> slot-1
  sched2 --> slot-2
Read more »

小小的人儿

攥不住流淌的昼与夜

当你舞动手中的仙女棒

却仿佛在挥洒银河

捂住双耳

不为那凛凛的冰寒

只等花儿在星星眼前开放

仍怀抱静谧和安然

这年初二

我们仨

凤翔城里看凤翔

往后余生

翔凤桥头不彷徨

1
2
3
4
5
6
7
8
UVD feature version: 0, firmware version: 0x40000d00
MC feature version: 0, firmware version: 0x00a777d0
ME feature version: 29, firmware version: 0x00000091
PFP feature version: 29, firmware version: 0x00000054
CE feature version: 29, firmware version: 0x0000003d
RLC feature version: 1, firmware version: 0x00000001
SMC feature version: 0, program: 16, firmware version: 0x10020000 (2.0.0)
VBIOS version: 113-xxx-xxx
Read more »

Power State

Level State Power Command
(systemctl)
S0 idle full N/A
S1 sleep low N/A
S2 deeper sleep lower N/A
S3 suspend to RAM CPU off RAM on suspend
S4 suspend to DISK Most devices off hibernate
S5 shutdown completely off poweroff
Read more »
0%