CMake vs Make All In One
CMake vs Make All In One
The difference between
CMakeandMakeis that Make createsexecutablesfrom the source files, which have to include aMakefile. In contrast, when using CMake, aCMakeLists. txtfile is provided, which is used to create aMakefile.

CMake 是一个跨平台的代码构建系统生成器
Make 是一个代码构建系统
➜ ~ $ clang++ --version
Apple clang version 17.0.0 (clang-1700.0.13.3)
Target: x86_64-apple-darwin24.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
➜ ~ $ cmake --version
cmake version 4.2.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
➜ ~ $ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
➜ ~ $

CMake
配置文件
CMakeLists.txt

CMake is a generator of buildsystems. It can produce Makefiles, Ninja build files, ...
multi-platform / cross platforms
多平台 / 跨平台
https://cmake.org/cmake/help/latest/guide/tutorial/index.html
Make
配置文件
Makefile
Make is a buildsystem - it drives the compiler and other build tools to build your code.
build system / 构建系统

demos
hello_world.cpp
#include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
}
- 手动编译构建
$ clang++ hello_world.cpp -o hello_world
$ hello_world
Hello, World!
- Makefile 自动化编译构建
# file: Makefile
default:
clang++ hello_world.cpp -o hello_world.o
# 执行 Makefile 配置文件
$ make
$ ./hello_world
Hello, World!
- CMakeLists.txt 生成构建系统配置文件
# file: CMakeLists.txt
cmake_minimum_required(VERSION 3.22.0)
project(hello_world)
add_executable(${PROJECT_NAME} hello_world.cpp)
# -S 输入源 Source Codes,-B 输出目标 Binary Files 到 ./build 目录下
$ cmake -S . -B ./build
$ ls -l ./build
-rw-rw-r - 1 CMakeCache.txt
drwxrwxr-x 5 CMakeFiles
-rw-rw-r - 1 cmake_install.cmake
-rw-rw-r - 1 Makefile
$ cd ./build
# 执行 Makefile 配置文件
$ make
$ ./hello_world
Hello, World!
(🐞 反爬虫测试!打击盗版⚠️)如果你看到这个信息, 说明这是一篇剽窃的文章,请访问 https://www.cnblogs.com/xgqfrms/ 查看原创文章!
Makefile
本期 podcast 是一个关于 Makefile 的全面指南,旨在帮助开发者理解如何通过 make 工具自动化软件构建过程、提高开发效率并确保构建的可重复性。
核心内容的摘要:
-
Makefile 的核心概念与组成
Makefile 是一个定义构建规则的文本文件,其基本结构包含三个部分:
目标 (Target):通常是要生成的文件名(如可执行文件或目标文件),也可以是要执行的任务名称(如 clean)。
先决条件 (Prerequisites):生成目标所依赖的文件或其它目标。
配方 (Recipes):生成目标需要执行的 Shell 命令,必须以 Tab 键开头。
make 的强大之处在于它会检查文件的时间戳:只有当先决条件比目标文件更新时,才会执行相应的配方,从而避免不必要的重复编译,节省时间和资源。 -
关键高级特性
变量与标志 (Variables & Flags):支持定义变量以减少重复。常见的变量赋值方式包括递归扩展(=)和简单扩展(:=)。此外,文档强调了使用标准标志(如 CFLAGS、CXXFLAGS)的重要性,以便于在命令行中覆盖配置而无需修改 Makefile。
自动变量 (Automatic Variables):如 $@(目标文件名)和 $<(第一个先决条件),用于简化规则编写。
伪目标 (.PHONY):用于声明不对应实际文件的目标(如 all、clean),防止因目录下存在同名文件而导致规则失效。
通配符与模式规则:使用 % 字符定义通用规则(如将所有 .cpp 编译为 .o),提高 Makefile 的灵活性。 -
多语言与工具生态集成
文档详细介绍了 Makefile 在不同技术栈中的应用:
编程语言:涵盖了 C++ (G++) 的编译流程、Python 的任务自动化(如管理虚拟环境 venv) 以及 Go (Golang) 的多平台构建和测试自动化。
Docker:展示了如何利用 Makefile 简化 Docker 镜像的构建、版本控制(利用 Git SHA)和推送流程。
IDE 集成:介绍了 Visual Studio Code 的 Makefile Tools 扩展,使开发者能在编辑器中直接进行构建和调试。
Autotools:讲解了如何使用 autoconf 和 automake 制作可移植的软件发行包。 -
跨平台支持与最佳实践
Windows 支持:讨论了在 Windows 上运行 Makefile 的多种途径,包括 Chocolatey、Cygwin、NMAKE、CMake 以及 WSL。
团队协作与维护:建议在大型团队中保持 Makefile 的简洁性,优先使用 .PHONY 目标,避免过度使用复杂的变量逻辑,以便于跨团队协作。
可重复构建:提倡将 Makefile、Dockerfile 和 Bash 脚本结合作为“胶水层 (Glue Layer)”,以实现在 CI 环境和本地开发机上完全一致的构建体验。
Code Compilation Process

refs
https://earthly.dev/blog/cmake-vs-make-diff/
https://p3ld3v.medium.com/c-hello-world-with-make-and-cmake-97740bd9dd7e
©xgqfrms 2012-2021
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/19644409
未经授权禁止转载,违者必究!

浙公网安备 33010602011771号