Giao diện
Part 10: Build Systems & Package Management Infrastructure
Build System là xương sống của mọi dự án C++ lớn. Đây là cách các codebase hàng triệu dòng code tại Google, Meta, và HFT firms được quản lý.
Tại sao Kỹ sư cần hiểu Build Systems?
┌─────────────────────────────────────────────────────────────────────────┐
│ BUILD SYSTEM = PRODUCTION BACKBONE │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 💥 VẤN ĐỀ #1: DEPENDENCY HELL │
│ ───────────────────────────────── │
│ Library A → B → C (v1.0) │
│ Library D → C (v2.0) │
│ Xung đột! Project không compile được. │
│ │
│ 💥 VẤN ĐỀ #2: "WORKS ON MY MACHINE" │
│ ──────────────────────────────────── │
│ Developer A: gcc 9.4, Ubuntu 20.04 │
│ Developer B: clang 15, macOS Ventura │
│ CI Server: gcc 11, Ubuntu 22.04 │
│ → Không ai có environment giống ai. │
│ │
│ 💥 VẤN ĐỀ #3: SLOW FEEDBACK LOOP │
│ ──────────────────────────────── │
│ Clean rebuild 50,000 files = 45 phút │
│ Sửa 1 dòng code → Đợi 45 phút → Feedback quá chậm. │
│ │
│ 💥 VẤN ĐỀ #4: ZERO REPRODUCIBILITY │
│ ───────────────────────────────── │
│ "Rebuild lại bản release v2.3.1 từ 6 tháng trước?" │
│ → Không thể. Không ai nhớ dependencies version cũ. │
│ │
└─────────────────────────────────────────────────────────────────────────┘⚠️ REALITY CHECK
Nếu bạn chỉ biết chạy g++ main.cpp -o main, bạn sẽ KHÔNG survive được trong bất kỳ codebase production nào. Module này là bắt buộc cho các vị trí Senior.
Build System là gì?
Build System là công cụ tự động hóa quá trình:
Source Code → [PREPROCESS] → [COMPILE] → [LINK] → Executable/Library
↓ ↓ ↓ ↓
.cpp/.h Macro expand .o files Binary
#includeBuild Process as a Directed Acyclic Graph (DAG)
TIP
Build System hiểu DAG này và chỉ recompile những file thay đổi + những file phụ thuộc vào chúng. Đây là lý do tại sao incremental build chỉ mất vài giây thay vì hàng chục phút.
Build Tools Evolution
| Era | Tool | Scale | Vấn đề |
|---|---|---|---|
| 1970s | Make | < 100 files | Manual dependency tracking |
| 1990s | Autotools | < 10K files | Cực kỳ phức tạp, không portable |
| 2000s | CMake | < 100K files | Industry standard hiện tại |
| 2010s | Ninja | Build executor | Không generate, chỉ execute |
| 2020s | Bazel/Buck2 | > 1M files | Google/Meta scale monorepos |
🎯 PENALGO Choice
Module này tập trung vào CMake + Ninja + Conan — stack được sử dụng rộng rãi nhất trong industry, từ startups đến enterprise.
Module Structure
| Bài học | Nội dung chính |
|---|---|
| 💀 Makefile Nightmare | Tại sao Makefile thất bại ở scale lớn |
| 🚀 Modern CMake | CMake fundamentals với Target-based approach |
| ⚙️ CMake Advanced | PUBLIC/PRIVATE/INTERFACE, Sanitizers, Static Analysis |
| 📦 Package Management | Conan & Vcpkg — Stop reinventing the wheel |
| ⚡ Ninja & CCache | HPN Tunnel: Tối ưu tốc độ build |
| 🔄 CI/CD GitHub Actions | Matrix Build cho production-grade projects |
The Golden Rules
🏆 MODERN BUILD PRINCIPLES
- Never build in-source. Always
cmake -B build. - Target-based CMake only. No
include_directories(),add_definitions(). - Package manager mandatory. No
git submodulefor libs. - Sanitizers in CI. ASan, UBSan, TSan phải pass trước khi merge.
- -Werror in CI. Warnings = Errors trong pipeline.