Skip to content

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
                #include

Build 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

EraToolScaleVấn đề
1970sMake< 100 filesManual dependency tracking
1990sAutotools< 10K filesCực kỳ phức tạp, không portable
2000sCMake< 100K filesIndustry standard hiện tại
2010sNinjaBuild executorKhông generate, chỉ execute
2020sBazel/Buck2> 1M filesGoogle/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ọcNội dung chính
💀 Makefile NightmareTại sao Makefile thất bại ở scale lớn
🚀 Modern CMakeCMake fundamentals với Target-based approach
⚙️ CMake AdvancedPUBLIC/PRIVATE/INTERFACE, Sanitizers, Static Analysis
📦 Package ManagementConan & Vcpkg — Stop reinventing the wheel
⚡ Ninja & CCacheHPN Tunnel: Tối ưu tốc độ build
🔄 CI/CD GitHub ActionsMatrix Build cho production-grade projects

The Golden Rules

🏆 MODERN BUILD PRINCIPLES

  1. Never build in-source. Always cmake -B build.
  2. Target-based CMake only. No include_directories(), add_definitions().
  3. Package manager mandatory. No git submodule for libs.
  4. Sanitizers in CI. ASan, UBSan, TSan phải pass trước khi merge.
  5. -Werror in CI. Warnings = Errors trong pipeline.

Learning Path

  1. 💀 Makefile Nightmare — Hiểu vấn đề trước
  2. 🚀 Modern CMake — Nền tảng CMake
  3. ⚙️ CMake Advanced — Kỹ thuật nâng cao
  4. 📦 Package Management — Dependency management
  5. Ninja & CCache — Tối ưu hiệu năng
  6. 🔄 CI/CD — Production pipeline