===== Using make ===== ==== Overview ==== ''%%make%%'' is a tool that is used to automate the building of complex applications. Specifically, it uses the information in a ''%%makefile%%'' to "automatically" compile, link, etc... the parts of a complex application. A makefile contains a list of targets (i.e., source files, object files, and executables), dependents (i.e., the files that a target depends on), and commands/recipes (i.e., what needs to be done if the target does not exist, if the target has an earlier time stamp than a dependent, or if the target is actually a "pseudotarget" without an associated file) ==== Syntax ==== The make command has the following syntax: | **make** [**-**//option...//] | where //option// denotes an option or switch (see below). ==== Options ==== The list of valid options/switches for the make command includes the following: ^Option^Purpose^ |A|Build all evaluated targets| |B|Build if times stamps are equal| |C|Suppress output messages| |f//makefile//|Use the given makefile| |N|Display commands but do not execute them| ==== The makefile ==== makefiles are normally named ''%%makefile%%''. They typically contain 2 (or more) lines for each target. The first line contains the target, a colon, and the dependents (delimited by spaces). The second line contains a tab character and the command/recipe that should be used to create the target. === Targets === A target is a valid file name or directory name. A target cannot contain more than 256 characters but it can contain path information. Multiple targets can be specified in the same dependency line; separate them using spaces or tabs. === Dependents === A dependent is a valid file name. It can contain path information. Multiple dependents can be specified in the same dependency line; seperate them using spaces or tabs. Of course, a dependent can also be a target elsewhere in the makefile. The make command will update dependents that are targets first. However, some care needs to be taken when creating makefiles. Note: To split a "long" line, use the backslash (i.e., the \ character) after a dependent. === Example === The following makefile has 3 description blocks. test: test.o module1.o g++ test.o module1.o -o test test.o: test.c module1.h g++ -c test.c module1.o: module1.h module1.c g++ -c module1.c The first description block says that the target ''%%test%%'' depends on two files, ''%%test.o%%'' and ''%%module1.o%%''. If ''%%test%%'' has an earlier time stamp than either of these files, ''%%test%%'' should be rebuilt using the [[student:c:gpp | g++ compiler]]. The second description block says that ''%%test.o%%'' depends on ''%%test.c%%'' and ''%%module1.h%%'' (because ''%%test.c%%''''%%#include%%''s ''%%module1.h%%''), and that it can be created with the [[student:c:gpp | g++ compiler]]. The third description block says that ''%%module1.o%%'' depends on ''%%module1.h%%'' (which contains the declarations) and ''%%module1.c%%'' (which contains the implemntations), and that it can be created with the [[student:c:gpp | g++ compiler]]. Assuming that this makefile is named ''%%makefile%%'', the application ''%%test%%'' can be built with the following command: make === Processing === ''%%make%%'' starts with the first target (''%%test%%'' in the example above). But, before it executes the command/recipe for this target it checks to see if any of the dependents (''%%test.o%%'' and ''%%module1.o%%'' in the example above) are, themselves, targets (which both are in the example above). It then treats the processing of each such dependent as a prerequisite to the processing of the current target. Of course, the same process is applied to each prerequisite. === Predefined Rules === The make command uses a number of predefined/implicit [[ http://www.gnu.org/software/make/manual/html_chapter/make_10.html#SEC105 | rules ]] that can greatly simplify makefiles. For example, ''%%.o%%'' files will automatically be created from ''%%.c%%'' or ''%%.cpp%%'' files using the GCC. While you are still learning to use the make command you should not make use of these predefined rules. === Using Variables in Place of Literals === Since one often needs to compile/link using different options at different times, people often use variables in place of literals. For example: CC = cc -pedantic -Wall -ansi $(CC) -c example.c -o example.o is equivalent to: cc -pedantic -Wall -ansi -c example.c -o example.o You could also accomplish the same thing as follows: CFLAGS = -pedantic -Wall -ansi cc $(CFLAGS) -c example.c -o example.o ==== Error and Warning Messages ==== To get a description of an error or warning message, see the comprehensive list of [[ http://www.gnu.org/software/make/manual/make.html#Error-Messages | errors generated by make ]]. ==== More Information ==== For more information, see the [[ http://www.gnu.org/software/make/manual/make.html | GNU Make Manual ]].