GNU Make 是一個工具程式, 經由讀取 Makefile 或者是 makefile 的檔案(也可以使用 -f 指定),自動化建構軟體。 Makefile 是由很多相依性項目(dependencies)和規則(rules)所組成。
GNU Makefile 可以在各個程式語言使用,而不僅限於 C 或者是 C++。
不過因為通常是使用 C 或者是 C++,所以接下來使用 C 作為例子,考慮一個簡單的程式 hello.c:
void say(const char *name);
int main() {
say("Orange");
return 0;
}
以及 say procedure 的實作:
#include <stdio.h>
void say(const char *name) { printf("Hello, %s.\n", name); }
那麼在命令列編譯的指令如下:
gcc hello.c say.c -o hello
Makefile 的規則如下:
target [target ...]: [component ...]
Tab ↹[command 1]
.
.
.
Tab ↹[command n]
Makefile 支援 Suffix rules,例子如下:
.SUFFIXES: .txt .html
# From .html to .txt
.html.txt:
lynx -dump $< > $@
Makefile 支援 Pattern rules,例子如下:
# From %.html to %.txt
%.txt : %.html
lynx -dump $< > $@
其中 $@ 或者是 $<, $^, $? 都是 Makefile 的巨集。$@ 代表工作目標的完整檔案名稱,$< 代表觸發建制目標的檔案名稱。 $^ 代表所有的依賴檔案,並以空格隔開這些檔名。$? 代表比目標還要新的依賴檔案列表。而 $* 代表工作目標的主檔名(也就是不包含副檔名)。
撰寫一個 Makefile 如下:
CC = /usr/bin/gcc
CFLAGS= -O2 -Wall
PROGRAM = hello
SRCS := $(wildcard *.c)
OBJS := $(patsubst %.c,%.o,$(SRCS))
RM = rm
all: $(PROGRAM)
$(PROGRAM): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $@
%.o : %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(PROGRAM) *.o
.PHONY: all clean
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。