編譯60個小程序之makefile

公司有個任務需要編譯60個c語言小程序,工程目錄結構爲:
src:放所有小程序源文件.c
drv:所有小程序編譯後都爲對應.drv
其它頭文件、庫目錄省略。

makefile不太熟,也很菜,我第一想法是用for循環進行循環編譯,還用到了makefile自定義函數,貼代碼:

CC = arm-linux-gcc

CFLAGS +=-Wall -O -D_REENTRANT -fpic -shared
LDFLAGS += -L./lib -lutility -lcrc -lmxml -lserial -lsocket -lpthread

ROOT_DIR = $(shell pwd)
SRC_DIR = ./src
DRV_DIR = ./drv
#src/*.c 
SRC := $(wildcard ${SRC_DIR}/*.c) 
SRC1 := $(notdir $(SRC))
ALL_NAME := $(basename ${SRC1})

#自定義了一個compile_file函數
define compile_file
        $(CC) $(CFLAGS) -o $1 $2 $(LDFLAGS)
endef

default:
        for name in $(ALL_NAME); do \
#這裏調用自定義函數,傳輸兩個參數:一個drv/xx.drv,一個src/xx.c
        ${call compile_file, $(DRV_DIR)/$$name.drv, $(SRC_DIR)/$$name.c}; done

clean:
        rm -f $(DRV_DIR)/*.drv

編譯的效果是將所有的小程序都編譯一遍,不管有沒有出錯,不管是否爲最新。我需要的效果是編譯所有程序,編譯到哪一個出錯即停止,編譯前還要檢查目標文件和源文件的更新時間,因此這個makefile不好用,只是學習了一下makefile的循環和自定義函數。

然後又構思makefile該如何寫,就在思考的過程中想起來了學裸機程序時工程有一個.S和一個.c文件的編譯,再結合makefile的僞目標,結構就很清晰了,這裏用一個變量ALL_NAME表示獲取到的所有src目錄下的.c文件的名字替換爲.drv(去除src/目錄名和.c後綴,再補上drv/和.drv後綴,形式爲drv/xxx.drv),代碼忘了拷,貼部分自己能記住的吧:

.PHONY:default clean

default:$(ALL_NAME)

$(DRV_DIR)/%.drv:$(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)

clean:
    rm $(DRV_DIR)/*.drv -r

這個makefile就能滿足之前的要求了。通過兩個makefile的編寫,學習了makefile的函數、自定義函數、循環、僞目標、makefile規則與shell規則的混合問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章