Makefile Introduction

Introduction

The make command is a command-line utility that automates the process of compiling and linking code. It is a very powerful tool that can be used to build complex applications.

The make command takes a number of parameters, which can be used to control the build process. Here are some of the most common parameters:

  • target: The target is the name of the file or target that you want to build.
  • variables: The variables are the names and values of the variables that you want to set.
  • flags: The flags are the options that you want to pass to the compiler or linker.
  • include-directories: The include-directories are the directories that contain the header files that you need to compile the code.
  • libraries: The libraries are the libraries that you need to link the code.
  • clean: The clean option removes all of the intermediate files that are created during the build process.
  • help: The help option displays help information for the make command.

For more information on the make command and its parameters, please refer to the make manual: https://www.gnu.org/software/make/manual/make.html

Here are some examples of how to use the make command:

  • To build a target called my_target, you would run the following command:
make my_target
  • To set the variable VAR to the value VALUE, you would run the following command:
make VAR=VALUE
  • To pass the flag -O2 to the compiler, you would run the following command:
make CFLAGS="-O2"
  • To include the directory /usr/include in the search path for header files, you would run the following command:
make INCLUDE_DIRS="/usr/include"
  • To link the library libmylib.so, you would run the following command:
make LIBS="-lmylib"
  • To remove all of the intermediate files that are created during the build process, you would run the following command:
make clean
  • To display help information for the make command, you would run the following command:
make help

Grammar

A makefile is a text file that describes the build process for a project. It is a simple language that is used to define targets, dependencies, and rules.

The basic syntax of a makefile is as follows:

target: dependencies
  rule

The target is the name of the file or target that you want to build.

The dependencies are the files or targets that the target depends on.

The rule is the command that is used to build the target.

Here is an example of a makefile:

my_target: my_source.c
  gcc -c my_source.c -o my_target

This makefile defines a target called my_target. The my_target target depends on the my_source.c source file. The my_target target is built by using the gcc command to compile the my_source.c file.

You can also define custom functions in a makefile. A custom function is a block of code that can be called from other parts of the makefile.

To define a custom function, you use the define keyword.

Here is an example of a custom function:

define my_function
  echo "This is my function"
endef

This function simply prints the string “This is my function”.

You can call a custom function by using the call keyword.

Here is an example of how to call a custom function:

call my_function

This will call the my_function function and print the string “This is my function”.

Here is an example of how to define a custom function and call it:

define my_function
  echo "This is my function"
endef

my_target:
  call my_function

This makefile defines a custom function called my_function and a target called my_target. The my_target target calls the my_function function.

function

Here are some of the most common built-in functions in makefile:

  • define: This function is used to define a custom function.
  • endef: This function is used to end the definition of a custom function.
  • ifeq: This function is used to compare two values and return a true or false value.
  • else: This function is used to execute a block of code if the ifeq function returns false.
  • endif: This function is used to end the ifeq statement.
  • foreach: This function is used to iterate over a list of values.
  • in: This function is used to check if a value is in a list.
  • shell: This function is used to execute a shell command.
  • patsubst: This function is used to substitute patterns in a string.
  • subst: This function is used to substitute a string in a string.
  • origin: This function is used to get the original value of a variable.

For more information on makefile built-in functions, please refer to the make manual: https://www.gnu.org/software/make/manual/make.html

Here are some examples of how to use makefile built-in functions:

  • To define a custom function called my_function that prints the string “This is my function”:
define my_function
  echo "This is my function"
endef
  • To check if the variable VAR is equal to the value VALUE:
ifeq ($(VAR),$(VALUE))
  echo "The variables are equal"
else
  echo "The variables are not equal"
endif
  • To iterate over the list of values a, b, and c:
foreach VARIABLE $(a b c)
  echo "The value of VARIABLE is $(VARIABLE)"
endforeach
  • To check if the string str contains the pattern abc:
if instr $(str),abc
  echo "The string contains the pattern abc"
else
  echo "The string does not contain the pattern abc"
endif