遇到的makefile:
CC = arm-Linux-gcc
LD = arm-linux-ld
AR = arm-linux-ar
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump
INCLUDEDIR := $(shell pwd)/include
CFLAGS := -Wall -Os -fno-builtin-printf
CPPFLAGS := -nostdinc -I$(INCLUDEDIR)
export CC AR LD OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS
objs := start.o main.o uart.o clock.o lib/libc.a
uart.bin: $(objs)
${LD} -Tuart.lds -o uart.elf $^
${OBJCOPY} -O binary -S uart.elf $@
${OBJDUMP} -D uart.elf > uart.dis
.PHONY : lib/libc.a
lib/libc.a:
cd lib; make; cd ..
%.o:%.c
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
%.o:%.S
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
clean:
make clean -C lib
rm -f uart.bin uart.elf uart.dis *.olinux
問題:shell
一、「=」 與「:=」的區別ui
二、export.net
答案:進程
一、「=」get
make會將整個makefile展開後,再決定變量的值。也就是說,變量的值將會是整個makefile中最後被指定的值。看例子:it
x = foo
y = $(x) bar
x = xyzclass
在上例中,y的值將會是 xyz bar ,而不是 foo bar 。變量
二、「:=」gcc
「:=」表示變量的值決定於它在makefile中的位置,而不是整個makefile展開後的最終值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值將會是 foo bar ,而不是 xyz bar 了。
二、export行是shell命令;對每一行shell命令,make將啓動一個新的進程執行這行shell命令。因爲新啓動的子 進程的環境變量徹底跟父進程不相干,所以export並不能改變父進程的環境變量,進而也不能改變父進程之後啓動的子進程,或曰「弟弟進程」的環境變量