Course Overview
What this Build Systems & Version Control course covers, how to use it, prerequisites.
About This Course
Course type: Interactive engineering course Audience: Beginners, students, software developers, embedded engineers, DevOps engineers, build/release engineers, and technical leads Learning path: Foundations → practical workflows → advanced build engineering → expert-level reproducibility, scale, security, and release automation Primary tools: Git, Make, CMake, Ninja, GitHub/GitLab-style collaboration, package/dependency managers, CI pipelines Implementation target: EngiLipi learning website (React + TypeScript + Vite)
Course Goals and Learning Outcomes
By completing this course, learners should be able to:
Explain what a build system does and distinguish source code, generated files, artifacts, dependencies, and build rules.
Compile, assemble, link, package, test, and release software using command-line tools.
Write reliable Makefiles and understand targets, prerequisites, recipes, variables, functions, pattern rules, and automatic variables.
Configure portable C/C++ projects with CMake and build them using Ninja or Make.
Understand build tools and ecosystems including compiler toolchains, Maven, Gradle, npm scripts, MSBuild, Bazel, and task runners.
Model dependency graphs, parallel execution, incremental builds, caching, and generated code.
Manage dependencies, lockfiles, toolchains, build configurations, environment variables, and cross-compilation.
Use Git confidently for daily work, collaboration, branching, conflict resolution, history inspection, and safe recovery.
Explain Git's object model, index, references, commits, trees, blobs, packfiles, and reflog.
Apply advanced Git operations such as interactive rebase, cherry-pick, bisect, worktree, submodules, LFS, patch workflows, and history repair.
Choose a team workflow: trunk-based development, feature branches, GitFlow-like release branches, or fork-based collaboration.
Design CI pipelines, artifact promotion, reproducible builds, provenance, signing, and release automation.
Diagnose common failures in builds, dependency resolution, CI, Git merges, and release pipelines.
Apply security and governance practices for dependencies, credentials, signed commits/tags, branch protection, and supply-chain integrity.
How the Examples Were Checked
The commands in this course were run for real while it was built, and each output printed under a snippet is exactly what that run produced. Build and Git sessions ran on Ubuntu 22.04 (WSL2) with GCC 11.2, binutils 2.38, GNU Make 4.4.1, CMake 3.31.6, Ninja 1.12.1, CTest and Git 2.34.1; the Go (1.23.4), .NET (SDK 10.0.401) and npm (11.16) sessions ran on Windows; Python examples ran on CPython 3.13.1. Each caption names the tools and any setup a session needed — for example, a local bare repository standing in for a placeholder remote URL, or a real file name in place of path/to/file.
Running the examples turned up three things now explained in the text: the CTest snippet in 5.6 needs its own include directory in the 5.2 project layout; placing -include $(DEPS) above the first rule changes Make's default goal (4.8); and the .csproj in 6.4 builds a class library, not an application. Maven, Gradle, Cargo, Bazel, Python packaging and ARM cross-compilation snippets are marked not run — those tools were not available. Interactive tools say whether they compute real results in your browser or simulate a system.
Course Roadmap
Software Delivery Foundations Toolchain and Compilation Pipeline Make and Makefiles CMake and Ninja Other Build Ecosystems Advanced Build Engineering Git Branching and Collaboration Advanced Git Workflows Team Workflow and Governance CI/CD and Build Automation
Reproducibility, Security, and Supply Chain Troubleshooting and Performance
Embedded and Cross-Platform Build Workflows Capstone Projects and Assessment
Prerequisites
Basic command-line usage.
Basic programming concepts and familiarity with at least one language.
No prior Git or build-system experience is required.
Examples use shell commands and C/C++ where useful; equivalent ideas apply to many languages.
Important conventions
Commands shown with $ are terminal commands. Do not type the $.
Paths and output may vary by operating system and tool version.
Examples use illustrative project names and versions. Check the version installed in your environment.
Never commit secrets, private keys, access tokens, credentials, generated binaries, or sensitive build logs.
Prefer official documentation for exact options in production environments.