makefile 的 ifdef, ifeq 使用及辨析

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編譯不一樣的模塊。
相關文章
相關標籤/搜索