ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          下面是定義變量的一般方法:
            VARNAME=some_text [...]
          把變量用括號起來,并在前面加上"$"符號,就可以引用變量的值:
            $(VARNAME)
          變量一般都在makefile的頭部定義,并且,按照慣例,所有的makefile變量都應該大寫.

          在makefile中使用變量
          OBJS = howdy.o helper.o
          HDRS = helper.h
          howdy: $(OBJS) $(HDRS)
              gcc $(OBJS) -o howdy
          helper.o: helper.c $(HDRS)
              gcc -c helper.c
          howdy.o: howdy.c
              gcc -c howdy.c
          hello: hello.c
              gcc hello.c -o hello
          all: howdy hello
          clean:
              rm howdy hello *.o

          make使用兩種變量:遞歸展開變量和簡單展開變量.遞歸展開變量在引用時逐層展開,即如果在展開式中包含了對其他變量的引用,則這些變量也將被展開,直到沒有需要展開的變量為止,這就是所謂的遞歸展開.

          考慮下面的變量定義:
            CC = gcc
            CC = $(CC) -o
          CC在被引用時遞歸展開,從而陷入一個無限循環中:CC將展開為$(CC)的值,從而永遠也讀不到-o選項.

          為了避免這個問題,可以使用簡單展開變量.與遞歸展開變量在引用時展開不同,簡單展開變量在定義處展開,并且只展開一次,從而取消了變量的嵌套引用.在定義時,其語法與遞歸展開變量有細微的不同:
            CC := gcc -o
            CC += -O2
          第一個定義使用":="設置CC的值為gcc -o, 第二個定義使用"+="在前面定義的CC后附加了-O2,從而CC最終的值是gcc -o -O2.

          除用戶定義變量外,make也允許使用環境變量,自動變量和預定義變量.使用環境變量非常簡單.在啟動時,make讀取已定義的環境變量,并且創建與之同名同值的變量.但是,如果makefile中有同名的變量,則這個變量將取代與之相應的環境變量,所以應當注意這一點.

                                          自動變量
          變量                          說明
          $@                            規則的目標所對應的文件名
          $<                            規則中的第一個相關文件名
          $^                            規則中所有相關文件的列表,以空格為分界符
          $?                            規則中日期新于目標的所有相關文件的列表,以空格為分隔符
          $(@D)                       目標文件的目錄部分(如果目標在子目錄中)
          $(@F)                       目標文件的文件名部分(如果目標在子目錄中)

                            用于文件名和標志的預定義變量
          變量                     說明
          AR                       歸檔維護程序,默認值=ar
          AS                       匯編程序,默認值=as
          CC                       C編譯程序,默認值=cc
          CPP                       C預處理程序,默認值= cpp
          RM                       文件刪除程序,默認值="rm -f"
          ARFLAGS                   傳給歸檔維護程序的標志,默認值=rv
          ASFLAGS                   傳給匯編程序的標志,沒有默認值
          CFLAGS                   傳給C編譯器的標志,沒有默認值
          CPPFLAGS                 傳給C預處理程序的標志,沒有默認值
          LDFLAGS                   傳給鏈接程序(ld)的標志,沒有默認值
          posted on 2005-08-04 21:54 ivaneeo 閱讀(281) 評論(0)  編輯  收藏 所屬分類: GNU牛力
          主站蜘蛛池模板: 凤翔县| 桃园市| 海伦市| 贡觉县| 遂川县| 青龙| 如皋市| 高要市| 上林县| 松江区| 远安县| 遂宁市| 自贡市| 林州市| 泌阳县| 宿松县| 平阳县| 涞水县| 五寨县| 祥云县| 平舆县| 和顺县| 绥德县| 长沙县| 南京市| 冕宁县| 江西省| 阳高县| 陆丰市| 阿图什市| 米易县| 岳普湖县| 南雄市| 富裕县| 崇州市| 威宁| 长治市| 元江| 德格县| 甘谷县| 那曲县|