在常見的程式設計語言中,使用條件控制結構諸如if ... else if ... else...是很尋常的事情,那麼在GNU Makefile中如何使用呢?
- ifeq
- ifneq
例如:foo.sh
1 #!/bin/bash
2
3 ARCH=$(uname -p)
4 if [[ $ARCH == "x86_64" ]]; then
5 ARCH32="i686"
6 ARCH64="x86_64"
7 elif [[ $ARCH == "ppc64le" ]]; then
8 ARCH32=""
9 ARCH64="ppc64le"
10 else
11 ARCH32=$ARCH
12 ARCH64=""
13 fi
14
15 if [[ -n $ARCH32 ]]; then
16 OUTPUT+=" ARCH32=$ARCH32"
17 fi
18
19 if [[ -n $ARCH64 ]]; then
20 OUTPUT+=" ARCH64=$ARCH64"
21 fi
22
23 echo $OUTPUT
将上述的foo.sh用Makefile實作就是:
1 ARCH = $(shell uname -p)
2
3 ifeq ($(ARCH), x86_64)
4 ARCH32 = i686
5 ARCH64 = x86_64
6 else ifeq ($(ARCH), ppc64le)
7 ARCH32 =
8 ARCH64 = ppc64le
9 else
10 ARCH32 = $(ARCH)
11 ARCH64 =
12 endif
13
14 ifneq ($(ARCH32), )
15 OUTPUT += ARCH32=$(ARCH32)
16 endif
17
18 ifneq ($(ARCH64), )
19 OUTPUT += ARCH64=$(ARCH64)
20 endif
21
22 all: foo
23 foo:
24 @echo $(OUTPUT)
運作foo.sh 和 Makefile 結果如下:
$ uname -p
x86_64
$ bash foo.sh
ARCH32=i686 ARCH64=x86_64
$ make -f Makefile
ARCH32=i686 ARCH64=x86_64
由此可見,
- ifeq($(VAR), ) 等價于bash中的 [[ -z $VAR ]]
- ifneq($(VAR), ) 等價于bash中的 [[ -n $VAR ]]
那麼,在GNU Makefile中使用條件控制結構有什麼用?很簡單,對不同的平台提供不同的編譯選項或者安裝包支援。例如:
- 一個針對不同的平台提供不同的安裝包的Makefile
1 ARCH = $(shell uname -p)
2
3 ifeq ($(ARCH), x86_64)
4 ARCH32 = i686
5 ARCH64 = x86_64
6 else ifeq ($(ARCH), ppc64)
7 ARCH32 =
8 ARCH64 = ppc64
9 else ifeq ($(ARCH), ppc64le)
10 ARCH32 =
11 ARCH64 = ppc64le
12 else ifeq ($(ARCH), s390x)
13 ARCH32 =
14 ARCH64 = s390x
15 else ifeq ($(ARCH), aarch64)
16 ARCH32 =
17 ARCH64 = aarch64
18 else
19 ARCH32 = $(ARCH)
20 ARCH64 =
21 endif
22
23 ifneq ($(ARCH32), )
24 CPKGS32 = libgcc.$(ARCH32)
25 CPKGS32 += glibc.$(ARCH32)
26 endif
27 ifneq ($(ARCH64), )
28 CPKGS64 = libgcc.$(ARCH64)
29 CPKGS64 += glibc.$(ARCH64)
30 endif
31 CPKGS = $(CPKGS32) $(CPKGS64)
32
33 all: foo
34 foo:
35 @echo $(CPKGS)
參考資料:
- 7.2 Syntax of Conditionals