Makefile 可以做到如下简洁, 实际用时只要修改 EXE 和 OBJ 的列表值, 无需关心其它的东西
```
EXE=\
exe1\
a/exe2\
a/exe3\

OBJ=\
mod1\
liba/mod2\
liba/mod3\

include inc.mak
```
工程源码 https://github.com/webd90kb/webd/tree/master/codes/c_project_template
举报· 271 次点击
登录 注册 站外分享
9 条回复  
augustheart 小成 2024-7-8 12:28:18
看了一下,分享精神可嘉,不过聊胜于无吧,用处很狭窄。
实际上照本宣科写个 makefile ,目录分好。然后一个通配符也差不多效果了,最后每次就拷贝这 makefile ,修改一下输出目标名。
w568w 小成 2024-7-8 12:29:08
要我说 Makefile 这种东西早就应该扔进历史垃圾桶了。

多亏了 Autotools 家族:

1. 直到今天 C/C++ 项目的构建和编译还是充满了不在文档中的命令行参数、不知名的环境变量、随心所欲的模块管理和依赖地狱;
2. 甚至每个项目都不得不自己编写一个 INSTALL 或 BUILD 文档来专门教别人如何编译;
3. Autotools 既不通用也不思进取,直到今天依然和 GCC 、glibc 强绑定,AM 宏语法残缺不全、极难理解,并且只支持「 GNU 认为你只需要」的寥寥几门语言和功能,充满了 quirks ,和其他语言的互操作更是无解问题。说是公共构建工具,更像是一群 geeks 自己开发自娱自乐的产物;
4. Makefile 完全没有考虑不同 Shell 和 Platform 的问题,想要跨平台编译,开发者不得不自己考虑并编写几百行的 boilerplates 来适配新的构建平台(例如 Windows )。

CMake is better, and Meson is even better.

如果你需要一个命令行运行器,你应该用 just 或 ninja 。
ipwx 小成 2024-7-8 13:19:53
@zhng920823 我曾经也排斥用别人包了一层又一层的东西,觉得什么东西都自己写底层很舒服。

直到我毕业了,从兴趣驱动到工资驱动……
GeruzoniAnsasu 小成 2024-7-8 13:55:45
我就提一个小问题:

怎么写单元测试?
cnbatch 初学 2024-7-8 18:08:26
虽然我也不那么喜欢 cmake ,但更不喜欢 GNU Makefile ,因为我需要兼顾 BSD 系统( BSD Makefile 稍有不同),所以最后还是要用 cmake 兜底
proxytoworld 初学 2024-7-8 18:27:31
我用 xmake 尝试引入 cmake ,但编译错误,搞了半天,太难了,最后还是用了 cmake 的 hunter
424778940 小成 2024-7-8 18:58:31
makefile 早就该被淘汰了, 又是写他都不如写个 shell 脚本方便, 或者说这东西就是个特别一点的 shell 脚本
makefile, 尤其是 autotools 沾边的, 语法奇怪, 文档残废, 每次改点啥都要进去看代码, 因为变量名和选项都没有标准

我现在一律使用 cmake, 虽说也没有特别先进, 有些地方还是有"无法指定这个操作到底 config 还是 build 时候执行"的问题, 但配合任何 shell 脚本基本都能解决 90%以上的场景需求了

楼主你这个 makefile, 用 cmake 应该不到一半的行数就能写完
yolee599 初学 2024-7-9 09:09:17
我用的 cmake ,就因为 cmake 大家都用,生态比较好,比如 esp-idf ,lvgl ,mbedtls ,lwip …… 都在用
hitmanx 小成 2024-7-9 16:11:46
我工作中遇到的项目 cmake 通常都是比较复杂的,各种 custom command 、custom target 乱飞,调用各种工具、python 等等生成中间文件,再由中间文件生成其它的中间文件等等,再加上 cmake 的字符串操作、对文件系统的操作,以及各种平台*feature list 的排列组合等等……需要理解大量业务逻辑才能明白这个工作流程。

相比之下,新增文件时要更新一个文件列表,或者指定一个库的依赖等等,反而是其中最简单的环节,并不需要费太多的脑细胞。

在这种复杂的系统里,用的 build 的语言是否足够“expressive”,让读的人能轻易明白你想干什么变得更关键了。另外就是效率,现在每改一行 cmake ,重新 config 一次要好几分钟……
返回顶部