热点
站长聚首:技术交融,重构创新篇章,reasoning_content:我们要求以程序员口吻写一个与技术、科技相关的标题,关于[站长聚首:技术交融激发创新,共绘创作新篇章]需要简短精炼,30字以内程序员口吻可能使用一些技术术语、代码风格、幽默梗等比如API对接、代码重构、debug、merge等标题要体现站长聚首、技术交融、创新、创作新篇章可以考虑类似:站长们merge技术栈,共创代码新篇章 或者 技术交融,站长们polyfill未来 但需要更精准尝试: 站长聚首:API互调激荡创新,重构创作新篇 但超字数?计算一下:站长聚首:API互调激荡创新,重构创作新篇 共18个字?中文字算一个,标点不算?实际:站长聚首:API互调激荡创新,重构创作新篇 一共15个汉字+4个字母+1个冒号,但字母算英文,要求中文标题?通常标题中可以用英文缩写但为了保险,全中文另一个:技术交融合并请求,站长共写新分支 有点怪更好:站长聚首:技术栈merge,共创创新新篇章 但新篇章重复简化:技术交融,站长聚首merge出新篇章 16字或者:前端后端握手,站长聚首重构创新 不够准确考虑使用Pull Request、Code Review等最终输出一个标题我想到:站长聚首:技术交融,git commit新篇章 13字或者站长聚首:技术交融,PR合并创新篇 11字但PR是Pull Request缩写也可以:技术交融激发创新,站长们push新代码 但不够好最简洁:站长聚首,技术交融,代码重构创新 12字但缺少新篇章感觉增加:站长聚首:技术交融,重构创新篇章 10字符合要求输出
移动互联时代物联网防护新策略技术解析,reasoning_content:我们要求以技术支持工程师的口吻写一个关于[安全专家解读:移动互联时代下的物联网防护新策略]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn注意:标题要体现技术支持工程师的口吻,内容是关于物联网防护新策略,结合移动互联时代可能用词如实战、方案、升级等尝试写几个,选一个最合适的nn例如:移动互联时代物联网防护新策略解析(但不够工程师口吻)工程师常用手把手、详解、实战指南等或者专家解读有点官方,可以改为技术解密nn考虑:物联网防护新策略:移动互联时代的实战指南(23字)或者移动互联时代,物联网防护新策略技术解密(20字)但要求以技术支持工程师口吻,可以说作为技术支持,我来说说物联网防护新策略但太长更简洁:物联网防护新策略:移动互联时代的技术要点(18字)或者移动互联时代物联网防护新策略详解(16字)nn注意原标题中有安全专家解读,我们可以改为技术专家解读或直接以工程师视角最好保留安全专家?题目要求是以技术支持工程师的口吻,所以可以说安全专家解读但口吻是工程师转述?其实可以直接用工程师自己解读nn再想:工程师常用来,聊聊物联网防护新策略但太口语标题需要正式一些nn最终选一个:移动互联时代物联网防护新策略技术解析(18字)或者更精炼:物联网防护新策略:移动互联时代技术升级(18字)或者移动互联物联网防护新策略实战指南(16字)nn我倾向于:移动互联时代物联网防护新策略技术详解(18字)或者直接:物联网防护新策略:移动互联时代安全专家解读(20字)但包含安全专家nn为了符合要求,直接输出一个标题
17 9 月 2026, 周四

重新发现make: 规则背后的力量

我过去认为 makefile 只是一种将一组组的 shell 命令列出来的简便方法;过了一段时间我了解到它们是有多么的强大、灵活以及功能齐全。这篇文章带你领略其中一些有关规则的特性。

备注:这些全是针对 GNU Makefile 的,如果你希望支持 BSD Makefile ,你会发现有些新的功能缺失。感谢 zge 指出这点。

规则

规则rule是指示 make 应该如何并且何时构建一个被称作为目标target的文件的指令。目标可以依赖于其它被称作为前提prerequisite的文件。

你会指示 make 如何按步骤recipe构建目标,那就是一套按照出现顺序一次执行一个的 shell 命令。语法像这样:

  1. target_name : prerequisites
  2. recipe

一但你定义好了规则,你就可以通过从命令行执行以下命令构建目标:

  1. $ make target_name

目标一经构建,除非前提改变,否则 make 会足够聪明地不再去运行该步骤。

关于前提的更多信息

前提表明了两件事情:

  • 当目标应当被构建时:如果其中一个前提比目标更新,make 假定目的应当被构建。
  • 执行的顺序:鉴于前提可以反过来在 makefile 中由另一套规则所构建,它们同样暗示了一个执行规则的顺序。

如果你想要定义一个顺序但是你不想在前提改变的时候重新构建目标,你可以使用一种特别的叫做“唯顺序order only”的前提。这种前提可以被放在普通的前提之后,用管道符(|)进行分隔。

样式

为了便利,make 接受目标和前提的样式。通过包含 % 符号可以定义一种样式。这个符号是一个可以匹配任何长度的文字符号或者空隔的通配符。以下有一些示例:

  • %:匹配任何文件
  • %.md:匹配所有 .md 结尾的文件
  • prefix%.go:匹配所有以 prefix 开头以 .go 结尾的文件

特殊目标

有一系列目标名字,它们对于 make 来说有特殊的意义,被称作特殊目标special target

你可以在这个文档发现全套特殊目标。作为一种经验法则,特殊目标以点开始后面跟着大写字母。

以下是几个有用的特殊目标:

  • .PHONY:向 make 表明此目标的前提可以被当成伪目标。这意味着 make 将总是运行,无论有那个名字的文件是否存在或者上次被修改的时间是什么。
  • .DEFAULT:被用于任何没有指定规则的目标。
  • .IGNORE:如果你指定 .IGNORE 为前提,make 将忽略执行步骤中的错误。

替代

当你需要以你指定的改动方式改变一个变量的值,替代substitution就十分有用了。

替代的格式是 $(var:a=b),它的意思是获取变量 var 的值,用值里面的 b 替代词末尾的每个 a 以代替最终的字符串。例如:

  1. foo := a.o
  2. bar : = $(foo:.o=.c) # sets bar to a.c

注意:特别感谢 Luis Lavena 让我们知道替代的存在。

档案文件

档案文件是用来一起将多个数据文档(类似于压缩文件的概念)收集成一个文件。它们由 ar Unix 工具所构建。ar 可以用于为任何目的创建档案,,但除了静态库,它已经被 tar 大量替代。

make 中,你可以使用一个档案文件中的单独一个成员作为目标或者前提,就像这样:

  1. archive(member) : prerequisite
  2. recipe

最后的想法

关于 make 还有更多可探索的,但是至少这是一个起点,我强烈鼓励你去查看文档,创建一个笨拙的 makefile 然后就可以探索它了。

【编辑推荐】

  1. 查看远程Linux系统中某个端口是否开启的3种方法
  2. Linux Mint 19.2代号为“Tina”,仍基于Ubuntu 18.04 LTS
  3. 千万千万不要运行的Linux命令
  4. VMware 侵权 Linux 源码案原告放弃上诉:没意义
  5. iWant:一个去中心化的点对点共享文件的命令行工具

【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

dawei

【声明】:北京站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了