How to use the command "mk" (with examples)
The “mk” command is a task runner that is primarily used to control the compilation of an executable from source code. It allows users to define a series of targets in a “Mkfile” and execute those targets using the “mk” command. This article will illustrate several use cases of the “mk” command with examples.
Use case 1: Call the first target specified in the Mkfile
Code:
mk
Motivation: Calling the first target specified in the Mkfile is the default behavior of the “mk” command. It is useful when you want to build the project or execute the default set of tasks defined in the Mkfile.
Example output:
Executing target "all"
Building target "all"
...
Use case 2: Call a specific target
Code:
mk target
Motivation: Sometimes, you may want to execute a specific target defined in the Mkfile rather than the default target. This use case allows you to call a specific target and perform the corresponding actions defined in the Mkfile.
Example output:
Executing target "target"
Building target "target"
...
Use case 3: Call a specific target, executing 4 jobs at a time in parallel
Code:
NPROC=4 mk target
Motivation: When building software projects, parallelizing build tasks can significantly reduce build times. The “NPROC” environment variable allows you to specify the number of jobs that can be executed in parallel. This use case illustrates how to execute a specific target while limiting the parallel execution to 4 jobs.
Example output:
Executing target "target"
Building target "target" with 4 jobs in parallel
...
Use case 4: Force mking of a target, even if source files are unchanged
Code:
mk -wtarget target
Motivation: By default, the “mk” command checks if the source files associated with a target have changed. If the source files are unchanged, the target is considered up to date, and the corresponding actions are not performed. This use case allows you to force the execution of a target, irrespective of whether the source files have changed or not.
Example output:
Executing target "target"
Building target "target" regardless of source file changes
...
Use case 5: Assume all targets to be out of date. Thus, update target and all of its dependencies
Code:
mk -a target
Motivation: Assuming all targets are out of date can be useful when you want to ensure that a specific target and all its dependencies are rebuilt, regardless of whether their source files have changed or not. This use case allows you to update the specified target and its dependencies.
Example output:
Assuming all targets are out of date
Updating target "target" and its dependencies
...
Use case 6: Keep going as far as possible on error
Code:
mk -k
Motivation: When building a project, encountering an error during the build process can halt the execution. However, sometimes it may be desirable to continue executing as far as possible, even if an error occurs. This use case allows you to continue execution of the Mkfile targets despite encountering errors.
Example output:
Continuing execution of targets despite errors
...
Conclusion
The “mk” command is a powerful task runner for controlling the compilation of executables from source code. It allows users to define targets in a Mkfile and execute them using the “mk” command. The various use cases illustrated in this article showcase the flexibility and versatility of the “mk” command in managing software builds and tasks. Whether you want to build the project, call a specific target, parallelize execution, force mking, update dependencies, or continue execution despite errors, the “mk” command provides the necessary tools to accomplish these tasks efficiently.