Makefile 中:= ?= += =的區別

   
遇到的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 *.o

問題:

1、“=” 與“:=”的區別

2、export

答案:

   1、“=”

      make會將整個makefile展開後,再決定變量的值。也就是說,變量的值將會是整個makefile中最後被指定的值。看例子:

            x = foo
            y = $(x) bar
            x = xyz

      在上例中,y的值將會是 xyz bar ,而不是 foo bar 。

      2、“:=”

      “:=”表示變量的值決定於它在makefile中的位置,而不是整個makefile展開後的最終值。

            x := foo
            y := $(x) bar
            x := xyz

      在上例中,y的值將會是 foo bar ,而不是 xyz bar 了。


2、export行是shell命令;對每一行shell命令,make將啓動一個新的進程執行這行shell命令。由於新啓動的子 進程的環境變量完全跟父進程不相干,因此export並不能改變父進程的環境變量,進而也不能改變父進程以後啓動的子進程,或曰“弟弟進程”的環境變量


最後:

還是對makefile裏的變量的傳遞及系統環境變量的知識有些疑問!

發佈了10 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章