Building Software¶
Build systems automate the process of compiling source code into executables or libraries.
They manage dependencies, compiler flags, and installation steps, making builds portable and repeatable.
General Flow¶
Source Code → Configuration → Build Files → Compilation Installation
Source Code¶
Contains
.c,.cpp,.h, and related source files.Includes metadata files that describe how to build (e.g.,
CMakeLists.txt,configure.ac,Makefile.am).
Configuration¶
Detects system settings, compilers, and libraries.
Generates platform-specific build files (like Makefiles or Visual Studio projects).
Build¶
Uses generated build files to compile and link the code.
Installation¶
Copies binaries, headers, and other files to system directories.
Example: CMake¶
Configuration → Build → Install
# create build dir
mkdir build; cd build
# Step 1: Configure (generate build system files)
cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/prefix
# (Optional) Use ccmake for more transparency
ccmake ..
# Step 2: Build
make -j
# Step 3: Install
make install
Note
If you’re unsure what variables you can tweak in a cmake project, you can launch a terminal user interface by using ccmake in place of cmake
Files involved:
CMakeLists.txt: Describes targets, dependencies, and options.build/: Directory containing generated Makefiles or project files.
Typical flow:
CMakeLists.txt → CMake generates Makefiles → make builds → make install
Example: GNU Autotools¶
Bootstrap → Configure → Build → Install
# Step 1: Generate configuration scripts (for maintainers)
autoreconf -i
# Step 2: Configure (generate Makefiles)
./configure --prefix=/path/to/prefix
# Step 3: Build
make -j$(nproc)
# Step 4: Install
make install
Files involved:
configure.ac: Defines project metadata and system checks.Makefile.am: High-level Makefile template.Makefile.inandconfigure: Generated intermediate files.
Typical flow:
configure.ac + Makefile.am → autoreconf → configure → Makefiles → make → make install
Comparison Summary¶
Step |
CMake |
Autotools |
|---|---|---|
Input file(s) |
|
|
Configuration tool |
|
|
Output files |
Makefiles or project files |
|
Build command |
|
|
Install command |
|
|
Portability focus |
Cross-platform (Windows/Linux/macOS) |
Primarily Unix-like systems |