makefile這樣寫:bash
ifdef DEBUG CFLAGS += -DDEBUG=1 -O0 -ggdb RELMODE = debug else CFLAGS += -DDEBUG=0 -O0 -s RELMODE = release endif
編譯能夠這樣:spa
make DEBUG=1
#能夠用命令行傳遞變量
RELEASE = abc
#ifdef 變量名稱不能加$()
ifdef RELEASE
$(warning RELEASE defined)
else
$(warning RELEASE not defined)
endif
#ifeq 後面參數要叫$(), 由於是值引用, 值能夠爲數值或字符串
ifeq ($(RELEASE),abc)
$(warning RELEASE eqal abc)
else
$(warning RELEASE not equal abc)
endif
all:
@echo ok!
**************************************************
make 編譯不一樣版本,例如debug, release 的簡單示例。
用make 變量ver, 控制CFLAGS 變量,從而編譯出不一樣版本。
[/pts/2@hjj ~/test]$ cat test.c
#include <stdio.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
char *tty=ttyname(0);
printf("tty is %s\n",tty);
return 0;
}
[/pts/2@hjj ~/test]$ cat Makefile
CC = gcc
TARGET = test
OBJS = test.o
ifeq ($(ver), debug)
$(warning ver is debug)
CFLAGS = -g -Ddebug
else
$(warning ver is not debug)
CFLAGS = -c -O3
endif
$(TARGET): $(OBJS)
$(CC) -o $@ $^
clean:
rm test test.o
註釋: makefile 採用了ifeq-else-endif 結構
能夠判別莫個make變量是否認義。
make變量能夠在makefile中定義,也能夠由make命令行傳遞。
因爲makefile 支持環境變量,因此你預先定義了環境變量,也能夠不在命令行中傳遞而直接使用環境變量
這種機制使得編寫腳本控制不一樣的複雜的編譯成爲可能,
例如支持各類地域的不一樣的版本。用地域變量,控制make的編譯選項/D,控制編譯出不一樣的版本
----------------------------------------
編譯debug 版本, 從命令行傳遞變量
----------------------------------------
[/pts/2@hjj ~/test]$ make ver=debug
Makefile:6: ver is debug
gcc -g -Ddebug -c -o test.o test.c
gcc -o test test.o
----------------------------------------
清理,無所謂版本信息
----------------------------------------
[/pts/2@hjj ~/test]$ make clean
Makefile:9: ver is not debug
rm test test.o
----------------------------------------
編譯release 版本
----------------------------------------
[/pts/2@hjj ~/test]$ make
Makefile:9: ver is not debug
gcc -c -O3 -c -o test.o test.c
gcc -o test test.o
.net
**************************************************命令行
有時候,咱們仍是須要讓make命令帶入一些參數給makefile腳本。 好比,你在代碼裏面須要定義一個宏DEBUG來打開調試開關,代碼以下:int main(){int i=9;#ifdef DEBUGi=1;#elsei=0;#endifprintf("i=%d\n", i);return 0;}通常來講,這個宏定義能夠經過直接修改源代碼進行,但這樣顯然不是很好的辦法。另一個辦法是經過makefile修改,好比: CFLAGS=-g -Wall -DDEBUG object=myprog all:$objectmyprog:a.c gcc ${CFLAGS} a.c -o ${object} 若是更進一步,連makefile都不想修改,咱們能夠經過向make命令傳遞參數來進行,爲此,咱們須要適當的修改makefile以下: CFLAGS=CFLAG CFLAGS+=-g -Wall -DDEBUG object=myprog all:$objectmyprog:a.c gcc ${CFLAGS} a.c -o ${object} 此時,若是想打開DEBUG宏,咱們能夠這樣輸入make命令: [ychq@ICM3-2 net]$ make CFLAG=-DDEBUG gcc -g -Wall -DDEBUG a.c a.c: In function `main': a.c:9: warning: implicit declaration of function `printf' [ychq@ICM3-2 net]$ 咱們能夠發現,DEBUG宏已經被正確的傳入。 更進一步的,咱們能夠經過傳遞不一樣的參數給make,讓make編譯不一樣的模塊。