Programming/Tools/Make
Make
Make is a build automation tool that automatically builds executable programs and libraries from source code by reading files called Makefiles which specify how to derive the target program. Though integrated development environments and language-specific compiler features can also be used to manage a build process, Make remains widely used, especially on Unix and Unix-like (e.g. Linux) operating systems.
Besides building programs, Make can be used to manage any project where some files must be updated automatically from others whenever the others change.
Make was originally created by Stuart Feldman in April 1976 at Bell Labs. Feldman received the 2003 ACM Software System Award for the authoring of this tool.
Feldman was inspired to write Make by the experience of a coworker in futilely debugging a program of his where the executable was accidentally not being updated with changes:
Make originated with a visit from Steve Johnson (author of yacc, etc.), storming into my office, cursing the Fates that had caused him to waste a morning debugging a correct program (bug had been fixed, file hadn't been compiled, cc *.o was therefore unaffected). As I had spent a part of the previous evening coping with the same disaster on a project I was working on, the idea of a tool to solve it came up. It began with an elaborate idea of a dependency analyzer, boiled down to something much simpler, and turned into Make that weekend. Use of tools that were still wet was part of the culture. Makefiles were text files, not magically encoded binaries, because that was the Unix ethos: printable, debuggable, understandable stuff.
—Stuart Feldman, The Art of Unix Programming, Eric S. Raymond, 2003.
Preliminaries
If Make is not yet present on your system, it can be installed using
$ sudo apt update ... $ sudo apt install make
Once Make is installed, to find out its version, you can use
$ make --version GNU Make 4.2.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
Basic project
Let's make a directory
$ mkdir my_project
Within that directory, let's create main.c and edit it:
$ cd my_project $ touch main.c $ nano main.c
Let's set the contents of main.c to
#include <stdio.h> int main() { printf("Hello, World!\n"); return 0; }
We could build our program simply using
$ gcc -Wall -c main.c $ gcc -Wall -o hello main.o
The first line will result in the production of main.o, an object file—a file containing object code, that is, machine code output of an assembler or compiler. The object code is usually relocatable (relocation is the process of assigning load addresses for position-dependent code and data of a program and adjusting the code and data to reflect the assigned addresses), and is not usually directly executable (an executable file causes a computer to perform indicated tasks according to encoded instructions, as opposed to a data file that must be interpreted (parsed) by a program to be meaningful).