| | 1 | = Basics of Makefile = |
| | 2 | [[http://en.wikipedia.org/wiki/Make_(software)|Wiki]] |
| | 3 | |
| | 4 | == !Subprogram/Module/Class == |
| | 5 | * functions can be defined in separated files. |
| | 6 | * subprogram/module (Fortran, C...) |
| | 7 | * class (C++, python, Objective-C,Java...) |
| | 8 | * subprogram/module/class is defined for some specific purpose. one can use it without looking in the detail, just know what inputs and outputs / functions... |
| | 9 | * C module |
| | 10 | * .c files: source code / functions |
| | 11 | * .h files: header files, define functions and etc... |
| | 12 | |
| | 13 | == Makefile == |
| | 14 | * A common way of automating software builds and other complex tasks with dependencies. |
| | 15 | * A Makefile is itself a program in a special language. |
| | 16 | * The command 'make' reads 'Makefile' and do some tasks. |
| | 17 | * Can specify file name 'make -f mymakefile'. |
| | 18 | * The default name is "Makefile" |
| | 19 | |
| | 20 | == Structure of Makefile == |
| | 21 | Typical element in the simple Makefile: |
| | 22 | |
| | 23 | {{{ |
| | 24 | target: dependencies |
| | 25 | [TAB] command to make target |
| | 26 | }}} |
| | 27 | |
| | 28 | It is important to use tab character, not spaces. |
| | 29 | |
| | 30 | command 'make target' means: |
| | 31 | * Make sure all the dependencies are up to date |
| | 32 | * If target is older than any dependency, recreate it using the specified commands. |
| | 33 | |
| | 34 | For example: |
| | 35 | {{{#!make |
| | 36 | # |
| | 37 | # Large Scale Computing |
| | 38 | # Heat / Mass Transfer |
| | 39 | # |
| | 40 | ALL: ex20 ex21 |
| | 41 | # |
| | 42 | CC = gcc |
| | 43 | CFLAGS = -g |
| | 44 | # |
| | 45 | SRC_EX20 = ex20.c cg.c |
| | 46 | SRC_EX21 = ex21.c cg.c |
| | 47 | # |
| | 48 | OBJ_EX20 = $(SRC_EX20:.c=.o) |
| | 49 | OBJ_EX21 = $(SRC_EX21:.c=.o) |
| | 50 | # |
| | 51 | ex20 : $(OBJ_EX20) |
| | 52 | $(CC) $(CFLAGS) -o $@ $(OBJ_EX20) |
| | 53 | |
| | 54 | ex21 : $(OBJ_EX21) |
| | 55 | $(CC) $(CFLAGS) -o $@ $(OBJ_EX21) |
| | 56 | # |
| | 57 | %.o : %.c |
| | 58 | $(CC) $(CFLAGS) -c $< |
| | 59 | cg.o : cg.c cg.h |
| | 60 | $(CC) $(CFLAGS) -c cg.c |
| | 61 | clean: |
| | 62 | rm -f *.o ex20 |
| | 63 | }}} |
| | 64 | lines begin with # is comments |
| | 65 | |
| | 66 | == Age of dependency == |
| | 67 | The last modification time of the file is used. |
| | 68 | {{{ |
| | 69 | $ ls -l |
| | 70 | -rw-r--r-- 1 fuji staff 388 Sep 21 22:37 Makefile |
| | 71 | -rw-r--r-- 1 fuji staff 2030 Sep 21 19:31 cg.c |
| | 72 | -rw-r--r-- 1 fuji staff 838 Sep 21 19:31 cg.h |
| | 73 | -rw-r--r-- 1 fuji staff 4768 Sep 21 22:37 cg.o |
| | 74 | -rwxr-xr-x 1 fuji staff 13308 Sep 22 09:44 ex20 |
| | 75 | -rw-r--r-- 1 fuji staff 3035 Sep 21 22:39 ex20.c |
| | 76 | -rw-r--r-- 1 fuji staff 7728 Sep 22 09:44 ex20.o |
| | 77 | }}} |
| | 78 | * '''cg.c''' and '''cg.h''' to generate '''cg.o''' |
| | 79 | * '''ex20.c''' to generate '''ex20.o''' |
| | 80 | * '''ex20.o''' and '''cg.o''' to generate '''ex20''' |
| | 81 | Since all target files are newer than dependencies, |
| | 82 | |
| | 83 | {{{ |
| | 84 | $ make |
| | 85 | make: Nothing to be done for `ALL'. |
| | 86 | }}} |
| | 87 | |
| | 88 | '''make''' command does not do anything. |
| | 89 | |
| | 90 | {{{ |
| | 91 | $ touch cg.h |
| | 92 | $ ls -l |
| | 93 | -rw-r--r-- 1 fuji staff 388 Sep 21 22:37 Makefile |
| | 94 | -rw-r--r-- 1 fuji staff 2030 Sep 21 19:31 cg.c |
| | 95 | -rw-r--r-- 1 fuji staff 838 Sep 22 09:51 cg.h |
| | 96 | -rw-r--r-- 1 fuji staff 4768 Sep 21 22:37 cg.o |
| | 97 | -rwxr-xr-x 1 fuji staff 13308 Sep 22 09:44 ex20 |
| | 98 | -rw-r--r-- 1 fuji staff 3035 Sep 21 22:39 ex20.c |
| | 99 | -rw-r--r-- 1 fuji staff 7728 Sep 22 09:44 ex20.o |
| | 100 | }}} |
| | 101 | |
| | 102 | Now '''cg.h''' is newer than '''cg.o''', |
| | 103 | {{{ |
| | 104 | $ make |
| | 105 | gcc -g -c cg.c |
| | 106 | gcc -g -o ex20 ex20.o cg.o |
| | 107 | }}} |
| | 108 | '''make''' command generates '''cg.o''' then generates '''ex20'''. |
| | 109 | |
| | 110 | |
| | 111 | == implicit rules == |
| | 112 | General rule to make the *.o files from *.c files: |
| | 113 | {{{ |
| | 114 | %.o : %.c %.h |
| | 115 | gcc -c $< |
| | 116 | }}} |
| | 117 | To make target |
| | 118 | {{{ |
| | 119 | ex20 : $(OBJ_EX20) |
| | 120 | gcc -o $@ $(OBJ_EX20) |
| | 121 | }}} |
| | 122 | == variables / macros == |
| | 123 | {{{#!make |
| | 124 | CC = gcc |
| | 125 | CFLAGS = -g |
| | 126 | # |
| | 127 | SRC_EX20 = ex20.c cg.c |
| | 128 | SRC_EX21 = ex21.c cg.c |
| | 129 | # |
| | 130 | OBJ_EX20 = $(SRC_EX20:.c=.o) |
| | 131 | OBJ_EX21 = $(SRC_EX21:.c=.o) |
| | 132 | }}} |
| | 133 | |
| | 134 | [[http://www.gnu.org/software/make/manual/make.html|GNU make web pape]] |